aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arthur/apis/kubernetes/certificates.py14
-rw-r--r--arthur/exts/kubernetes/certificates.py47
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)