mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Fix service account's imagePullSecrets rendering if secret is not found (#908)
* Fix service account's imagePullSecrets rendering if secret is not found Signed-off-by: Lauri Nevala <lauri.nevala@gmail.com>
This commit is contained in:
parent
9a9f50ab34
commit
3f8a2b09a0
@ -15,6 +15,7 @@ import { getDetailsUrl } from "../../navigation";
|
|||||||
import { KubeObjectDetailsProps } from "../kube-object";
|
import { KubeObjectDetailsProps } from "../kube-object";
|
||||||
import { apiManager } from "../../api/api-manager";
|
import { apiManager } from "../../api/api-manager";
|
||||||
import { KubeObjectMeta } from "../kube-object/kube-object-meta";
|
import { KubeObjectMeta } from "../kube-object/kube-object-meta";
|
||||||
|
import { Icon } from "../icon";
|
||||||
|
|
||||||
interface Props extends KubeObjectDetailsProps<ServiceAccount> {
|
interface Props extends KubeObjectDetailsProps<ServiceAccount> {
|
||||||
}
|
}
|
||||||
@ -22,21 +23,25 @@ interface Props extends KubeObjectDetailsProps<ServiceAccount> {
|
|||||||
@observer
|
@observer
|
||||||
export class ServiceAccountsDetails extends React.Component<Props> {
|
export class ServiceAccountsDetails extends React.Component<Props> {
|
||||||
@observable secrets: Secret[];
|
@observable secrets: Secret[];
|
||||||
|
@observable imagePullSecrets: Secret[];
|
||||||
|
|
||||||
@disposeOnUnmount
|
@disposeOnUnmount
|
||||||
loadSecrets = autorun(async () => {
|
loadSecrets = autorun(async () => {
|
||||||
this.secrets = null;
|
this.secrets = null;
|
||||||
|
this.imagePullSecrets = null;
|
||||||
const { object: serviceAccount } = this.props;
|
const { object: serviceAccount } = this.props;
|
||||||
if (!serviceAccount) {
|
if (!serviceAccount) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const namespace = serviceAccount.getNs();
|
const namespace = serviceAccount.getNs();
|
||||||
const secrets = serviceAccount.getSecrets().map(({ name }) => {
|
const secrets = serviceAccount.getSecrets().map(({ name }) => {
|
||||||
const secret = secretsStore.getByName(name, namespace);
|
return secretsStore.load({ name, namespace });
|
||||||
if (!secret) return secretsStore.load({ name, namespace });
|
|
||||||
return secret;
|
|
||||||
});
|
});
|
||||||
this.secrets = await Promise.all(secrets);
|
this.secrets = await Promise.all(secrets);
|
||||||
|
const imagePullSecrets = serviceAccount.getImagePullSecrets().map(async({ name }) => {
|
||||||
|
return secretsStore.load({ name, namespace }).catch(_err => { return this.generateDummySecretObject(name) });
|
||||||
|
});
|
||||||
|
this.imagePullSecrets = await Promise.all(imagePullSecrets)
|
||||||
})
|
})
|
||||||
|
|
||||||
renderSecrets() {
|
renderSecrets() {
|
||||||
@ -49,15 +54,46 @@ export class ServiceAccountsDetails extends React.Component<Props> {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderImagePullSecrets() {
|
||||||
|
const { imagePullSecrets } = this;
|
||||||
|
if (!imagePullSecrets) {
|
||||||
|
return <Spinner center/>
|
||||||
|
}
|
||||||
|
return this.renderSecretLinks(imagePullSecrets)
|
||||||
|
}
|
||||||
|
|
||||||
renderSecretLinks(secrets: Secret[]) {
|
renderSecretLinks(secrets: Secret[]) {
|
||||||
return secrets.map(secret => {
|
return secrets.map((secret) => {
|
||||||
|
if (secret.getId() === null) {
|
||||||
|
return (
|
||||||
|
<div key={secret.getName()}>
|
||||||
|
{secret.getName()}
|
||||||
|
<Icon
|
||||||
|
small material="warning"
|
||||||
|
tooltip={<Trans>Secret is not found</Trans>}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<Link key={secret.getId()} to={getDetailsUrl(secret.selfLink)}>
|
<Link key={secret.getId()} to={getDetailsUrl(secret.selfLink)}>
|
||||||
{secret.getName()}
|
{secret.getName()}
|
||||||
</Link>
|
</Link>
|
||||||
)
|
)
|
||||||
}
|
})
|
||||||
)
|
}
|
||||||
|
|
||||||
|
generateDummySecretObject(name: string) {
|
||||||
|
return new Secret({
|
||||||
|
apiVersion: "v1",
|
||||||
|
kind: "Secret",
|
||||||
|
metadata: {
|
||||||
|
name: name,
|
||||||
|
uid: null,
|
||||||
|
selfLink: null,
|
||||||
|
resourceVersion: null
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@ -69,9 +105,7 @@ export class ServiceAccountsDetails extends React.Component<Props> {
|
|||||||
secret.getNs() == serviceAccount.getNs() &&
|
secret.getNs() == serviceAccount.getNs() &&
|
||||||
secret.getAnnotations().some(annot => annot == `kubernetes.io/service-account.name: ${serviceAccount.getName()}`)
|
secret.getAnnotations().some(annot => annot == `kubernetes.io/service-account.name: ${serviceAccount.getName()}`)
|
||||||
)
|
)
|
||||||
const imagePullSecrets = serviceAccount.getImagePullSecrets().map(({ name }) =>
|
const imagePullSecrets = serviceAccount.getImagePullSecrets()
|
||||||
secretsStore.getByName(name, serviceAccount.getNs())
|
|
||||||
)
|
|
||||||
return (
|
return (
|
||||||
<div className="ServiceAccountsDetails">
|
<div className="ServiceAccountsDetails">
|
||||||
<KubeObjectMeta object={serviceAccount}/>
|
<KubeObjectMeta object={serviceAccount}/>
|
||||||
@ -83,7 +117,7 @@ export class ServiceAccountsDetails extends React.Component<Props> {
|
|||||||
}
|
}
|
||||||
{imagePullSecrets.length > 0 &&
|
{imagePullSecrets.length > 0 &&
|
||||||
<DrawerItem name={<Trans>ImagePullSecrets</Trans>} className="links">
|
<DrawerItem name={<Trans>ImagePullSecrets</Trans>} className="links">
|
||||||
{this.renderSecretLinks(imagePullSecrets)}
|
{this.renderImagePullSecrets()}
|
||||||
</DrawerItem>
|
</DrawerItem>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user