diff options
| -rw-r--r-- | arthur/apis/kubernetes/certificates.py | 14 | ||||
| -rw-r--r-- | arthur/exts/kubernetes/certificates.py | 47 |
2 files changed, 35 insertions, 26 deletions
diff --git a/arthur/apis/kubernetes/certificates.py b/arthur/apis/kubernetes/certificates.py new file mode 100644 index 0000000..45ce9ec --- /dev/null +++ b/arthur/apis/kubernetes/certificates.py @@ -0,0 +1,14 @@ +"""APIs for interacting with TLS certificates through cert-manager.io CRDs.""" +from typing import Any + +from kubernetes_asyncio import client +from kubernetes_asyncio.client.api_client import ApiClient + + +async def list_certificates(namespace: str) -> dict[str, Any]: + """List certificate objects created through cert-manager.""" + async with ApiClient() as api: + api = client.CustomObjectsApi(api) + return await api.list_namespaced_custom_object( + "cert-manager.io", "v1", namespace, "certificates" + ) diff --git a/arthur/exts/kubernetes/certificates.py b/arthur/exts/kubernetes/certificates.py index 2058761..f8653ba 100644 --- a/arthur/exts/kubernetes/certificates.py +++ b/arthur/exts/kubernetes/certificates.py @@ -4,9 +4,8 @@ from textwrap import dedent from discord import Embed from discord.ext import commands -from kubernetes_asyncio import client -from kubernetes_asyncio.client.api_client import ApiClient +from arthur.apis.kubernetes import certificates from arthur.bot import KingArthur from arthur.utils import datetime_to_discord @@ -25,32 +24,28 @@ class Certificates(commands.Cog): @certificates.command(name="list", aliases=["ls"]) async def certificates_list(self, ctx: commands.Context, namespace: str = "default") -> None: """List TLS certificates in the selected namespace (defaults to default).""" - async with ApiClient() as api: - v1 = client.CustomObjectsApi(api) - ret = await v1.list_namespaced_custom_object( - "cert-manager.io", "v1", namespace, "certificates" + certs = certificates.list_certificates(namespace) + + return_embed = Embed(title=f"Certificates in namespace {namespace}") + + for certificate in certs["items"]: + expiry = datetime.fromisoformat( + certificate["status"]["notAfter"].rstrip("Z") + "+00:00" + ) + renews = datetime.fromisoformat( + certificate["status"]["renewalTime"].rstrip("Z") + "+00:00" + ) + body = dedent( + f""" + **Subjects:** {", ".join(certificate["spec"]["dnsNames"])} + **Issuer:** {certificate["spec"]["issuerRef"]["name"]} + **Status:** {certificate["status"]["conditions"][0]["message"]} + **Expires:** {datetime_to_discord(expiry)} ({datetime_to_discord(expiry, "R")}) + **Renews:** {datetime_to_discord(renews)} ({datetime_to_discord(renews, "R")}) + """ ) - return_embed = Embed(title=f"Certificates in namespace {namespace}") - - for certificate in ret["items"]: - expiry = datetime.fromisoformat( - certificate["status"]["notAfter"].rstrip("Z") + "+00:00" - ) - renews = datetime.fromisoformat( - certificate["status"]["renewalTime"].rstrip("Z") + "+00:00" - ) - body = dedent( - f""" - **Subjects:** {", ".join(certificate["spec"]["dnsNames"])} - **Issuer:** {certificate["spec"]["issuerRef"]["name"]} - **Status:** {certificate["status"]["conditions"][0]["message"]} - **Expires:** {datetime_to_discord(expiry)} ({datetime_to_discord(expiry, "R")}) - **Renews:** {datetime_to_discord(renews)} ({datetime_to_discord(renews, "R")}) - """ - ) - - return_embed.add_field(name=certificate["metadata"]["name"], value=body.strip()) + return_embed.add_field(name=certificate["metadata"]["name"], value=body.strip()) await ctx.send(embed=return_embed) |