1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Introduce competition for kubernetes preference tab

Co-authored-by: Mikko Aspiala <mikko.aspiala@gmail.com>

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
Janne Savolainen 2022-10-13 14:32:13 +03:00
parent 3c214c6635
commit cd3210ac59
No known key found for this signature in database
GPG Key ID: 8C6CFB2FFFE8F68A
16 changed files with 441 additions and 21 deletions

View File

@ -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 { HelmCharts } from "./helm-charts";
import { preferenceItemInjectionToken } from "../../../../preferences/renderer/preference-items/preference-item-injection-token";
const helmChartsPreferenceItemInjectable = getInjectable({
id: "helm-charts-preference-item",
instantiate: () => ({
kind: "item" as const,
id: "helm-charts",
parentId: "kubernetes-page",
orderNumber: 30,
Component: HelmCharts,
}),
injectionToken: preferenceItemInjectionToken,
});
export default helmChartsPreferenceItemInjectable;

View File

@ -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 { preferenceItemInjectionToken } from "../../preference-item-injection-token";
import { KubeconfigSync } from "./kubeconfig-sync";
const kubeconfigSyncPreferenceItemInjectable = getInjectable({
id: "kubeconfig-sync-preference-item",
instantiate: () => ({
kind: "item" as const,
id: "kubeconfig-sync",
parentId: "kubernetes-page",
orderNumber: 20,
Component: KubeconfigSync,
}),
injectionToken: preferenceItemInjectionToken,
});
export default kubeconfigSyncPreferenceItemInjectable;

View File

@ -7,17 +7,17 @@ import fse from "fs-extra";
import { computed, makeObservable, observable, reaction } from "mobx";
import { disposeOnUnmount, observer } from "mobx-react";
import React from "react";
import { Notice } from "../+extensions/notice";
import type { KubeconfigSyncEntry, KubeconfigSyncValue, UserStore } from "../../../common/user-store";
import { iter, tuple } from "../../utils";
import { SubTitle } from "../layout/sub-title";
import { PathPicker } from "../path-picker/path-picker";
import { Spinner } from "../spinner";
import { RemovableItem } from "./removable-item";
import userStoreInjectable from "../../../common/user-store/user-store.injectable";
import isWindowsInjectable from "../../../common/vars/is-windows.injectable";
import loggerInjectable from "../../../common/logger.injectable";
import type { Logger } from "../../../common/logger";
import { Notice } from "../../../../../../renderer/components/+extensions/notice";
import type { KubeconfigSyncEntry, KubeconfigSyncValue, UserStore } from "../../../../../../common/user-store";
import { iter, tuple } from "../../../../../../renderer/utils";
import { SubTitle } from "../../../../../../renderer/components/layout/sub-title";
import { PathPicker } from "../../../../../../renderer/components/path-picker/path-picker";
import { Spinner } from "../../../../../../renderer/components/spinner";
import { RemovableItem } from "../../../../../../renderer/components/+preferences/removable-item";
import userStoreInjectable from "../../../../../../common/user-store/user-store.injectable";
import isWindowsInjectable from "../../../../../../common/vars/is-windows.injectable";
import loggerInjectable from "../../../../../../common/logger.injectable";
import type { Logger } from "../../../../../../common/logger";
interface SyncInfo {
type: "file" | "folder" | "unknown";
@ -66,7 +66,7 @@ interface Dependencies {
}
@observer
class NonInjectedKubeconfigSyncs extends React.Component<Dependencies> {
class NonInjectedKubeconfigSync extends React.Component<Dependencies> {
syncs = observable.map<string, Value>();
@observable loaded = false;
@ -195,17 +195,19 @@ class NonInjectedKubeconfigSyncs extends React.Component<Dependencies> {
render() {
return (
<>
<section id="kube-sync">
<h2 data-testid="kubernetes-sync-header">Kubeconfig Syncs</h2>
{this.renderSyncButtons()}
<SubTitle title="Synced Items" className="pt-5"/>
{this.renderEntries()}
</>
</section>
);
}
}
export const KubeconfigSyncs = withInjectables<Dependencies>(
NonInjectedKubeconfigSyncs,
export const KubeconfigSync = withInjectables<Dependencies>(
NonInjectedKubeconfigSync,
{
getProps: (di) => ({

View File

@ -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 { preferenceItemInjectionToken } from "../../../preference-item-injection-token";
import { KubectlBinaryDownload } from "./kubectl-binary-download";
const kubectlBinaryDownloadPreferenceItemInjectable = getInjectable({
id: "kubectl-binary-download-preference-item",
instantiate: () => ({
kind: "item" as const,
id: "kubectl-binary-download",
parentId: "kubectl",
orderNumber: 10,
Component: KubectlBinaryDownload,
}),
injectionToken: preferenceItemInjectionToken,
});
export default kubectlBinaryDownloadPreferenceItemInjectable;

View File

@ -0,0 +1,38 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import React from "react";
import { SubTitle } from "../../../../../../../renderer/components/layout/sub-title";
import { withInjectables } from "@ogre-tools/injectable-react";
import type { UserStore } from "../../../../../../../common/user-store";
import userStoreInjectable from "../../../../../../../common/user-store/user-store.injectable";
import { observer } from "mobx-react";
import { Switch } from "../../../../../../../renderer/components/switch";
interface Dependencies {
userStore: UserStore;
}
const NonInjectedKubectlBinaryDownload = observer(({ userStore }: Dependencies) => (
<section>
<SubTitle title="Kubectl binary download" />
<Switch
checked={userStore.downloadKubectlBinaries}
onChange={() => userStore.downloadKubectlBinaries = !userStore.downloadKubectlBinaries}
>
Download kubectl binaries matching the Kubernetes cluster version
</Switch>
</section>
));
export const KubectlBinaryDownload = withInjectables<Dependencies>(
NonInjectedKubectlBinaryDownload,
{
getProps: (di) => ({
userStore: di.inject(userStoreInjectable),
}),
},
);

View File

@ -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 { preferenceItemInjectionToken } from "../../../preference-item-injection-token";
import { KubectlDirectoryForBinaries } from "./kubectl-directory-for-binaries";
const kubectlDirectoryForBinariesPreferenceItemInjectable = getInjectable({
id: "kubectl-directory-for-binaries-preference-item",
instantiate: () => ({
kind: "item" as const,
id: "kubectl-directory-for-binaries",
parentId: "kubectl",
orderNumber: 30,
Component: KubectlDirectoryForBinaries,
}),
injectionToken: preferenceItemInjectionToken,
});
export default kubectlDirectoryForBinariesPreferenceItemInjectable;

View File

@ -0,0 +1,55 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import React, { useState } from "react";
import { SubTitle } from "../../../../../../../renderer/components/layout/sub-title";
import { withInjectables } from "@ogre-tools/injectable-react";
import type { UserStore } from "../../../../../../../common/user-store";
import userStoreInjectable from "../../../../../../../common/user-store/user-store.injectable";
import { observer } from "mobx-react";
import { Input, InputValidators } from "../../../../../../../renderer/components/input";
import directoryForBinariesInjectable from "../../../../../../../common/app-paths/directory-for-binaries/directory-for-binaries.injectable";
interface Dependencies {
userStore: UserStore;
defaultPathForGeneralBinaries: string;
}
const NonInjectedKubectlDirectoryForBinaries = observer(
({ userStore, defaultPathForGeneralBinaries }: Dependencies) => {
const [downloadPath, setDownloadPath] = useState(userStore.downloadBinariesPath || "");
const pathValidator = downloadPath ? InputValidators.isPath : undefined;
const save = () => {
userStore.downloadBinariesPath = downloadPath;
};
return (
<section>
<SubTitle title="Directory for binaries" />
<Input
theme="round-black"
value={downloadPath}
placeholder={defaultPathForGeneralBinaries}
validators={pathValidator}
onChange={setDownloadPath}
onBlur={save}
disabled={!userStore.downloadKubectlBinaries}
/>
<div className="hint">The directory to download binaries into.</div>
</section>
);
},
);
export const KubectlDirectoryForBinaries = withInjectables<Dependencies>(
NonInjectedKubectlDirectoryForBinaries,
{
getProps: (di) => ({
defaultPathForGeneralBinaries: di.inject(directoryForBinariesInjectable),
userStore: di.inject(userStoreInjectable),
}),
},
);

View File

@ -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 { preferenceItemInjectionToken } from "../../../preference-item-injection-token";
import { KubectlDownloadMirror } from "./kubectl-download-mirror";
const kubectlDownloadMirrorPreferenceItemInjectable = getInjectable({
id: "kubectl-download-mirror-preference-item",
instantiate: () => ({
kind: "item" as const,
id: "kubectl-download-mirror",
parentId: "kubectl",
orderNumber: 20,
Component: KubectlDownloadMirror,
}),
injectionToken: preferenceItemInjectionToken,
});
export default kubectlDownloadMirrorPreferenceItemInjectable;

View File

@ -0,0 +1,52 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import React from "react";
import { SubTitle } from "../../../../../../../renderer/components/layout/sub-title";
import { withInjectables } from "@ogre-tools/injectable-react";
import type { UserStore } from "../../../../../../../common/user-store";
import userStoreInjectable from "../../../../../../../common/user-store/user-store.injectable";
import { observer } from "mobx-react";
import { Select } from "../../../../../../../renderer/components/select";
import { defaultPackageMirror, packageMirrors } from "../../../../../../../common/user-store/preferences-helpers";
interface Dependencies {
userStore: UserStore;
}
const downloadMirrorOptions = Array.from(packageMirrors, ([name, mirror]) => ({
value: name,
label: mirror.label,
// TODO: Side-effect
isDisabled: !mirror.platforms.has(process.platform),
}));
const NonInjectedKubectlDownloadMirror = observer(({ userStore }: Dependencies) => (
<section>
<SubTitle title="Download mirror" />
<Select
id="download-mirror-input"
placeholder="Download mirror for kubectl"
options={downloadMirrorOptions}
value={userStore.downloadMirror}
onChange={option => userStore.downloadMirror = option?.value ?? defaultPackageMirror}
isDisabled={!userStore.downloadKubectlBinaries}
themeName="lens"
/>
</section>
));
export const KubectlDownloadMirror = withInjectables<Dependencies>(
NonInjectedKubectlDownloadMirror,
{
getProps: (di) => ({
userStore: di.inject(userStoreInjectable),
}),
},
);

View File

@ -0,0 +1,21 @@
/**
* 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 { preferenceItemInjectionToken } from "../../preference-item-injection-token";
const kubectlGroupPreferenceItemInjectable = getInjectable({
id: "kubectl-group-preference-item",
instantiate: () => ({
kind: "group" as const,
id: "kubectl",
parentId: "kubernetes-page",
orderNumber: 10,
}),
injectionToken: preferenceItemInjectionToken,
});
export default kubectlGroupPreferenceItemInjectable;

View File

@ -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 { preferenceItemInjectionToken } from "../../../preference-item-injection-token";
import { KubectlPathToBinary } from "./kubectl-path-to-binary";
const kubectlPathToBinaryPreferenceItemInjectable = getInjectable({
id: "kubectl-path-to-binary-preference-item",
instantiate: () => ({
kind: "item" as const,
id: "kubectl-path-to-binary",
parentId: "kubectl",
orderNumber: 40,
Component: KubectlPathToBinary,
}),
injectionToken: preferenceItemInjectionToken,
});
export default kubectlPathToBinaryPreferenceItemInjectable;

View File

@ -0,0 +1,54 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import React, { useState } from "react";
import { SubTitle } from "../../../../../../../renderer/components/layout/sub-title";
import { withInjectables } from "@ogre-tools/injectable-react";
import type { UserStore } from "../../../../../../../common/user-store";
import userStoreInjectable from "../../../../../../../common/user-store/user-store.injectable";
import { observer } from "mobx-react";
import { Input, InputValidators } from "../../../../../../../renderer/components/input";
import directoryForKubectlBinariesInjectable from "../../../../../../../common/app-paths/directory-for-kubectl-binaries/directory-for-kubectl-binaries.injectable";
interface Dependencies {
userStore: UserStore;
defaultPathForKubectlBinaries: string;
}
const NonInjectedKubectlPathToBinary = observer(
({ userStore, defaultPathForKubectlBinaries }: Dependencies) => {
const [binariesPath, setBinariesPath] = useState(userStore.kubectlBinariesPath || "");
const pathValidator = binariesPath ? InputValidators.isPath : undefined;
const save = () => {
userStore.kubectlBinariesPath = binariesPath;
};
return (
<section>
<SubTitle title="Path to kubectl binary" />
<Input
theme="round-black"
placeholder={defaultPathForKubectlBinaries}
value={binariesPath}
validators={pathValidator}
onChange={setBinariesPath}
onBlur={save}
disabled={userStore.downloadKubectlBinaries}
/>
</section>
);
},
);
export const KubectlPathToBinary = withInjectables<Dependencies>(
NonInjectedKubectlPathToBinary,
{
getProps: (di) => ({
defaultPathForKubectlBinaries: di.inject(directoryForKubectlBinariesInjectable),
userStore: di.inject(userStoreInjectable),
}),
},
);

View File

@ -0,0 +1,14 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import React from "react";
import type { PreferenceItemComponent } from "../preference-item-injection-token";
export const KubernetesPage: PreferenceItemComponent = ({ children }) => (
<section id="kubernetes">
<h2 data-testid="kubernetes-header">Kubernetes</h2>
{children}
</section>
);

View File

@ -0,0 +1,25 @@
/**
* 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 { preferenceItemInjectionToken } from "../preference-item-injection-token";
import { KubernetesPage } from "./kubernetes-page";
import { HorizontalLine } from "../../../../../renderer/components/+preferences/horizontal-line/horizontal-line";
const kubernetesPreferencePageInjectable = getInjectable({
id: "kubernetes-preference-page",
instantiate: () => ({
kind: "page" as const,
id: "kubernetes-page",
parentId: "kubernetes-tab",
orderNumber: 0,
Component: KubernetesPage,
childrenSeparator: HorizontalLine,
}),
injectionToken: preferenceItemInjectionToken,
});
export default kubernetesPreferencePageInjectable;

View File

@ -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 { preferenceItemInjectionToken } from "../preference-item-injection-token";
const kubernetesPreferenceTabInjectable = getInjectable({
id: "kubernetes-preference-tab",
instantiate: () => ({
kind: "tab" as const,
id: "kubernetes-tab",
parentId: "preference-tabs" as const,
pathId: "kubernetes",
testId: "kubernetes-preferences-page",
label: "Kubernetes",
orderNumber: 10,
}),
injectionToken: preferenceItemInjectionToken,
});
export default kubernetesPreferenceTabInjectable;

View File

@ -5,7 +5,7 @@
import { observer } from "mobx-react";
import React from "react";
import { HelmCharts } from "../../../features/helm-charts/child-features/preferences/renderer/helm-charts";
import { KubeconfigSyncs } from "./kubeconfig-syncs";
import { KubeconfigSync } from "../../../features/preferences/renderer/preference-items/kubernetes/kubeconfig-sync/kubeconfig-sync";
import { KubectlBinaries } from "./kubectl-binaries";
import { Preferences } from "./preferences";
@ -17,10 +17,7 @@ export const Kubernetes = observer(() => (
<KubectlBinaries />
</section>
<hr />
<section id="kube-sync">
<h2 data-testid="kubernetes-sync-header">Kubeconfig Syncs</h2>
<KubeconfigSyncs />
</section>
<KubeconfigSync />
<hr />
<HelmCharts />
</section>