Skip to content

Commit 7dc07c1

Browse files
authored
feat: add openstack project self service to cli (#9)
2 parents 6ff09ec + f9a07da commit 7dc07c1

6 files changed

Lines changed: 118 additions & 2 deletions

File tree

labctl/commands/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
from .config import app as config_app
22
from .devices import app as devices_app
33
from .admin import app as admin_app
4+
from .openstack import app as openstack_app

labctl/commands/admin/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
app = typer.Typer()
66

77
app.add_typer(users_app, name="users")
8-
app.add_typer(vpn_app, name="vpn")
8+
app.add_typer(vpn_app, name="vpn")

labctl/commands/devices.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def enroll():
6060
key_rsp = api_driver.get(f"/devices/{config.username}/preauthkey")
6161
key = key_rsp.json().get("key")
6262
print("Running tailscale login...")
63-
cmd = [bin, "login", "--login-server", "https://gw.laboinfra.net", "--auth-key", key, "--accept-routes", "true"]
63+
cmd = [bin, "login", "--login-server", "https://gw.laboinfra.net", "--auth-key", key, "--accept-routes"]
6464
print("Execeuting: " + " ".join(cmd))
6565
print("Output: " + run(cmd, stdout=PIPE).stdout.decode())
6666

labctl/commands/openstack.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
from typer import Typer
2+
from labctl.core import cli_ready, Config, APIDriver, console
3+
from rich.progress import Progress
4+
from rich.table import Table
5+
6+
app = Typer()
7+
project = Typer()
8+
app.add_typer(project, name="project")
9+
## OpenStack commands
10+
# reset-password
11+
# project list
12+
# project create <name>
13+
# project delete <name>
14+
# project add-user <project> <user>
15+
# project del-user <project> <user>
16+
# project list-users <project>
17+
18+
@cli_ready
19+
@app.command(name="reset-password")
20+
def reset_password():
21+
"""
22+
Reset OpenStack password
23+
"""
24+
console.print("[cyan]Resetting your OpenStack user password[/cyan]")
25+
config = Config()
26+
call = APIDriver().put(f"/openstack/users/{config.username}/reset-password")
27+
if call.status_code >= 400:
28+
console.print(f"[red]Error: {call.text}[/red]")
29+
return
30+
console.print(f"[green]New password for {config.username} is [/green][bright_yellow]{call.json()['password']}[/bright_yellow]")
31+
console.print("[yellow]Please change it after login on console[/yellow]")
32+
33+
@cli_ready
34+
@project.command(name="list")
35+
def list_projects():
36+
"""
37+
List OpenStack projects
38+
"""
39+
config = Config()
40+
console.print("[cyan]Listing OpenStack projects[/cyan]")
41+
call = APIDriver().get(f"/openstack/projects/{config.username}")
42+
if call.status_code >= 400:
43+
console.print(f"[red]Error: {call.text}[/red]")
44+
return
45+
table = Table(title="Projects")
46+
table.add_column("Id")
47+
table.add_column("Name")
48+
for project in call.json():
49+
table.add_row(str(project['id']), project['name'])
50+
console.print(table)
51+
52+
@cli_ready
53+
@project.command(name="create")
54+
def create_project(name: str):
55+
"""
56+
Create OpenStack project
57+
"""
58+
config = Config()
59+
console.print(f"[cyan]Creating OpenStack project {name}[/cyan]")
60+
call = APIDriver().post(f"/openstack/projects/{name}")
61+
if call.status_code >= 400:
62+
console.print(f"[red]Error: {call.text}[/red]")
63+
return
64+
console.print(f"[green]Project {name} created[/green]")
65+
66+
@cli_ready
67+
@project.command(name="delete")
68+
def delete_project(name: str):
69+
"""
70+
Delete OpenStack project
71+
"""
72+
config = Config()
73+
console.print(f"[cyan]Deleting OpenStack project {name}[/cyan]")
74+
call = APIDriver().delete(f"/openstack/projects/{name}")
75+
if call.status_code >= 400:
76+
console.print(f"[red]Error: {call.text}[/red]")
77+
return
78+
console.print(f"[green]Project {name} deleted[/green]")
79+
80+
@cli_ready
81+
@project.command(name="add-user")
82+
def add_user(project: str, user: str):
83+
"""
84+
Add user to OpenStack project
85+
"""
86+
console.print(f"[cyan]Adding user {user} to OpenStack project {project}[/cyan]")
87+
call = APIDriver().put(f"/openstack/projects/{project}/users/{user}")
88+
if call.status_code >= 400:
89+
console.print(f"[red]Error: {call.text}[/red]")
90+
return
91+
console.print(f"[green]User {user} added to project {project}[/green]")
92+
93+
@cli_ready
94+
@project.command(name="del-user")
95+
def del_user(project: str, user: str):
96+
"""
97+
Delete user from OpenStack project
98+
"""
99+
config = Config()
100+
console.print(f"[cyan]Deleting user {user} from OpenStack project {project}[/cyan]")
101+
call = APIDriver().delete(f"/openstack/projects/{project}/users/{user}")
102+
if call.status_code >= 400:
103+
console.print(f"[red]Error: {call.text}[/red]")
104+
return
105+
console.print(f"[green]User {user} deleted from project {project}[/green]")

labctl/core/api.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,12 @@ def post(self, path: str, data: dict = {}, json: dict = {}, additional_headers:
3838

3939
def delete(self, path: str) -> requests.Response:
4040
return requests.delete(self.api_url + path, headers=self.headers)
41+
42+
def put(self, path: str, data: dict = {}, json: dict = {}, additional_headers: dict = {}) -> requests.Response:
43+
headers = self.headers
44+
headers.update(additional_headers)
45+
if data:
46+
return requests.put(self.api_url + path, headers=headers, data=data)
47+
if json:
48+
return requests.put(self.api_url + path, headers=headers, json=json)
49+
return requests.put(self.api_url + path, headers=headers)

labctl/main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
app.add_typer(commands.config_app, name="config", help="Manage the configuration")
1414
app.add_typer(commands.devices_app, name="devices", help="Manage vpn devices")
15+
app.add_typer(commands.openstack_app, name="openstack", help="Manage openstack projects")
1516

1617
if Config().admin_cli:
1718
app.add_typer(commands.admin_app, name="admin", help="Admin commands")

0 commit comments

Comments
 (0)