From f60cdc17b00995c11cf65f605a3b5820b81cc231 Mon Sep 17 00:00:00 2001 From: Dalena Date: Fri, 25 Oct 2024 13:41:10 -0500 Subject: [PATCH 1/6] fix: update workspaces --- silverback/_cli.py | 4 +++- silverback/cluster/client.py | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/silverback/_cli.py b/silverback/_cli.py index 9368d375..bdd66cd1 100644 --- a/silverback/_cli.py +++ b/silverback/_cli.py @@ -330,13 +330,15 @@ def update_workspace( raise click.UsageError( "No update name or slug found. Please enter a name or slug to update." ) + elif update_name == "" or update_slug == "": + raise click.UsageError("Empty string value found for name or slug.") platform.update_workspace( workspace=workspace, update_name=update_name, update_slug=update_slug, ) - click.echo(f"{click.style('SUCCESS', fg='green')}: Updated '{update_name}'") + click.echo(f"{click.style('SUCCESS', fg='green')}: Updated '{workspace}'") @workspaces.command(name="delete", section="Platform Commands (https://silverback.apeworx.io)") diff --git a/silverback/cluster/client.py b/silverback/cluster/client.py index 2e084c95..a8c870b1 100644 --- a/silverback/cluster/client.py +++ b/silverback/cluster/client.py @@ -464,9 +464,14 @@ def update_workspace( update_name: str | None, ): workspace_id = self.workspaces[workspace].id + form_data = dict() + if update_slug: + form_data["slug"] = update_slug + if update_name: + form_data["name"] = update_name response = self.patch( f"/workspaces/{workspace_id}", - data=dict(slug=update_slug, name=update_name), + data=form_data, ) handle_error_with_response(response) update_workspace = Workspace.model_validate_json(response.text) From 41f7f7562a275a443ae2856944893356ce5198eb Mon Sep 17 00:00:00 2001 From: Dalena Date: Fri, 25 Oct 2024 16:08:05 -0500 Subject: [PATCH 2/6] refactor: refactor remove and update workspaces --- silverback/_cli.py | 31 ++++++++++++------------ silverback/cluster/client.py | 47 ++++++++++++++++-------------------- 2 files changed, 36 insertions(+), 42 deletions(-) diff --git a/silverback/_cli.py b/silverback/_cli.py index bdd66cd1..3bf2d200 100644 --- a/silverback/_cli.py +++ b/silverback/_cli.py @@ -304,13 +304,13 @@ def new_workspace( @click.option( "-n", "--name", - "update_name", + "name", help="Update name for workspace", ) @click.option( "-s", "--slug", - "update_slug", + "slug", help="Update slug for workspace", ) @click.argument("workspace") @@ -318,27 +318,26 @@ def new_workspace( def update_workspace( platform: PlatformClient, workspace: str, - update_name: str | None, - update_slug: str | None, + name: str | None, + slug: str | None, ): """Update name and slug for a workspace""" - if not (platform.workspaces.get(workspace)): + if not (workspace_client := platform.workspaces.get(workspace)): raise click.BadOptionUsage("workspace", f"Unknown workspace '{workspace}'") - elif update_name is None and update_slug is None: + elif name is None and slug is None: raise click.UsageError( "No update name or slug found. Please enter a name or slug to update." ) - elif update_name == "" or update_slug == "": + elif name == "" or slug == "": raise click.UsageError("Empty string value found for name or slug.") - platform.update_workspace( - workspace=workspace, - update_name=update_name, - update_slug=update_slug, + workspace = workspace_client.update( + name=name, + slug=slug, ) - click.echo(f"{click.style('SUCCESS', fg='green')}: Updated '{workspace}'") + click.echo(f"{click.style('SUCCESS', fg='green')}: Updated '{workspace.name}'") @workspaces.command(name="delete", section="Platform Commands (https://silverback.apeworx.io)") @@ -347,14 +346,14 @@ def update_workspace( def delete_workspace(platform: PlatformClient, workspace: str): """Delete an empty Workspace on the Silverback Platform""" - if not (workspace_client := platform.workspaces.get(workspace)): + if not (workspace := platform.workspaces.get(workspace)): raise click.BadOptionUsage("workspace", f"Unknown workspace '{workspace}'") - if len(workspace_client.clusters) > 0: + if len(workspace.clusters) > 0: raise click.UsageError("Running Clusters found in Workspace. Shut them down first.") - platform.remove_workspace(workspace) - click.echo(f"{click.style('SUCCESS', fg='green')}: Deleted '{workspace}'") + workspace.remove() + click.echo(f"{click.style('SUCCESS', fg='green')}: Deleted '{workspace.name}'") @cluster.command(name="list", section="Platform Commands (https://silverback.apeworx.io)") diff --git a/silverback/cluster/client.py b/silverback/cluster/client.py index a8c870b1..6a2824d0 100644 --- a/silverback/cluster/client.py +++ b/silverback/cluster/client.py @@ -402,6 +402,27 @@ def get_payment_stream(self, cluster: ClusterInfo, chain_id: int) -> Stream | No return Stream(manager=StreamManager(stream_info.manager), id=stream_info.stream_id) + def update( + self, + name: str | None = None, + slug: str | None = None, + ) -> "Workspace": + data = dict() + if name: + data["name"] = name + if slug: + data["slug"] = slug + response = self.client.patch( + f"/workspaces/{self.id}", + data=data, + ) + handle_error_with_response(response) + return Workspace.model_validate_json(response.text) + + def remove(self): + response = self.client.delete(f"/workspaces/{self.id}") + handle_error_with_response(response) + class PlatformClient(httpx.Client): def __init__(self, *args, **kwargs): @@ -452,32 +473,6 @@ def create_workspace( self.workspaces.update({new_workspace.slug: new_workspace}) # NOTE: Update cache return new_workspace - def remove_workspace(self, workspace_slug): - workspace_id = self.workspaces[workspace_slug].id - response = self.delete(f"/workspaces/{workspace_id}") - handle_error_with_response(response) - - def update_workspace( - self, - workspace: str, - update_slug: str | None, - update_name: str | None, - ): - workspace_id = self.workspaces[workspace].id - form_data = dict() - if update_slug: - form_data["slug"] = update_slug - if update_name: - form_data["name"] = update_name - response = self.patch( - f"/workspaces/{workspace_id}", - data=form_data, - ) - handle_error_with_response(response) - update_workspace = Workspace.model_validate_json(response.text) - self.workspaces.update({update_workspace.slug: update_workspace}) # NOTE: Update cache - return update_workspace - def get_stream_manager(self, chain_id: int) -> StreamManager: response = self.get(f"/streams/manager/{chain_id}") handle_error_with_response(response) From fd395c43d565237d0dcde73a21f281b0ff229ecd Mon Sep 17 00:00:00 2001 From: Dalena Date: Fri, 25 Oct 2024 16:15:47 -0500 Subject: [PATCH 3/6] fix: mypy --- silverback/_cli.py | 8 ++++---- silverback/cluster/client.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/silverback/_cli.py b/silverback/_cli.py index 3bf2d200..9ccbe89a 100644 --- a/silverback/_cli.py +++ b/silverback/_cli.py @@ -346,14 +346,14 @@ def update_workspace( def delete_workspace(platform: PlatformClient, workspace: str): """Delete an empty Workspace on the Silverback Platform""" - if not (workspace := platform.workspaces.get(workspace)): + if not (workspace_client := platform.workspaces.get(workspace)): raise click.BadOptionUsage("workspace", f"Unknown workspace '{workspace}'") - if len(workspace.clusters) > 0: + if len(workspace_client.clusters) > 0: raise click.UsageError("Running Clusters found in Workspace. Shut them down first.") - workspace.remove() - click.echo(f"{click.style('SUCCESS', fg='green')}: Deleted '{workspace.name}'") + workspace_client.remove() + click.echo(f"{click.style('SUCCESS', fg='green')}: Deleted '{workspace_client.name}'") @cluster.command(name="list", section="Platform Commands (https://silverback.apeworx.io)") diff --git a/silverback/cluster/client.py b/silverback/cluster/client.py index 6a2824d0..462670e2 100644 --- a/silverback/cluster/client.py +++ b/silverback/cluster/client.py @@ -406,7 +406,7 @@ def update( self, name: str | None = None, slug: str | None = None, - ) -> "Workspace": + ) -> WorkspaceInfo: data = dict() if name: data["name"] = name From f29923189aedb7974efb5ee5a031eca5e038dcf4 Mon Sep 17 00:00:00 2001 From: Dalena Date: Fri, 25 Oct 2024 16:17:07 -0500 Subject: [PATCH 4/6] fix: add default --- silverback/_cli.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/silverback/_cli.py b/silverback/_cli.py index 9ccbe89a..55d42944 100644 --- a/silverback/_cli.py +++ b/silverback/_cli.py @@ -305,12 +305,14 @@ def new_workspace( "-n", "--name", "name", + default=None, help="Update name for workspace", ) @click.option( "-s", "--slug", "slug", + default=None, help="Update slug for workspace", ) @click.argument("workspace") From a51ca784d1c7ae20b78e25a60e7ab69a13391952 Mon Sep 17 00:00:00 2001 From: Dalena Date: Fri, 25 Oct 2024 16:30:24 -0500 Subject: [PATCH 5/6] fix: mypy --- silverback/cluster/client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/silverback/cluster/client.py b/silverback/cluster/client.py index 462670e2..6000fe6d 100644 --- a/silverback/cluster/client.py +++ b/silverback/cluster/client.py @@ -406,7 +406,7 @@ def update( self, name: str | None = None, slug: str | None = None, - ) -> WorkspaceInfo: + ) -> "Workspace": data = dict() if name: data["name"] = name @@ -417,7 +417,7 @@ def update( data=data, ) handle_error_with_response(response) - return Workspace.model_validate_json(response.text) + return Workspace.model_validate(response.json()) def remove(self): response = self.client.delete(f"/workspaces/{self.id}") From 283ca99fbaa866421633dcd53eb123159452f694 Mon Sep 17 00:00:00 2001 From: Dalena Date: Fri, 25 Oct 2024 16:39:56 -0500 Subject: [PATCH 6/6] fix: mypy --- silverback/_cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/silverback/_cli.py b/silverback/_cli.py index 55d42944..15e1b80c 100644 --- a/silverback/_cli.py +++ b/silverback/_cli.py @@ -335,11 +335,11 @@ def update_workspace( elif name == "" or slug == "": raise click.UsageError("Empty string value found for name or slug.") - workspace = workspace_client.update( + updated_workspace = workspace_client.update( name=name, slug=slug, ) - click.echo(f"{click.style('SUCCESS', fg='green')}: Updated '{workspace.name}'") + click.echo(f"{click.style('SUCCESS', fg='green')}: Updated '{updated_workspace.name}'") @workspaces.command(name="delete", section="Platform Commands (https://silverback.apeworx.io)")