diff --git a/src/renderer/components/+user-management-service-accounts/service-accounts-details.tsx b/src/renderer/components/+user-management-service-accounts/service-accounts-details.tsx index cb500469f3..e784161c11 100644 --- a/src/renderer/components/+user-management-service-accounts/service-accounts-details.tsx +++ b/src/renderer/components/+user-management-service-accounts/service-accounts-details.tsx @@ -15,6 +15,7 @@ import { getDetailsUrl } from "../../navigation"; import { KubeObjectDetailsProps } from "../kube-object"; import { apiManager } from "../../api/api-manager"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; +import { Icon } from "../icon"; interface Props extends KubeObjectDetailsProps { } @@ -22,21 +23,25 @@ interface Props extends KubeObjectDetailsProps { @observer export class ServiceAccountsDetails extends React.Component { @observable secrets: Secret[]; + @observable imagePullSecrets: Secret[]; @disposeOnUnmount loadSecrets = autorun(async () => { this.secrets = null; + this.imagePullSecrets = null; const { object: serviceAccount } = this.props; if (!serviceAccount) { return; } const namespace = serviceAccount.getNs(); const secrets = serviceAccount.getSecrets().map(({ name }) => { - const secret = secretsStore.getByName(name, namespace); - if (!secret) return secretsStore.load({ name, namespace }); - return secret; + return secretsStore.load({ name, namespace }); }); 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() { @@ -49,15 +54,56 @@ export class ServiceAccountsDetails extends React.Component { ) } + renderImagePullSecrets(imagePullSecretNames: { name: string; }[]) { + const { object: serviceAccount } = this.props; + const { imagePullSecrets } = this; + if (!imagePullSecrets) { + return + } + 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[]) { - return secrets.map(secret => { + return secrets.map((secret) => { + if (secret.getId() === null) { + return ( +
+ {secret.getName()} + Secret is not found} + /> +
+ ) + } return ( {secret.getName()} ) - } - ) + }) + } + + generateDummySecretObject(name: string, namespace: string) { + return new Secret({ + apiVersion: "v1", + kind: "Secret", + metadata: { + namespace: namespace, + name: name, + uid: null, + selfLink: null, + resourceVersion: null + } + }) } render() { @@ -69,9 +115,7 @@ export class ServiceAccountsDetails extends React.Component { secret.getNs() == serviceAccount.getNs() && secret.getAnnotations().some(annot => annot == `kubernetes.io/service-account.name: ${serviceAccount.getName()}`) ) - const imagePullSecrets = serviceAccount.getImagePullSecrets().map(({ name }) => - secretsStore.getByName(name, serviceAccount.getNs()) - ) + const imagePullSecrets = serviceAccount.getImagePullSecrets() return (
@@ -83,7 +127,7 @@ export class ServiceAccountsDetails extends React.Component { } {imagePullSecrets.length > 0 && ImagePullSecrets} className="links"> - {this.renderSecretLinks(imagePullSecrets)} + {this.renderImagePullSecrets(imagePullSecrets)} }