Skip to content

Commit bc7fd39

Browse files
authored
Merge pull request #794 from rackerlabs/keystone-sync-20250320
feat: Adds 'uc-diff projects' to diff all projects
2 parents fa7e0f9 + a41be43 commit bc7fd39

File tree

4 files changed

+80
-2
lines changed

4 files changed

+80
-2
lines changed

python/diff-nautobot-understack/diff_nautobot_understack/cli.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
from diff_nautobot_understack.network.main import (
1111
openstack_network_diff_from_ucvni_network,
1212
)
13+
from diff_nautobot_understack.project.main import (
14+
openstack_all_projects_diff_from_nautobot_tenant,
15+
)
1316
from diff_nautobot_understack.project.main import (
1417
openstack_project_diff_from_nautobot_tenant,
1518
)
@@ -62,6 +65,19 @@ def tabular_output(diffs, title, id_column_name):
6265
console.print(table)
6366

6467

68+
@app.command()
69+
def projects(
70+
debug: bool = typer.Option(False, "--debug", "-v", help="Enable debug mode"),
71+
output_format: str = typer.Option(
72+
"json", "--format", help="Available formats json, table"
73+
),
74+
):
75+
"""OpenStack projects ⟹ Nautobot tenants"""
76+
settings.debug = debug
77+
diff_result = openstack_all_projects_diff_from_nautobot_tenant()
78+
display_output(diff_result, "project", output_format)
79+
80+
6581
@app.command()
6682
def project(
6783
name: str,
@@ -70,7 +86,7 @@ def project(
7086
"json", "--format", help="Available formats json, table"
7187
),
7288
):
73-
"""Nautobot tenantsOpenstack projects"""
89+
"""OpenStack projectsNautobot tenants"""
7490
settings.debug = debug
7591
diff_result = openstack_project_diff_from_nautobot_tenant(os_project=name)
7692
display_output(diff_result, "project", output_format)
@@ -83,7 +99,7 @@ def network(
8399
"json", "--format", help="Available formats json, table"
84100
),
85101
):
86-
"""Nautobot ucvnisOpenstack networks"""
102+
"""OpenStack networksNautobot UCVNIs"""
87103
settings.debug = debug
88104
diff_result = openstack_network_diff_from_ucvni_network()
89105
display_output(diff_result, "network", output_format)

python/diff-nautobot-understack/diff_nautobot_understack/project/adapters/nautobot_tenant.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,29 @@ def load(self):
3535
description=tenant.get("description"),
3636
)
3737
)
38+
39+
40+
class Tenants(Adapter):
41+
"""All tenants."""
42+
43+
project = models.ProjectModel
44+
45+
top_level = ["project"]
46+
type = "Tenant"
47+
48+
def __init__(self, **kwargs):
49+
super().__init__(**kwargs)
50+
self.api_client = API()
51+
52+
def load(self):
53+
url = "/api/tenancy/tenants/?include=relationships"
54+
tenants_response = self.api_client.make_api_request(url, paginated=True)
55+
56+
for tenant in tenants_response:
57+
self.add(
58+
self.project(
59+
id=_remove_hyphens(tenant.get("id")),
60+
name=tenant.get("name"),
61+
description=tenant.get("description"),
62+
)
63+
)

python/diff-nautobot-understack/diff_nautobot_understack/project/adapters/openstack_project.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,25 @@ def load(self):
3232
description=os_project.description,
3333
)
3434
)
35+
36+
37+
class Projects(Adapter):
38+
project = models.ProjectModel
39+
40+
top_level = ["project"]
41+
type = "OpenstackProject"
42+
43+
def __init__(self, **kwargs):
44+
super().__init__(**kwargs)
45+
openstack_api = API()
46+
self.cloud = openstack_api.cloud_connection
47+
48+
def load(self):
49+
for os_project in self.cloud.identity.projects():
50+
self.add(
51+
self.project(
52+
id=os_project.id,
53+
name=os_project.name,
54+
description=os_project.description,
55+
)
56+
)

python/diff-nautobot-understack/diff_nautobot_understack/project/main.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
from diffsync.enum import DiffSyncFlags
33

44
from diff_nautobot_understack.project.adapters.nautobot_tenant import Tenant
5+
from diff_nautobot_understack.project.adapters.nautobot_tenant import Tenants
56
from diff_nautobot_understack.project.adapters.openstack_project import Project
7+
from diff_nautobot_understack.project.adapters.openstack_project import Projects
68
from diff_nautobot_understack.settings import app_settings as settings
79

810

@@ -17,3 +19,15 @@ def openstack_project_diff_from_nautobot_tenant(os_project=None) -> Diff:
1719
openstack_project, flags=DiffSyncFlags.CONTINUE_ON_FAILURE
1820
)
1921
return tenant_destination_openstack_project_source
22+
23+
24+
def openstack_all_projects_diff_from_nautobot_tenant() -> Diff:
25+
openstack_project = Projects()
26+
openstack_project.load()
27+
28+
nautobot_tenant = Tenants()
29+
nautobot_tenant.load()
30+
tenant_destination_openstack_project_source = nautobot_tenant.diff_from(
31+
openstack_project, flags=DiffSyncFlags.CONTINUE_ON_FAILURE
32+
)
33+
return tenant_destination_openstack_project_source

0 commit comments

Comments
 (0)