1
0
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

Signed-off-by: Lauri Nevala <lauri.nevala@gmail.com>
This commit is contained in:
Lauri Nevala 2020-09-17 15:22:19 +03:00
parent f5d41c645c
commit f93bd55113

View File

@ -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 null });
});
this.imagePullSecrets = (await Promise.all(imagePullSecrets)).filter(secret => !!secret)
}) })
renderSecrets() { renderSecrets() {
@ -49,15 +54,56 @@ export class ServiceAccountsDetails extends React.Component<Props> {
) )
} }
renderImagePullSecrets(imagePullSecretNames: { name: string; }[]) {
const { object: serviceAccount } = this.props;
const { imagePullSecrets } = this;
if (!imagePullSecrets) {
return <Spinner center/>
}
const secrets = imagePullSecretNames.map(({name}) => {
let secret = imagePullSecrets.find((secret) => secret.getName() === name && secret.getNs() === serviceAccount.getNs())
if (!secret) {
secret = this.generateDummySecretObject(name, serviceAccount.getNs())
}
return secret
})
return this.renderSecretLinks(secrets)
}
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, namespace: string) {
return new Secret({
apiVersion: "v1",
kind: "Secret",
metadata: {
namespace: namespace,
name: name,
uid: null,
selfLink: null,
resourceVersion: null
}
})
} }
render() { render() {
@ -69,9 +115,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 +127,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(imagePullSecrets)}
</DrawerItem> </DrawerItem>
} }