import "./service-accounts-details.scss"; import React from "react"; import { autorun, observable, makeObservable } from "mobx"; import { Spinner } from "../spinner"; import { ServiceAccountsSecret } from "./service-accounts-secret"; import { DrawerItem, DrawerTitle } from "../drawer"; import { disposeOnUnmount, observer } from "mobx-react"; import { secretsStore } from "../+config-secrets/secrets.store"; import { Link } from "react-router-dom"; import { Secret, ServiceAccount } from "../../api/endpoints"; import { KubeEventDetails } from "../+events/kube-event-details"; import { getDetailsUrl, KubeObjectDetailsProps } from "../kube-object"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { Icon } from "../icon"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; 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 }) => { return secretsStore.load({ name, namespace }); }); this.secrets = await Promise.all(secrets); const imagePullSecrets = serviceAccount.getImagePullSecrets().map(async({ name }) => { return secretsStore.load({ name, namespace }).catch(() => this.generateDummySecretObject(name)); }); this.imagePullSecrets = await Promise.all(imagePullSecrets); }); constructor(props: Props) { super(props); makeObservable(this); } renderSecrets() { const { secrets } = this; if (!secrets) { return ; } return secrets.map(secret => ); } renderImagePullSecrets() { const { imagePullSecrets } = this; if (!imagePullSecrets) { return ; } return this.renderSecretLinks(imagePullSecrets); } renderSecretLinks(secrets: Secret[]) { return secrets.map((secret) => { if (secret.getId() === null) { return (
{secret.getName()}
); } return ( {secret.getName()} ); }); } generateDummySecretObject(name: string) { return new Secret({ apiVersion: "v1", kind: "Secret", metadata: { name, uid: null, selfLink: null, resourceVersion: null } }); } render() { const { object: serviceAccount } = this.props; if (!serviceAccount) { return null; } const tokens = secretsStore.items.filter(secret => secret.getNs() == serviceAccount.getNs() && secret.getAnnotations().some(annot => annot == `kubernetes.io/service-account.name: ${serviceAccount.getName()}`) ); const imagePullSecrets = serviceAccount.getImagePullSecrets(); return (
{tokens.length > 0 && {this.renderSecretLinks(tokens)} } {imagePullSecrets.length > 0 && {this.renderImagePullSecrets()} }
{this.renderSecrets()}
); } } kubeObjectDetailRegistry.add({ kind: "ServiceAccount", apiVersions: ["v1"], components: { Details: (props) => } }); kubeObjectDetailRegistry.add({ kind: "ServiceAccount", apiVersions: ["v1"], priority: 5, components: { Details: (props) => } });