Skip to content

Commit edd81a3

Browse files
authored
Merge pull request #723 from rackerlabs/per-tenant-outside-network
feat: Create an OUTSIDE Network in Neutron for each new project (tenant)
2 parents 507fa83 + 4b2c477 commit edd81a3

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

python/understack-workflows/understack_workflows/main/sync_keystone.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
_EXIT_API_ERROR = 1
2020
_EXIT_EVENT_UNKNOWN = 2
2121

22+
OUTSIDE_NETWORK_NAME = "OUTSIDE"
23+
2224

2325
class Event(StrEnum):
2426
ProjectCreate = "identity.project.created"
@@ -70,6 +72,48 @@ def is_valid_domain(
7072
return ret
7173

7274

75+
def _create_outside_network(conn: Connection, project_id: uuid.UUID):
76+
network = _find_outside_network(conn, project_id)
77+
if network:
78+
logger.info(
79+
"%s Network %s already exists for this tenant",
80+
OUTSIDE_NETWORK_NAME,
81+
network.id,
82+
)
83+
else:
84+
payload = {
85+
"project_id": project_id,
86+
"name": OUTSIDE_NETWORK_NAME,
87+
"router:external": False,
88+
}
89+
network = conn.network.create_network(**payload) # type: ignore
90+
logger.info(
91+
"Created %s Network %s for tenant", OUTSIDE_NETWORK_NAME, network.id
92+
)
93+
conn.network.create_rbac_policy( # type: ignore
94+
object_type="network",
95+
object_id=network.id,
96+
action="access_as_external",
97+
target_project_id=project_id,
98+
)
99+
100+
101+
def _delete_outside_network(conn: Connection, project_id: uuid.UUID):
102+
network = _find_outside_network(conn, project_id)
103+
if network:
104+
conn.delete_network(network.id)
105+
logger.info(
106+
"Deleted %s Network %s for this tenant", OUTSIDE_NETWORK_NAME, network.id
107+
)
108+
109+
110+
def _find_outside_network(conn, project_id):
111+
return conn.network.find_network( # type: ignore
112+
project_id=project_id,
113+
name_or_id=OUTSIDE_NETWORK_NAME,
114+
)
115+
116+
73117
def handle_project_create(
74118
conn: Connection, nautobot: Nautobot, project_id: uuid.UUID
75119
) -> int:
@@ -80,6 +124,7 @@ def handle_project_create(
80124
ten = ten_api.create(
81125
id=str(project_id), name=project.name, description=project.description
82126
)
127+
_create_outside_network(conn, project_id)
83128
except Exception:
84129
logger.exception(
85130
"Unable to create project %s / %s", str(project_id), project.name
@@ -113,6 +158,8 @@ def handle_project_update(
113158
project_id,
114159
existing_tenant.last_updated, # type: ignore
115160
)
161+
162+
_create_outside_network(conn, project_id)
116163
except Exception:
117164
logger.exception(
118165
"Unable to update project %s / %s", str(project_id), project.name
@@ -129,6 +176,8 @@ def handle_project_delete(
129176
if not ten:
130177
logger.warning("tenant %s does not exist, nothing to delete", project_id)
131178
return _EXIT_SUCCESS
179+
180+
_delete_outside_network(conn, project_id)
132181
ten.delete() # type: ignore
133182
logger.info("deleted tenant %s", project_id)
134183
return _EXIT_SUCCESS

0 commit comments

Comments
 (0)