19
19
_EXIT_API_ERROR = 1
20
20
_EXIT_EVENT_UNKNOWN = 2
21
21
22
+ OUTSIDE_NETWORK_NAME = "OUTSIDE"
23
+
22
24
23
25
class Event (StrEnum ):
24
26
ProjectCreate = "identity.project.created"
@@ -70,6 +72,48 @@ def is_valid_domain(
70
72
return ret
71
73
72
74
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
+
73
117
def handle_project_create (
74
118
conn : Connection , nautobot : Nautobot , project_id : uuid .UUID
75
119
) -> int :
@@ -80,6 +124,7 @@ def handle_project_create(
80
124
ten = ten_api .create (
81
125
id = str (project_id ), name = project .name , description = project .description
82
126
)
127
+ _create_outside_network (conn , project_id )
83
128
except Exception :
84
129
logger .exception (
85
130
"Unable to create project %s / %s" , str (project_id ), project .name
@@ -113,6 +158,8 @@ def handle_project_update(
113
158
project_id ,
114
159
existing_tenant .last_updated , # type: ignore
115
160
)
161
+
162
+ _create_outside_network (conn , project_id )
116
163
except Exception :
117
164
logger .exception (
118
165
"Unable to update project %s / %s" , str (project_id ), project .name
@@ -129,6 +176,8 @@ def handle_project_delete(
129
176
if not ten :
130
177
logger .warning ("tenant %s does not exist, nothing to delete" , project_id )
131
178
return _EXIT_SUCCESS
179
+
180
+ _delete_outside_network (conn , project_id )
132
181
ten .delete () # type: ignore
133
182
logger .info ("deleted tenant %s" , project_id )
134
183
return _EXIT_SUCCESS
0 commit comments