aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arthur/exts/error_handler/error_handler.py6
-rw-r--r--arthur/exts/kubernetes/certificates.py42
-rw-r--r--arthur/exts/kubernetes/deployments.py53
-rw-r--r--arthur/exts/kubernetes/nodes.py49
-rw-r--r--arthur/utils.py16
5 files changed, 82 insertions, 84 deletions
diff --git a/arthur/exts/error_handler/error_handler.py b/arthur/exts/error_handler/error_handler.py
index 09653f8..2a61f40 100644
--- a/arthur/exts/error_handler/error_handler.py
+++ b/arthur/exts/error_handler/error_handler.py
@@ -4,7 +4,7 @@ from discord.ext import commands
from discord.ext.commands import Cog
from arthur.bot import KingArthur
-from arthur.utils import generate_error_embed
+from arthur.utils import generate_error_message
class ErrorHandler(Cog):
@@ -38,7 +38,7 @@ class ErrorHandler(Cog):
elif isinstance(error, commands.CommandInvokeError):
await self._add_error_reaction(ctx.message)
await ctx.send(
- embed=generate_error_embed(
+ generate_error_message(
description=(
f"Command raised an error: `{error.original.__class__.__name__}:"
f" {error.original}`"
@@ -47,7 +47,7 @@ class ErrorHandler(Cog):
)
else:
await ctx.send(
- embed=generate_error_embed(
+ generate_error_message(
description=(
f"Unknown exception occurred: `{error.__class__.__name__}:"
f" {error}`"
diff --git a/arthur/exts/kubernetes/certificates.py b/arthur/exts/kubernetes/certificates.py
index bb08655..951a968 100644
--- a/arthur/exts/kubernetes/certificates.py
+++ b/arthur/exts/kubernetes/certificates.py
@@ -1,13 +1,11 @@
"""The Certificates cog helps with managing TLS certificates."""
-from datetime import datetime
from textwrap import dedent
-from discord import Embed
from discord.ext import commands
+from tabulate import tabulate
from arthur.apis.kubernetes import certificates
from arthur.bot import KingArthur
-from arthur.utils import datetime_to_discord
class Certificates(commands.Cog):
@@ -26,28 +24,32 @@ class Certificates(commands.Cog):
"""List TLS certificates in the selected namespace (defaults to default)."""
certs = await certificates.list_certificates(namespace)
- return_embed = Embed(title=f"Certificates in namespace {namespace}")
+ table_data = []
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")})
- """
+ table_data.append(
+ [
+ certificate["metadata"]["name"],
+ ", ".join(certificate["spec"]["dnsNames"]),
+ certificate["spec"]["issuerRef"]["name"],
+ certificate["status"]["conditions"][0]["message"],
+ ]
)
- return_embed.add_field(name=certificate["metadata"]["name"], value=body.strip())
+ table = tabulate(
+ table_data, headers=["Name", "DNS Names", "Issuer", "Status"], tablefmt="psql"
+ )
+
+ return_message = dedent(
+ f"""
+ **Certificates in namespace `{namespace}`**
+ ```
+ {table}
+ ```
+ """
+ )
- await ctx.send(embed=return_embed)
+ await ctx.send(return_message)
def setup(bot: KingArthur) -> None:
diff --git a/arthur/exts/kubernetes/deployments.py b/arthur/exts/kubernetes/deployments.py
index 92deacc..a12442a 100644
--- a/arthur/exts/kubernetes/deployments.py
+++ b/arthur/exts/kubernetes/deployments.py
@@ -1,7 +1,7 @@
"""The Deployments cog helps with managing Kubernetes deployments."""
import asyncio
+from textwrap import dedent
-from discord import Colour, Embed
from discord.ext import commands
from discord_components.component import ActionRow, Button, ButtonStyle
from kubernetes_asyncio.client.models import V1Deployment
@@ -10,7 +10,7 @@ from tabulate import tabulate
from arthur.apis.kubernetes import deployments
from arthur.bot import KingArthur
-from arthur.utils import generate_error_embed
+from arthur.utils import generate_error_message
def deployment_to_emote(deployment: V1Deployment) -> str:
@@ -67,23 +67,22 @@ class Deployments(commands.Cog):
colalign=("center", "left", "center"),
)
- return_embed = Embed(
- title=f"Deployments in namespace {namespace}", description=f"```\n{table}\n```"
+ return_message = dedent(
+ f"""
+ **Deployments in namespace `{namespace}`**
+ ```
+ {table}
+ ```
+ """
)
- await ctx.send(embed=return_embed)
+ await ctx.send(return_message)
@deployments.command(name="restart", aliases=["redeploy"])
async def deployments_restart(
self, ctx: commands.Context, deployment: str, namespace: str = "default"
) -> None:
"""Restart the specified deployment in the selected namespace (defaults to default)."""
- confirm_embed = Embed(
- title="Confirm redeployment",
- description=f"Confirm you want to redeploy `{deployment}` in namespace `{namespace}`.",
- colour=Colour.orange(),
- )
-
components = ActionRow(
Button(
label="Redeploy",
@@ -98,7 +97,7 @@ class Deployments(commands.Cog):
)
msg = await ctx.send(
- embed=confirm_embed,
+ f":warning: Please confirm you want to restart `deploy/{deployment}` in `{namespace}`",
components=[components],
)
@@ -111,25 +110,20 @@ class Deployments(commands.Cog):
)
except asyncio.TimeoutError:
return await msg.edit(
- embed=Embed(
+ generate_error_message(
title="What is the airspeed velocity of an unladen swallow?",
description=(
"Whatever the answer may be, it's certainly "
"faster than you could select a confirmation option."
),
- colour=Colour.greyple(),
),
components=[],
)
if interaction.component.custom_id == f"{ctx.message.id}-abort":
await interaction.respond(
+ ":x: Redeployment aborted",
ephemeral=False,
- embed=Embed(
- title="Deployment aborted",
- description="The deployment was aborted.",
- colour=Colour.red(),
- ),
)
else:
try:
@@ -137,33 +131,32 @@ class Deployments(commands.Cog):
except ApiException as e:
if e.status == 404:
return await interaction.respond(
- ephemeral=False,
- embed=generate_error_embed(
+ generate_error_message(
description="Could not find deployment, check the namespace.",
),
+ ephemeral=False
)
return await interaction.respond(
- ephemeral=False,
- embed=generate_error_embed(
+ generate_error_message(
description=f"Unexpected error occurred, error code {e.status}"
),
+ ephemeral=False
)
else:
- description = f"Restarted deployment `{deployment}` in namespace `{namespace}`."
+ description = (
+ f":white_check_mark: Restarted deployment "
+ f"`{deployment}` in namespace `{namespace}`."
+ )
await interaction.respond(
+ description,
ephemeral=False,
- embed=Embed(
- title="Redeployed",
- description=description,
- colour=Colour.blurple(),
- ),
)
for component in components.components:
component.disabled = True
- await msg.edit(embed=confirm_embed, components=[components])
+ await msg.edit(components=[components])
def setup(bot: KingArthur) -> None:
diff --git a/arthur/exts/kubernetes/nodes.py b/arthur/exts/kubernetes/nodes.py
index b5cfc29..f7ac42e 100644
--- a/arthur/exts/kubernetes/nodes.py
+++ b/arthur/exts/kubernetes/nodes.py
@@ -1,12 +1,11 @@
"""The Nodes cog helps with managing Kubernetes nodes."""
-import textwrap
+from textwrap import dedent
-from discord import Embed
from discord.ext import commands
+from tabulate import tabulate
from arthur.apis.kubernetes import nodes
from arthur.bot import KingArthur
-from arthur.utils import datetime_to_discord
class Nodes(commands.Cog):
@@ -25,7 +24,7 @@ class Nodes(commands.Cog):
"""List Kubernetes nodes in the cluster."""
cluster_nodes = await nodes.list_nodes()
- return_embed = Embed(title="Cluster nodes")
+ table_data = []
for node in cluster_nodes.items:
statuses = []
@@ -50,19 +49,27 @@ class Nodes(commands.Cog):
node_creation = node.metadata.creation_timestamp
- return_embed.add_field(
- name=node.metadata.name,
- value=textwrap.dedent(
- f"""
- **Status:** {", ".join(statuses)}
- **Kubernetes version:** {node.status.node_info.kubelet_version}
- **Created**: {datetime_to_discord(node_creation, "R")}
- """
- ),
- inline=False,
+ table_data.append(
+ [
+ node.metadata.name,
+ ", ".join(statuses),
+ node.status.node_info.kubelet_version,
+ node_creation,
+ ]
)
- await ctx.send(embed=return_embed)
+ table = tabulate(table_data, headers=["Name", "Status", "Kubernetes Version", "Created"])
+
+ return_message = dedent(
+ f"""
+ **Cluster nodes**
+ ```
+ {table}
+ ```
+ """
+ )
+
+ await ctx.send(return_message)
@nodes.command(name="cordon")
async def nodes_cordon(self, ctx: commands.Context, *, node: str) -> None:
@@ -74,10 +81,8 @@ class Nodes(commands.Cog):
await nodes.cordon_node(node)
await ctx.send(
- embed=Embed(
- title=f"Cordoned {node}",
- description=f"`{node}` is now cordoned and no pods will be scheduled to it.",
- )
+ f":construction: **Cordoned {node}** `{node}` is now "
+ "cordoned and no pods will be scheduled to it."
)
@nodes.command(name="uncordon")
@@ -90,10 +95,8 @@ class Nodes(commands.Cog):
await nodes.uncordon_node(node)
await ctx.send(
- embed=Embed(
- title=f"Uncordoned {node}",
- description=f"`{node}` is now uncordoned, future pods may be scheduled to it.",
- )
+ f":construction: **Uncordoned {node}** `{node}` is now "
+ "uncordoned, future pods may be scheduled to it."
)
diff --git a/arthur/utils.py b/arthur/utils.py
index c81a47a..090abc5 100644
--- a/arthur/utils.py
+++ b/arthur/utils.py
@@ -2,15 +2,15 @@
from datetime import datetime
-from discord import Embed
-from discord.colour import Colour
-
-def generate_error_embed(
- *, title: str = "'Tis but a scratch!", description: str = "An error occurred"
-) -> Embed:
- """Generate an error embed to return to Discord."""
- return Embed(title=title, description=description, colour=Colour.red())
+def generate_error_message(
+ *,
+ title: str = "'Tis but a scratch!",
+ description: str = "An error occurred",
+ emote: str = ":no_entry_sign:",
+) -> str:
+ """Generate an error message to return to Discord."""
+ return f"{emote} **{description}** {description}"
def datetime_to_discord(time: datetime, format: str = "f") -> str: