New resource view: ReplicationController -- scaffolding files

Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
Roman committed 2023-02-13 13:02:38 +02:00
1 parent 5d21db9fc2
commit 1ceaf3452a
18 files changed
+404 -34

No files matched your search

@@ -0,0 +1,20 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import replicationControllersRouteInjectable from "./replicationcontrollers-route.injectable";
import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token";
const navigateToReplicationControllersInjectable = getInjectable({
id: "navigate-to-replicationcontrollers",
instantiate: (di) => {
const navigateToRoute = di.inject(navigateToRouteInjectionToken);
const route = di.inject(replicationControllersRouteInjectable);
return () => navigateToRoute(route);
},
});
export default navigateToReplicationControllersInjectable;
@@ -0,0 +1,24 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { shouldShowResourceInjectionToken } from "../../../../../cluster-store/allowed-resources-injection-token";
import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const replicationControllersRouteInjectable = getInjectable({
id: "replicationcontrollers-route",
instantiate: (di) => ({
path: "/replicationcontrollers",
clusterFrame: true,
isEnabled: di.inject(shouldShowResourceInjectionToken, {
apiName: "replicationcontrollers",
group: "", // core
}),
}),
injectionToken: frontEndRouteInjectionToken,
});
export default replicationControllersRouteInjectable;
@@ -33,6 +33,7 @@ export * from "./pod-metrics.api";
export * from "./pod-security-policy.api";
export * from "./priority-class.api";
export * from "./replica-set.api";
export * from "./replication-controller.api";
export * from "./resource-quota.api";
export * from "./role.api";
export * from "./role-binding.api";
@@ -0,0 +1,23 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { kubeApiInjectionToken } from "../kube-api/kube-api-injection-token";
import loggerInjectable from "../../logger.injectable";
import maybeKubeApiInjectable from "../maybe-kube-api.injectable";
import { ReplicationControllerApi } from "./replication-controller.api";
const replicationControllerApiInjectable = getInjectable({
id: "replication-controller-api",
instantiate: (di) => {
return new ReplicationControllerApi({
logger: di.inject(loggerInjectable),
maybeKubeApi: di.inject(maybeKubeApiInjectable),
});
},
injectionToken: kubeApiInjectionToken,
});
export default replicationControllerApiInjectable;
@@ -0,0 +1,34 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { DerivedKubeApiOptions, KubeApiDependencies } from "../kube-api";
import { KubeApi } from "../kube-api";
import type { KubeObjectStatus, NamespaceScopedMetadata } from "../kube-object";
import { KubeObject } from "../kube-object";
export class ReplicationControllerApi extends KubeApi<ReplicationController> {
constructor(deps: KubeApiDependencies, opts?: DerivedKubeApiOptions) {
super(deps, {
...opts ?? {},
objectConstructor: ReplicationController,
});
}
}
export interface ReplicationControllerSpec {
}
export interface ReplicationControllerStatus extends KubeObjectStatus {
}
export class ReplicationController extends KubeObject<
NamespaceScopedMetadata,
ReplicationControllerStatus,
ReplicationControllerSpec
> {
static kind = "ReplicationController";
static namespaced = true;
static apiBase = "/api/v1/replicationcontrollers";
}
+6 -1
View File
@@ -6,7 +6,7 @@
export type KubeResource =
"namespaces" | "nodes" | "events" | "resourcequotas" | "services" | "limitranges" | "leases" |
"secrets" | "configmaps" | "ingresses" | "ingressclasses" | "networkpolicies" | "persistentvolumeclaims" | "persistentvolumes" | "storageclasses" |
"pods" | "daemonsets" | "deployments" | "statefulsets" | "replicasets" | "jobs" | "cronjobs" |
"pods" | "daemonsets" | "deployments" | "statefulsets" | "replicasets" | "replicationcontrollers" | "jobs" | "cronjobs" |
"endpoints" | "customresourcedefinitions" | "horizontalpodautoscalers" | "verticalpodautoscalers" | "podsecuritypolicies" | "poddisruptionbudgets" |
"priorityclasses" | "runtimeclasses" |
"roles" | "clusterroles" | "rolebindings" | "clusterrolebindings" | "serviceaccounts";
@@ -171,6 +171,11 @@ export const apiResourceRecord: Record<KubeResource, KubeApiResourceData> = {
group: "apps",
namespaced: true,
},
replicationcontrollers: {
kind: "ReplicationController",
group: "", // core
namespaced: true,
},
roles: {
kind: "Role",
group: "rbac.authorization.k8s.io",
@@ -0,0 +1,7 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
export * from "./replicationcontrollers";
export * from "./replicationcontroller-details";
@@ -0,0 +1,24 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { ReplicationControllers } from "./replicationcontrollers";
import {
routeSpecificComponentInjectionToken
} from "../../routes/route-specific-component-injection-token";
import replicationControllersRouteInjectable
from "../../../common/front-end-routing/routes/cluster/workloads/replicationcontrollers/replicationcontrollers-route.injectable";
const replicationControllersRouteComponentInjectable = getInjectable({
id: "replicationcontroller-route-component",
instantiate: (di) => ({
route: di.inject(replicationControllersRouteInjectable),
Component: ReplicationControllers,
}),
injectionToken: routeSpecificComponentInjectionToken,
});
export default replicationControllersRouteComponentInjectable;
@@ -0,0 +1,7 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
.ReplicationControllerDetails {
}
@@ -0,0 +1,45 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import styles from "./replicationcontroller-details.module.scss";
import React from "react";
import { observer } from "mobx-react";
import { withInjectables } from "@ogre-tools/injectable-react";
import { DrawerItem } from "../drawer";
import { Badge } from "../badge";
import type { KubeObjectDetailsProps } from "../kube-object-details";
import type { ReplicationControllerStore } from "./replicationctrl-store";
import replicationControllerStoreInjectable from "./replicationctrl-store.injectable";
import type { ReplicationController } from "../../../common/k8s-api/endpoints";
export interface ReplicationControllerDetailsProps extends KubeObjectDetailsProps<ReplicationController> {
}
interface Dependencies {
store: ReplicationControllerStore;
}
@observer
class NonInjectedReplicationControllerDetails extends React.Component<ReplicationControllerDetailsProps & Dependencies> {
render() {
const { object: ctrl, store } = this.props;
return (
<div className={styles.ReplicationControllerDetails}>
<DrawerItem name="Some info" labelsOnly>
<p>Controller: {ctrl.getName()}</p>
<p>Items in store: <Badge label={store.items.length} /></p>
</DrawerItem>
</div>
);
}
}
export const ReplicationControllerDetails = withInjectables<Dependencies, ReplicationControllerDetailsProps>(NonInjectedReplicationControllerDetails, {
getProps: (di, props) => ({
...props,
store: di.inject(replicationControllerStoreInjectable),
}),
});
@@ -0,0 +1,8 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
.ReplicationControllers {
}
@@ -0,0 +1,80 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import styles from "./replicationcontrollers.module.scss";
import React from "react";
import { observer } from "mobx-react";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout";
import type { ReplicationControllerStore } from "./replicationctrl-store";
import type { EventStore } from "../+events/store";
import { withInjectables } from "@ogre-tools/injectable-react";
import eventStoreInjectable from "../+events/store.injectable";
import replicationControllerStoreInjectable from "./replicationctrl-store.injectable";
import { NamespaceSelectBadge } from "../+namespaces/namespace-select-badge";
enum columnId {
name = "name",
namespace = "namespace",
}
interface Dependencies {
store: ReplicationControllerStore;
eventStore: EventStore;
}
const NonInjectedReplicationControllers = observer((props: Dependencies) => {
const {
eventStore,
store,
} = props;
return (
<SiblingsInTabLayout>
<KubeObjectListLayout
isConfigurable
tableId="workload_replicationcontrollers"
className={styles.ReplicationControllers}
store={store}
dependentStores={[eventStore]} // status icon component uses event store
sortingCallbacks={{
[columnId.name]: replicaSet => replicaSet.getName(),
[columnId.namespace]: replicaSet => replicaSet.getNs(),
}}
searchFilters={[
replicaSet => replicaSet.getSearchFields(),
]}
renderHeaderTitle="Replica Sets"
renderTableHeader={[
{ title: "Name", className: "name", sortBy: columnId.name, id: columnId.name },
{ className: "warning", showWithColumn: columnId.name },
{
title: "Namespace",
className: "namespace",
sortBy: columnId.namespace,
id: columnId.namespace,
},
]}
renderTableContents={replicaSet => [
replicaSet.getName(),
<KubeObjectStatusIcon key="icon" object={replicaSet} />,
<NamespaceSelectBadge
key="namespace"
namespace={replicaSet.getNs()}
/>,
]}
/>
</SiblingsInTabLayout>
);
});
export const ReplicationControllers = withInjectables<Dependencies>(NonInjectedReplicationControllers, {
getProps: (di, props) => ({
...props,
eventStore: di.inject(eventStoreInjectable),
store: di.inject(replicationControllerStoreInjectable),
}),
});
@@ -0,0 +1,39 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx";
import { workloadsSidebarItemId } from "../+workloads/workloads-sidebar-items.injectable";
import { sidebarItemsInjectionToken } from "../layout/sidebar-items.injectable";
import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import replicationControllersRouteInjectable
from "../../../common/front-end-routing/routes/cluster/workloads/replicationcontrollers/replicationcontrollers-route.injectable";
import navigateToReplicationControllersInjectable
from "../../../common/front-end-routing/routes/cluster/workloads/replicationcontrollers/navigate-to-replication-controllers.injectable";
const replicationctrlSidebarItemsInjectable = getInjectable({
id: "replicationctrl-sidebar-items",
instantiate: (di) => {
const route = di.inject(replicationControllersRouteInjectable);
const navigateToReplicasets = di.inject(navigateToReplicationControllersInjectable);
const routeIsActive = di.inject(routeIsActiveInjectable, route);
return computed(() => [
{
id: "replication-controllers",
parentId: workloadsSidebarItemId,
title: "ReplicationControllers",
onClick: navigateToReplicasets,
isActive: routeIsActive,
isVisible: route.isEnabled,
orderNumber: 61,
},
]);
},
injectionToken: sidebarItemsInjectionToken,
});
export default replicationctrlSidebarItemsInjectable;
@@ -0,0 +1,26 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { kubeObjectStoreInjectionToken } from "../../../common/k8s-api/api-manager/kube-object-store-token";
import { ReplicationControllerStore } from "./replicationctrl-store";
import clusterFrameContextForNamespacedResourcesInjectable from "../../cluster-frame-context/for-namespaced-resources.injectable";
import loggerInjectable from "../../../common/logger.injectable";
import replicationControllerApiInjectable
from "../../../common/k8s-api/endpoints/replication-controller.api.injectable";
const replicationControllerStoreInjectable = getInjectable({
id: "replication-controller-store",
instantiate: (di) => {
const api = di.inject(replicationControllerApiInjectable);
return new ReplicationControllerStore({
context: di.inject(clusterFrameContextForNamespacedResourcesInjectable),
logger: di.inject(loggerInjectable),
}, api);
},
injectionToken: kubeObjectStoreInjectionToken,
});
export default replicationControllerStoreInjectable;
@@ -0,0 +1,23 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type {
ReplicationController,
ReplicationControllerApi
} from "../../../common/k8s-api/endpoints";
import type {
KubeObjectStoreDependencies,
KubeObjectStoreOptions
} from "../../../common/k8s-api/kube-object.store";
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
export interface ReplicationControllerStoreDependencies extends KubeObjectStoreDependencies {
}
export class ReplicationControllerStore extends KubeObjectStore<ReplicationController, ReplicationControllerApi> {
constructor(protected readonly dependencies: ReplicationControllerStoreDependencies, api: ReplicationControllerApi, opts?: KubeObjectStoreOptions) {
super(dependencies, api, opts);
}
}
@@ -0,0 +1,35 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
import { computed } from "mobx";
import {
kubeObjectMatchesToKindAndApiVersion
} from "../kube-object-matches-to-kind-and-api-version";
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
import { ReplicationControllerDetails } from "../../../+workloads-replicationcontrollers";
const replicationControllerDetailItemInjectable = getInjectable({
id: "replication-controller-detail-item",
instantiate(di) {
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
return {
Component: ReplicationControllerDetails,
enabled: computed(() => isReplicationController(kubeObject.value.get()?.object)),
orderNumber: 10,
};
},
injectionToken: kubeObjectDetailItemInjectionToken,
});
export const isReplicationController = kubeObjectMatchesToKindAndApiVersion(
"ReplicationController",
["v1"],
);
export default replicationControllerDetailItemInjectable;
+1
View File
@@ -27,6 +27,7 @@ export const ResourceNames: Record<KubeResource, string> = {
"deployments": "Deployments",
"statefulsets": "Stateful Sets",
"replicasets": "Replica Sets",
"replicationcontrollers": "Replication Controllers",
"jobs": "Jobs",
"cronjobs": "Cron Jobs",
"endpoints": "Endpoints",