Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions labctl/commands/__init__.py
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion labctl/commands/admin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
2 changes: 1 addition & 1 deletion labctl/commands/devices.py
Original file line number Diff line number Diff line change
Expand Up @@ -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())

Expand Down
105 changes: 105 additions & 0 deletions labctl/commands/openstack.py
Original file line number Diff line number Diff line change
@@ -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 <name>
# project delete <name>
# project add-user <project> <user>
# project del-user <project> <user>
# project list-users <project>

@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]")
9 changes: 9 additions & 0 deletions labctl/core/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
1 change: 1 addition & 0 deletions labctl/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Loading