diff options
author | 2021-07-18 03:26:26 +0100 | |
---|---|---|
committer | 2021-07-18 03:26:26 +0100 | |
commit | 949b7e346640decd8ddc3b5bd37bbe4a9b9ca2e3 (patch) | |
tree | a82b458c0ba81b71a3eaad5f56a084cccff38397 /arthur/exts/kubernetes/deployments.py | |
parent | feat: add ls alises for listing commands (diff) |
feat: use message components to confirm deployments
Diffstat (limited to 'arthur/exts/kubernetes/deployments.py')
-rw-r--r-- | arthur/exts/kubernetes/deployments.py | 132 |
1 files changed, 97 insertions, 35 deletions
diff --git a/arthur/exts/kubernetes/deployments.py b/arthur/exts/kubernetes/deployments.py index aca4245..070e65b 100644 --- a/arthur/exts/kubernetes/deployments.py +++ b/arthur/exts/kubernetes/deployments.py @@ -1,8 +1,10 @@ """The Deployments cog helps with managing Kubernetes deployments.""" +import asyncio from datetime import datetime, timezone from discord import Colour, Embed from discord.ext import commands +from discord_components.component import ActionRow, Button, ButtonStyle from kubernetes_asyncio import client from kubernetes_asyncio.client.api_client import ApiClient from kubernetes_asyncio.client.rest import ApiException @@ -64,54 +66,114 @@ class Deployments(commands.Cog): await ctx.send(embed=return_embed) - @deployments.command(name="restart") + @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).""" - async with ApiClient() as api: - v1 = client.AppsV1Api(api) + 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", + style=ButtonStyle.green, + custom_id=f"{ctx.message.id}-redeploy", + ), + Button( + label="Abort", + style=ButtonStyle.red, + custom_id=f"{ctx.message.id}-abort", + ), + ) - try: - await v1.patch_namespaced_deployment( - name=deployment, - namespace=namespace, - body={ - "spec": { - "template": { - "metadata": { - "annotations": { - "king-arthur.pythondiscord.com/restartedAt": datetime.now( - timezone.utc - ).isoformat() + msg = await ctx.send( + embed=confirm_embed, + components=[components], + ) + + try: + interaction = await self.bot.wait_for( + "button_click", + check=lambda i: i.component.custom_id.startswith(str(ctx.message.id)) + and i.user.id == ctx.author.id, + timeout=30, + ) + except asyncio.TimeoutError: + await msg.edit( + embed=Embed( + title="Confirm timed out", + description="Respond earlier when making your choice.", + colour=Colour.greyple(), + ), + components=[], + ) + + if interaction.component.custom_id == f"{ctx.message.id}-abort": + await interaction.respond( + ephemeral=False, + embed=Embed( + title="Deployment aborted", + description="The deployment was aborted.", + colour=Colour.red(), + ), + ) + else: + async with ApiClient() as api: + v1 = client.AppsV1Api(api) + + try: + await v1.patch_namespaced_deployment( + name=deployment, + namespace=namespace, + body={ + "spec": { + "template": { + "metadata": { + "annotations": { + "king-arthur.pydis.com/restartedAt": datetime.now( + timezone.utc + ).isoformat() + } } } } - } - }, - field_manager="King Arthur", - ) - except ApiException as e: - if e.status == 404: - return await ctx.send( - embed=generate_error_embed( - description="Could not find deployment, check the namespace." - ) + }, + field_manager="King Arthur", ) + except ApiException as e: + if e.status == 404: + return await interaction.respond( + ephemeral=False, + embed=generate_error_embed( + description="Could not find deployment, check the namespace.", + ), + ) - return await ctx.send( - embed=generate_error_embed( - description=f"Unexpected error occurred, error code {e.status}" + return await interaction.respond( + ephemeral=False, + embed=generate_error_embed( + description=f"Unexpected error occurred, error code {e.status}" + ), + ) + else: + description = f"Restarted deployment `{deployment}` in namespace `{namespace}`." + await interaction.respond( + ephemeral=False, + embed=Embed( + title="Redeployed", + description=description, + colour=Colour.blurple(), + ), ) - ) - return_embed = Embed( - title="Deployment restarted", - description=f"Restarted deployment `{deployment}` in the `{namespace}` namespace.", - colour=Colour.blurple(), - ) + for component in components.components: + component.disabled = True - await ctx.send(embed=return_embed) + await msg.edit(embed=confirm_embed, components=[components]) def setup(bot: KingArthur) -> None: |