From f9a07da925e70379173660e8a9077af92ba6bcf8 Mon Sep 17 00:00:00 2001 From: Gabin L Date: Sun, 26 Jan 2025 20:28:47 +0100 Subject: [PATCH] feat: add openstack project mngt Signed-off-by: Gabin L --- labctl/commands/__init__.py | 1 + labctl/commands/admin/__init__.py | 2 +- labctl/commands/devices.py | 2 +- labctl/commands/openstack.py | 105 ++++++++++++++++++++++++++++++ labctl/core/api.py | 9 +++ labctl/main.py | 1 + 6 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 labctl/commands/openstack.py diff --git a/labctl/commands/__init__.py b/labctl/commands/__init__.py index 1fbd00d..8a401b5 100644 --- a/labctl/commands/__init__.py +++ b/labctl/commands/__init__.py @@ -1,3 +1,4 @@ from .config import app as config_app from .devices import app as devices_app from .admin import app as admin_app +from .openstack import app as openstack_app \ No newline at end of file diff --git a/labctl/commands/admin/__init__.py b/labctl/commands/admin/__init__.py index 815e6f2..22e9932 100644 --- a/labctl/commands/admin/__init__.py +++ b/labctl/commands/admin/__init__.py @@ -5,4 +5,4 @@ app = typer.Typer() app.add_typer(users_app, name="users") -app.add_typer(vpn_app, name="vpn") +app.add_typer(vpn_app, name="vpn") \ No newline at end of file diff --git a/labctl/commands/devices.py b/labctl/commands/devices.py index 2bc023e..22110b0 100644 --- a/labctl/commands/devices.py +++ b/labctl/commands/devices.py @@ -60,7 +60,7 @@ def enroll(): key_rsp = api_driver.get(f"/devices/{config.username}/preauthkey") key = key_rsp.json().get("key") print("Running tailscale login...") - cmd = [bin, "login", "--login-server", "https://gw.laboinfra.net", "--auth-key", key, "--accept-routes", "true"] + cmd = [bin, "login", "--login-server", "https://gw.laboinfra.net", "--auth-key", key, "--accept-routes"] print("Execeuting: " + " ".join(cmd)) print("Output: " + run(cmd, stdout=PIPE).stdout.decode()) diff --git a/labctl/commands/openstack.py b/labctl/commands/openstack.py new file mode 100644 index 0000000..cde5dd7 --- /dev/null +++ b/labctl/commands/openstack.py @@ -0,0 +1,105 @@ +from typer import Typer +from labctl.core import cli_ready, Config, APIDriver, console +from rich.progress import Progress +from rich.table import Table + +app = Typer() +project = Typer() +app.add_typer(project, name="project") +## OpenStack commands +# reset-password +# project list +# project create +# project delete +# project add-user +# project del-user +# project list-users + +@cli_ready +@app.command(name="reset-password") +def reset_password(): + """ + Reset OpenStack password + """ + console.print("[cyan]Resetting your OpenStack user password[/cyan]") + config = Config() + call = APIDriver().put(f"/openstack/users/{config.username}/reset-password") + if call.status_code >= 400: + console.print(f"[red]Error: {call.text}[/red]") + return + console.print(f"[green]New password for {config.username} is [/green][bright_yellow]{call.json()['password']}[/bright_yellow]") + console.print("[yellow]Please change it after login on console[/yellow]") + +@cli_ready +@project.command(name="list") +def list_projects(): + """ + List OpenStack projects + """ + config = Config() + console.print("[cyan]Listing OpenStack projects[/cyan]") + call = APIDriver().get(f"/openstack/projects/{config.username}") + if call.status_code >= 400: + console.print(f"[red]Error: {call.text}[/red]") + return + table = Table(title="Projects") + table.add_column("Id") + table.add_column("Name") + for project in call.json(): + table.add_row(str(project['id']), project['name']) + console.print(table) + +@cli_ready +@project.command(name="create") +def create_project(name: str): + """ + Create OpenStack project + """ + config = Config() + console.print(f"[cyan]Creating OpenStack project {name}[/cyan]") + call = APIDriver().post(f"/openstack/projects/{name}") + if call.status_code >= 400: + console.print(f"[red]Error: {call.text}[/red]") + return + console.print(f"[green]Project {name} created[/green]") + +@cli_ready +@project.command(name="delete") +def delete_project(name: str): + """ + Delete OpenStack project + """ + config = Config() + console.print(f"[cyan]Deleting OpenStack project {name}[/cyan]") + call = APIDriver().delete(f"/openstack/projects/{name}") + if call.status_code >= 400: + console.print(f"[red]Error: {call.text}[/red]") + return + console.print(f"[green]Project {name} deleted[/green]") + +@cli_ready +@project.command(name="add-user") +def add_user(project: str, user: str): + """ + Add user to OpenStack project + """ + console.print(f"[cyan]Adding user {user} to OpenStack project {project}[/cyan]") + call = APIDriver().put(f"/openstack/projects/{project}/users/{user}") + if call.status_code >= 400: + console.print(f"[red]Error: {call.text}[/red]") + return + console.print(f"[green]User {user} added to project {project}[/green]") + +@cli_ready +@project.command(name="del-user") +def del_user(project: str, user: str): + """ + Delete user from OpenStack project + """ + config = Config() + console.print(f"[cyan]Deleting user {user} from OpenStack project {project}[/cyan]") + call = APIDriver().delete(f"/openstack/projects/{project}/users/{user}") + if call.status_code >= 400: + console.print(f"[red]Error: {call.text}[/red]") + return + console.print(f"[green]User {user} deleted from project {project}[/green]") diff --git a/labctl/core/api.py b/labctl/core/api.py index 10300bd..d22c558 100644 --- a/labctl/core/api.py +++ b/labctl/core/api.py @@ -38,3 +38,12 @@ def post(self, path: str, data: dict = {}, json: dict = {}, additional_headers: def delete(self, path: str) -> requests.Response: return requests.delete(self.api_url + path, headers=self.headers) + + def put(self, path: str, data: dict = {}, json: dict = {}, additional_headers: dict = {}) -> requests.Response: + headers = self.headers + headers.update(additional_headers) + if data: + return requests.put(self.api_url + path, headers=headers, data=data) + if json: + return requests.put(self.api_url + path, headers=headers, json=json) + return requests.put(self.api_url + path, headers=headers) diff --git a/labctl/main.py b/labctl/main.py index ac8c5a2..f146e1c 100644 --- a/labctl/main.py +++ b/labctl/main.py @@ -12,6 +12,7 @@ app.add_typer(commands.config_app, name="config", help="Manage the configuration") app.add_typer(commands.devices_app, name="devices", help="Manage vpn devices") +app.add_typer(commands.openstack_app, name="openstack", help="Manage openstack projects") if Config().admin_cli: app.add_typer(commands.admin_app, name="admin", help="Admin commands")