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

Remove usages of legacy global secretApi

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2022-12-22 10:28:30 -05:00
parent 6b769cfa07
commit fea08751a0
16 changed files with 390 additions and 136 deletions

View File

@ -13,7 +13,6 @@ import persistentVolumeClaimApiInjectable from "./persistent-volume-claim.api.in
import podApiInjectable from "./pod.api.injectable"; import podApiInjectable from "./pod.api.injectable";
import resourceQuotaApiInjectable from "./resource-quota.api.injectable"; import resourceQuotaApiInjectable from "./resource-quota.api.injectable";
import roleApiInjectable from "./role.api.injectable"; import roleApiInjectable from "./role.api.injectable";
import secretApiInjectable from "./secret.api.injectable";
/** /**
* @deprecated use `di.inject(roleApiInjectable)` instead * @deprecated use `di.inject(roleApiInjectable)` instead
@ -59,8 +58,3 @@ export const persistentVolumeClaimApi = asLegacyGlobalForExtensionApi(persistent
* @deprecated use `di.inject(resourceQuotaApiInjectable)` instead * @deprecated use `di.inject(resourceQuotaApiInjectable)` instead
*/ */
export const resourceQuotaApi = asLegacyGlobalForExtensionApi(resourceQuotaApiInjectable); export const resourceQuotaApi = asLegacyGlobalForExtensionApi(resourceQuotaApiInjectable);
/**
* @deprecated use `di.inject(secretApiInjectable)` instead
*/
export const secretApi = asLegacyGlobalForExtensionApi(secretApiInjectable);

View File

@ -0,0 +1,18 @@
/**
* 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 { action } from "mobx";
import addSecretDialogOpenStateInjectable from "./state.injectable";
const closeAddSecretDialogInjectable = getInjectable({
id: "close-add-secret-dialog",
instantiate: (di) => {
const state = di.inject(addSecretDialogOpenStateInjectable);
return action(() => state.set(false));
},
});
export default closeAddSecretDialogInjectable;

View File

@ -0,0 +1,18 @@
/**
* 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 addSecretDialogOpenStateInjectable from "./state.injectable";
const isAddSecretDialogOpenInjectable = getInjectable({
id: "is-add-secret-dialog-open",
instantiate: (di) => {
const state = di.inject(addSecretDialogOpenStateInjectable);
return computed(() => state.get());
},
});
export default isAddSecretDialogOpenInjectable;

View File

@ -0,0 +1,18 @@
/**
* 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 { action } from "mobx";
import addSecretDialogOpenStateInjectable from "./state.injectable";
const openAddSecretDialogInjectable = getInjectable({
id: "open-add-secret-dialog",
instantiate: (di) => {
const state = di.inject(addSecretDialogOpenStateInjectable);
return action(() => state.set(true));
},
});
export default openAddSecretDialogInjectable;

View File

@ -0,0 +1,13 @@
/**
* 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 { observable } from "mobx";
const addSecretDialogOpenStateInjectable = getInjectable({
id: "add-secret-dialog-state",
instantiate: () => observable.box(false),
});
export default addSecretDialogOpenStateInjectable;

View File

@ -3,26 +3,33 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import "./add-secret-dialog.scss"; import "./view.scss";
import React from "react"; import React from "react";
import type { IComputedValue } from "mobx";
import { observable, makeObservable } from "mobx"; import { observable, makeObservable } from "mobx";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import type { DialogProps } from "../dialog"; import type { DialogProps } from "../../dialog";
import { Dialog } from "../dialog"; import { Dialog } from "../../dialog";
import { Wizard, WizardStep } from "../wizard"; import { Wizard, WizardStep } from "../../wizard";
import { Input } from "../input"; import { Input } from "../../input";
import { systemName } from "../input/input_validators"; import { systemName } from "../../input/input_validators";
import { reverseSecretTypeMap, secretApi, SecretType } from "../../../common/k8s-api/endpoints"; import type { SecretApi } from "../../../../common/k8s-api/endpoints";
import { SubTitle } from "../layout/sub-title"; import { reverseSecretTypeMap, SecretType } from "../../../../common/k8s-api/endpoints";
import { NamespaceSelect } from "../+namespaces/namespace-select"; import { SubTitle } from "../../layout/sub-title";
import { Select } from "../select"; import { NamespaceSelect } from "../../+namespaces/namespace-select";
import { Icon } from "../icon"; import { Select } from "../../select";
import { base64, iter } from "../../utils"; import { Icon } from "../../icon";
import { Notifications } from "../notifications"; import { base64, iter } from "../../../utils";
import { Notifications } from "../../notifications";
import upperFirst from "lodash/upperFirst"; import upperFirst from "lodash/upperFirst";
import { showDetails } from "../kube-detail-params"; import { fromEntries } from "../../../../common/utils/objects";
import { fromEntries } from "../../../common/utils/objects"; import type { ShowDetails } from "../../kube-detail-params/show-details.injectable";
import { withInjectables } from "@ogre-tools/injectable-react";
import closeAddSecretDialogInjectable from "./close.injectable";
import secretApiInjectable from "../../../../common/k8s-api/endpoints/secret.api.injectable";
import showDetailsInjectable from "../../kube-detail-params/show-details.injectable";
import isAddSecretDialogOpenInjectable from "./is-open.injectable";
export interface AddSecretDialogProps extends Partial<DialogProps> { export interface AddSecretDialogProps extends Partial<DialogProps> {
} }
@ -42,25 +49,20 @@ interface SecretTemplate {
type ISecretField = keyof SecretTemplate; type ISecretField = keyof SecretTemplate;
const dialogState = observable.object({ interface Dependencies {
isOpen: false, secretApi: SecretApi;
}); isAddSecretDialogOpen: IComputedValue<boolean>;
closeAddSecretDialog: () => void;
showDetails: ShowDetails;
}
@observer @observer
export class AddSecretDialog extends React.Component<AddSecretDialogProps> { class NonInjectedAddSecretDialog extends React.Component<AddSecretDialogProps & Dependencies> {
constructor(props: AddSecretDialogProps) { constructor(props: AddSecretDialogProps & Dependencies) {
super(props); super(props);
makeObservable(this); makeObservable(this);
} }
static open() {
dialogState.isOpen = true;
}
static close() {
dialogState.isOpen = false;
}
private secretTemplate: Partial<Record<SecretType, SecretTemplate>> = { private secretTemplate: Partial<Record<SecretType, SecretTemplate>> = {
[SecretType.Opaque]: {}, [SecretType.Opaque]: {},
[SecretType.ServiceAccountToken]: { [SecretType.ServiceAccountToken]: {
@ -82,7 +84,7 @@ export class AddSecretDialog extends React.Component<AddSecretDialogProps> {
}; };
close = () => { close = () => {
AddSecretDialog.close(); this.props.closeAddSecretDialog();
}; };
private getDataFromFields = (fields: SecretTemplateField[] = [], processValue: (val: string) => string = (val => val)) => { private getDataFromFields = (fields: SecretTemplateField[] = [], processValue: (val: string) => string = (val => val)) => {
@ -100,7 +102,7 @@ export class AddSecretDialog extends React.Component<AddSecretDialogProps> {
const { data = [], labels = [], annotations = [] } = this.secret[type] ?? {}; const { data = [], labels = [], annotations = [] } = this.secret[type] ?? {};
try { try {
const newSecret = await secretApi.create({ namespace, name }, { const newSecret = await this.props.secretApi.create({ namespace, name }, {
type, type,
data: this.getDataFromFields(data, val => val ? base64.encode(val) : ""), data: this.getDataFromFields(data, val => val ? base64.encode(val) : ""),
metadata: { metadata: {
@ -111,7 +113,7 @@ export class AddSecretDialog extends React.Component<AddSecretDialogProps> {
}, },
}); });
showDetails(newSecret?.selfLink); this.props.showDetails(newSecret?.selfLink);
this.close(); this.close();
} catch (err) { } catch (err) {
Notifications.checkedError(err, "Unknown error occured while creating a Secret"); Notifications.checkedError(err, "Unknown error occured while creating a Secret");
@ -183,7 +185,7 @@ export class AddSecretDialog extends React.Component<AddSecretDialogProps> {
} }
render() { render() {
const { ...dialogProps } = this.props; const { closeAddSecretDialog, isAddSecretDialogOpen, secretApi, showDetails, ...dialogProps } = this.props;
const { namespace, name, type } = this; const { namespace, name, type } = this;
const header = <h5>Create Secret</h5>; const header = <h5>Create Secret</h5>;
@ -191,7 +193,7 @@ export class AddSecretDialog extends React.Component<AddSecretDialogProps> {
<Dialog <Dialog
{...dialogProps} {...dialogProps}
className="AddSecretDialog" className="AddSecretDialog"
isOpen={dialogState.isOpen} isOpen={isAddSecretDialogOpen.get()}
onOpen={this.reset} onOpen={this.reset}
close={this.close} close={this.close}
> >
@ -244,3 +246,13 @@ export class AddSecretDialog extends React.Component<AddSecretDialogProps> {
); );
} }
} }
export const AddSecretDialog = withInjectables<Dependencies, AddSecretDialogProps>(NonInjectedAddSecretDialog, {
getProps: (di, props) => ({
...props,
closeAddSecretDialog: di.inject(closeAddSecretDialogInjectable),
secretApi: di.inject(secretApiInjectable),
showDetails: di.inject(showDetailsInjectable),
isAddSecretDialogOpen: di.inject(isAddSecretDialogOpenInjectable),
}),
});

View File

@ -7,7 +7,7 @@ import "./secrets.scss";
import React from "react"; import React from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { AddSecretDialog } from "./add-secret-dialog"; import { AddSecretDialog } from "./add-dialog/view";
import { KubeObjectListLayout } from "../kube-object-list-layout"; import { KubeObjectListLayout } from "../kube-object-list-layout";
import { Badge } from "../badge"; import { Badge } from "../badge";
import { KubeObjectStatusIcon } from "../kube-object-status-icon"; import { KubeObjectStatusIcon } from "../kube-object-status-icon";
@ -19,6 +19,7 @@ import type { SecretStore } from "./store";
import { withInjectables } from "@ogre-tools/injectable-react"; import { withInjectables } from "@ogre-tools/injectable-react";
import filterByNamespaceInjectable from "../+namespaces/namespace-select-filter-model/filter-by-namespace.injectable"; import filterByNamespaceInjectable from "../+namespaces/namespace-select-filter-model/filter-by-namespace.injectable";
import secretStoreInjectable from "./store.injectable"; import secretStoreInjectable from "./store.injectable";
import openAddSecretDialogInjectable from "./add-dialog/open.injectable";
enum columnId { enum columnId {
name = "name", name = "name",
@ -32,6 +33,7 @@ enum columnId {
interface Dependencies { interface Dependencies {
filterByNamespace: FilterByNamespace; filterByNamespace: FilterByNamespace;
secretStore: SecretStore; secretStore: SecretStore;
openAddSecretDialog: () => void;
} }
@observer @observer
@ -89,7 +91,7 @@ class NonInjectedSecrets extends React.Component<Dependencies> {
<KubeObjectAge key="age" object={secret} />, <KubeObjectAge key="age" object={secret} />,
]} ]}
addRemoveButtons={{ addRemoveButtons={{
onAdd: () => AddSecretDialog.open(), onAdd: this.props.openAddSecretDialog,
addTooltip: "Create new Secret", addTooltip: "Create new Secret",
}} }}
/> />
@ -104,5 +106,6 @@ export const Secrets = withInjectables<Dependencies>(NonInjectedSecrets, {
...props, ...props,
filterByNamespace: di.inject(filterByNamespaceInjectable), filterByNamespace: di.inject(filterByNamespaceInjectable),
secretStore: di.inject(secretStoreInjectable), secretStore: di.inject(secretStoreInjectable),
openAddSecretDialog: di.inject(openAddSecretDialogInjectable),
}), }),
}); });

View File

@ -3,14 +3,33 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { withInjectables } from "@ogre-tools/injectable-react";
import React from "react"; import React from "react";
import { secretApi } from "../../../../../../common/k8s-api/endpoints"; import type { SecretApi } from "../../../../../../common/k8s-api/endpoints";
import secretApiInjectable from "../../../../../../common/k8s-api/endpoints/secret.api.injectable";
import { DrawerItem } from "../../../../drawer"; import { DrawerItem } from "../../../../drawer";
import type { VolumeVariantComponent } from "../variant-helpers"; import type { PodVolumeVariantSpecificProps } from "../variant-helpers";
import { LocalRef } from "../variant-helpers"; import { LocalRef } from "../variant-helpers";
export const CephFs: VolumeVariantComponent<"cephfs"> = ( interface Dependencies {
({ pod, variant: { monitors, path = "/", user = "admin", secretFile = "/etc/ceph/user.secret", secretRef, readOnly = false }}) => ( secretApi: SecretApi;
}
const NonInjectedCephFs = (props: PodVolumeVariantSpecificProps<"cephfs"> & Dependencies) => {
const {
pod,
variant: {
monitors,
path = "/",
user = "admin",
secretFile = "/etc/ceph/user.secret",
secretRef,
readOnly = false,
},
secretApi,
} = props;
return (
<> <>
<DrawerItem name="Monitors"> <DrawerItem name="Monitors">
<ul> <ul>
@ -43,5 +62,12 @@ export const CephFs: VolumeVariantComponent<"cephfs"> = (
{readOnly.toString()} {readOnly.toString()}
</DrawerItem> </DrawerItem>
</> </>
) );
); };
export const CephFs = withInjectables<Dependencies, PodVolumeVariantSpecificProps<"cephfs">>(NonInjectedCephFs, {
getProps: (di, props) => ({
...props,
secretApi: di.inject(secretApiInjectable),
}),
});

View File

@ -3,66 +3,78 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { withInjectables } from "@ogre-tools/injectable-react";
import React from "react"; import React from "react";
import { secretApi } from "../../../../../../common/k8s-api/endpoints"; import type { SecretApi } from "../../../../../../common/k8s-api/endpoints";
import secretApiInjectable from "../../../../../../common/k8s-api/endpoints/secret.api.injectable";
import { DrawerItem } from "../../../../drawer"; import { DrawerItem } from "../../../../drawer";
import type { VolumeVariantComponent } from "../variant-helpers"; import type { PodVolumeVariantSpecificProps } from "../variant-helpers";
import { LocalRef } from "../variant-helpers"; import { LocalRef } from "../variant-helpers";
export const ContainerStorageInterface: VolumeVariantComponent<"csi"> = ({ interface Dependencies {
pod, secretApi: SecretApi;
variant: { }
driver,
readOnly = false, const NonInjectedContainerStorageInterface = (props: PodVolumeVariantSpecificProps<"csi"> & Dependencies) => {
fsType = "ext4", const {
volumeAttributes = {}, pod,
nodePublishSecretRef, variant: {
controllerPublishSecretRef, driver,
nodeStageSecretRef, readOnly = false,
controllerExpandSecretRef, fsType = "ext4",
}, volumeAttributes = {},
}) => ( nodePublishSecretRef,
<> controllerPublishSecretRef,
<DrawerItem name="Driver"> nodeStageSecretRef,
{driver} controllerExpandSecretRef,
</DrawerItem> },
<DrawerItem name="ReadOnly"> secretApi,
{readOnly.toString()} } = props;
</DrawerItem>
<DrawerItem name="Filesystem Type"> return (
{fsType} <>
</DrawerItem> <DrawerItem name="Driver">
<LocalRef {driver}
pod={pod} </DrawerItem>
title="Controller Publish Secret" <DrawerItem name="ReadOnly">
kubeRef={controllerPublishSecretRef} {readOnly.toString()}
api={secretApi} </DrawerItem>
/> <DrawerItem name="Filesystem Type">
<LocalRef {fsType}
pod={pod} </DrawerItem>
title="Controller Expand Secret" <LocalRef
kubeRef={controllerExpandSecretRef} pod={pod}
api={secretApi} title="Controller Publish Secret"
/> kubeRef={controllerPublishSecretRef}
<LocalRef api={secretApi} />
pod={pod} <LocalRef
title="Node Publish Secret" pod={pod}
kubeRef={nodePublishSecretRef} title="Controller Expand Secret"
api={secretApi} kubeRef={controllerExpandSecretRef}
/> api={secretApi} />
<LocalRef <LocalRef
pod={pod} pod={pod}
title="Node Stage Secret" title="Node Publish Secret"
kubeRef={nodeStageSecretRef} kubeRef={nodePublishSecretRef}
api={secretApi} api={secretApi} />
/> <LocalRef
{ pod={pod}
Object.entries(volumeAttributes) title="Node Stage Secret"
kubeRef={nodeStageSecretRef}
api={secretApi} />
{Object.entries(volumeAttributes)
.map(([key, value]) => ( .map(([key, value]) => (
<DrawerItem key={key} name={key}> <DrawerItem key={key} name={key}>
{value} {value}
</DrawerItem> </DrawerItem>
)) ))}
} </>
</> );
); };
export const ContainerStorageInterface = withInjectables<Dependencies, PodVolumeVariantSpecificProps<"csi">>(NonInjectedContainerStorageInterface, {
getProps: (di, props) => ({
...props,
secretApi: di.inject(secretApiInjectable),
}),
});

View File

@ -3,14 +3,32 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { withInjectables } from "@ogre-tools/injectable-react";
import React from "react"; import React from "react";
import { secretApi } from "../../../../../../common/k8s-api/endpoints"; import type { SecretApi } from "../../../../../../common/k8s-api/endpoints";
import secretApiInjectable from "../../../../../../common/k8s-api/endpoints/secret.api.injectable";
import { DrawerItem } from "../../../../drawer"; import { DrawerItem } from "../../../../drawer";
import type { VolumeVariantComponent } from "../variant-helpers"; import type { PodVolumeVariantSpecificProps } from "../variant-helpers";
import { LocalRef } from "../variant-helpers"; import { LocalRef } from "../variant-helpers";
export const FlexVolume: VolumeVariantComponent<"flexVolume"> = ( interface Dependencies {
({ pod, variant: { driver, fsType, secretRef, readOnly = false, options = {}}}) => ( secretApi: SecretApi;
}
const NonInjectedFlexVolume = (props: PodVolumeVariantSpecificProps<"flexVolume"> & Dependencies) => {
const {
pod,
variant: {
driver,
fsType,
secretRef,
readOnly = false,
options = {},
},
secretApi,
} = props;
return (
<> <>
<DrawerItem name="Driver"> <DrawerItem name="Driver">
{driver} {driver}
@ -36,5 +54,12 @@ export const FlexVolume: VolumeVariantComponent<"flexVolume"> = (
)) ))
} }
</> </>
) );
); };
export const FlexVolume = withInjectables<Dependencies, PodVolumeVariantSpecificProps<"flexVolume">>(NonInjectedFlexVolume, {
getProps: (di, props) => ({
...props,
secretApi: di.inject(secretApiInjectable),
}),
});

View File

@ -3,14 +3,35 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { withInjectables } from "@ogre-tools/injectable-react";
import React from "react"; import React from "react";
import { secretApi } from "../../../../../../common/k8s-api/endpoints"; import type { SecretApi } from "../../../../../../common/k8s-api/endpoints";
import secretApiInjectable from "../../../../../../common/k8s-api/endpoints/secret.api.injectable";
import { DrawerItem } from "../../../../drawer"; import { DrawerItem } from "../../../../drawer";
import type { VolumeVariantComponent } from "../variant-helpers"; import type { PodVolumeVariantSpecificProps } from "../variant-helpers";
import { LocalRef } from "../variant-helpers"; import { LocalRef } from "../variant-helpers";
export const RadosBlockDevice: VolumeVariantComponent<"rbd"> = ( interface Dependencies {
({ pod, variant: { monitors, image, fsType = "ext4", pool = "rbd", user = "admin", keyring = "/etc/ceph/keyright", secretRef, readOnly = false }}) => ( secretApi: SecretApi;
}
const NonInjectedRadosBlockDevice = (props: PodVolumeVariantSpecificProps<"rbd"> & Dependencies) => {
const {
pod,
variant: {
monitors,
image,
fsType = "ext4",
pool = "rbd",
user = "admin",
keyring = "/etc/ceph/keyright",
secretRef,
readOnly = false,
},
secretApi,
} = props;
return (
<> <>
<DrawerItem name="Ceph Monitors"> <DrawerItem name="Ceph Monitors">
<ul> <ul>
@ -49,5 +70,12 @@ export const RadosBlockDevice: VolumeVariantComponent<"rbd"> = (
{readOnly.toString()} {readOnly.toString()}
</DrawerItem> </DrawerItem>
</> </>
) );
); };
export const RadosBlockDevice = withInjectables<Dependencies, PodVolumeVariantSpecificProps<"rbd">>(NonInjectedRadosBlockDevice, {
getProps: (di, props) => ({
...props,
secretApi: di.inject(secretApiInjectable),
}),
});

View File

@ -3,14 +3,37 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { withInjectables } from "@ogre-tools/injectable-react";
import React from "react"; import React from "react";
import { secretApi } from "../../../../../../common/k8s-api/endpoints"; import type { SecretApi } from "../../../../../../common/k8s-api/endpoints";
import secretApiInjectable from "../../../../../../common/k8s-api/endpoints/secret.api.injectable";
import { DrawerItem } from "../../../../drawer"; import { DrawerItem } from "../../../../drawer";
import type { VolumeVariantComponent } from "../variant-helpers"; import type { PodVolumeVariantSpecificProps } from "../variant-helpers";
import { LocalRef } from "../variant-helpers"; import { LocalRef } from "../variant-helpers";
export const ScaleIo: VolumeVariantComponent<"scaleIO"> = ( interface Dependencies {
({ pod, variant: { gateway, system, secretRef, sslEnabled = false, protectionDomain, storagePool, storageMode = "ThinProvisioned", volumeName, fsType = "xfs", readOnly = false }}) => ( secretApi: SecretApi;
}
const NonInjectedScaleIo = (props: PodVolumeVariantSpecificProps<"scaleIO"> & Dependencies) => {
const {
pod,
variant: {
gateway,
system,
secretRef,
sslEnabled = false,
protectionDomain,
storagePool,
storageMode = "ThinProvisioned",
volumeName,
fsType = "xfs",
readOnly = false,
},
secretApi,
} = props;
return (
<> <>
<DrawerItem name="Gateway"> <DrawerItem name="Gateway">
{gateway} {gateway}
@ -46,5 +69,12 @@ export const ScaleIo: VolumeVariantComponent<"scaleIO"> = (
{readOnly.toString()} {readOnly.toString()}
</DrawerItem> </DrawerItem>
</> </>
) );
); };
export const ScaleIo = withInjectables<Dependencies, PodVolumeVariantSpecificProps<"scaleIO">>(NonInjectedScaleIo, {
getProps: (di, props) => ({
...props,
secretApi: di.inject(secretApiInjectable),
}),
});

View File

@ -3,14 +3,26 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { withInjectables } from "@ogre-tools/injectable-react";
import React from "react"; import React from "react";
import { secretApi } from "../../../../../../common/k8s-api/endpoints"; import type { SecretApi } from "../../../../../../common/k8s-api/endpoints";
import secretApiInjectable from "../../../../../../common/k8s-api/endpoints/secret.api.injectable";
import { DrawerItem } from "../../../../drawer"; import { DrawerItem } from "../../../../drawer";
import type { VolumeVariantComponent } from "../variant-helpers"; import type { PodVolumeVariantSpecificProps } from "../variant-helpers";
import { LocalRef } from "../variant-helpers"; import { LocalRef } from "../variant-helpers";
export const Secret: VolumeVariantComponent<"secret"> = ( interface Dependencies {
({ pod, variant: { secretName, items = [], defaultMode = 0o644, optional = false }}) => ( secretApi: SecretApi;
}
const NonInjectedSecret = (props: PodVolumeVariantSpecificProps<"secret"> & Dependencies) => {
const {
pod,
variant: { secretName, items = [], defaultMode = 0o644, optional = false },
secretApi,
} = props;
return (
<> <>
<LocalRef <LocalRef
pod={pod} pod={pod}
@ -30,5 +42,12 @@ export const Secret: VolumeVariantComponent<"secret"> = (
{optional.toString()} {optional.toString()}
</DrawerItem> </DrawerItem>
</> </>
) );
); };
export const Secret = withInjectables<Dependencies, PodVolumeVariantSpecificProps<"secret">>(NonInjectedSecret, {
getProps: (di, props) => ({
...props,
secretApi: di.inject(secretApiInjectable),
}),
});

View File

@ -3,14 +3,26 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { withInjectables } from "@ogre-tools/injectable-react";
import React from "react"; import React from "react";
import { secretApi } from "../../../../../../common/k8s-api/endpoints"; import type { SecretApi } from "../../../../../../common/k8s-api/endpoints";
import secretApiInjectable from "../../../../../../common/k8s-api/endpoints/secret.api.injectable";
import { DrawerItem } from "../../../../drawer"; import { DrawerItem } from "../../../../drawer";
import type { VolumeVariantComponent } from "../variant-helpers"; import type { PodVolumeVariantSpecificProps } from "../variant-helpers";
import { LocalRef } from "../variant-helpers"; import { LocalRef } from "../variant-helpers";
export const StorageOs: VolumeVariantComponent<"storageos"> = ( interface Dependencies {
({ pod, variant: { volumeName, volumeNamespace, fsType = "ext4", readOnly = false, secretRef }}) => ( secretApi: SecretApi;
}
const NonInjectedStorageOs = (props: PodVolumeVariantSpecificProps<"storageos"> & Dependencies) => {
const {
pod,
variant: { volumeName, volumeNamespace, fsType = "ext4", readOnly = false, secretRef },
secretApi,
} = props;
return (
<> <>
<DrawerItem name="Volume Name"> <DrawerItem name="Volume Name">
{volumeName} {volumeName}
@ -35,5 +47,12 @@ export const StorageOs: VolumeVariantComponent<"storageos"> = (
api={secretApi} api={secretApi}
/> />
</> </>
) );
); };
export const StorageOs = withInjectables<Dependencies, PodVolumeVariantSpecificProps<"storageos">>(NonInjectedStorageOs, {
getProps: (di, props) => ({
...props,
secretApi: di.inject(secretApiInjectable),
}),
});

View File

@ -9,15 +9,27 @@ import React, { useEffect, useState } from "react";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { reaction } from "mobx"; import { reaction } from "mobx";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import type { Pod, Secret } from "../../../common/k8s-api/endpoints"; import type { Pod, Secret, SecretApi } from "../../../common/k8s-api/endpoints";
import { secretApi } from "../../../common/k8s-api/endpoints"; import { withInjectables } from "@ogre-tools/injectable-react";
import { getDetailsUrl } from "../kube-detail-params"; import secretApiInjectable from "../../../common/k8s-api/endpoints/secret.api.injectable";
import type { GetDetailsUrl } from "../kube-detail-params/get-details-url.injectable";
import getDetailsUrlInjectable from "../kube-detail-params/get-details-url.injectable";
export interface PodDetailsSecretsProps { export interface PodDetailsSecretsProps {
pod: Pod; pod: Pod;
} }
export const PodDetailsSecrets = observer(({ pod }: PodDetailsSecretsProps) => { interface Dependencies {
secretApi: SecretApi;
getDetailsUrl: GetDetailsUrl;
}
const NonInjectedPodDetailsSecrets = observer((props: PodDetailsSecretsProps & Dependencies) => {
const {
pod,
secretApi,
getDetailsUrl,
} = props;
const [secrets, setSecrets] = useState(new Map<string, Secret>()); const [secrets, setSecrets] = useState(new Map<string, Secret>());
useEffect(() => ( useEffect(() => (
@ -68,3 +80,10 @@ export const PodDetailsSecrets = observer(({ pod }: PodDetailsSecretsProps) => {
); );
}); });
export const PodDetailsSecrets = withInjectables<Dependencies, PodDetailsSecretsProps>(NonInjectedPodDetailsSecrets, {
getProps: (di, props) => ({
...props,
secretApi: di.inject(secretApiInjectable),
getDetailsUrl: di.inject(getDetailsUrlInjectable),
}),
});