55 "fmt"
66 "log"
77 "os"
8- "strings "
8+ "regexp "
99 "time"
1010
1111 "github.com/cpp-cyber/proclone/internal/ldap"
@@ -85,11 +85,11 @@ func (cs *CloningService) CloneTemplate(req CloneRequest) error {
8585 // 3. Identify router and other VMs
8686 var router * proxmox.VM
8787 var templateVMs []proxmox.VM
88+ routerPattern := regexp .MustCompile (`(?i)(router|pfsense|vyos)` )
8889
8990 for _ , vm := range templatePool {
9091 // Check to see if this VM is the router
91- lowerVMName := strings .ToLower (vm .Name )
92- if strings .Contains (lowerVMName , "router" ) || strings .Contains (lowerVMName , "pfsense" ) {
92+ if routerPattern .MatchString (vm .Name ) {
9393 router = & proxmox.VM {
9494 Name : vm .Name ,
9595 Node : vm .NodeName ,
@@ -166,6 +166,13 @@ func (cs *CloningService) CloneTemplate(req CloneRequest) error {
166166 }
167167
168168 // 7. Clone targets to proxmox
169+ req .SSE .Send (
170+ ProgressMessage {
171+ Message : "Cloning VMs" ,
172+ Progress : 10 ,
173+ },
174+ )
175+
169176 for _ , target := range req .Targets {
170177 // Find best node per target
171178 bestNode , err := cs .ProxmoxService .FindBestNode ()
@@ -186,9 +193,16 @@ func (cs *CloningService) CloneTemplate(req CloneRequest) error {
186193 if err != nil {
187194 errors = append (errors , fmt .Sprintf ("failed to clone router VM for %s: %v" , target .Name , err ))
188195 } else {
196+ // Determine router type
197+ routerType , err := cs .getRouterType (* router )
198+ if err != nil {
199+ errors = append (errors , fmt .Sprintf ("failed to get router type for %s: %v" , target .Name , err ))
200+ }
201+
189202 // Store router info for later operations
190203 clonedRouters = append (clonedRouters , RouterInfo {
191204 TargetName : target .Name ,
205+ RouterType : routerType ,
192206 PodNumber : target .PodNumber ,
193207 Node : bestNode ,
194208 VMID : target .VMIDs [0 ],
@@ -251,6 +265,12 @@ func (cs *CloningService) CloneTemplate(req CloneRequest) error {
251265 }
252266
253267 // 10. Start all routers and wait for them to be running
268+ req .SSE .Send (
269+ ProgressMessage {
270+ Message : "Starting routers" ,
271+ Progress : 25 ,
272+ },
273+ )
254274 log .Printf ("Starting %d routers" , len (clonedRouters ))
255275 for _ , routerInfo := range clonedRouters {
256276 // Wait for router disk to be available
@@ -278,6 +298,13 @@ func (cs *CloningService) CloneTemplate(req CloneRequest) error {
278298 }
279299
280300 // 11. Configure all pod routers (separate step after all routers are running)
301+ req .SSE .Send (
302+ ProgressMessage {
303+ Message : "Configuring pod routers" ,
304+ Progress : 33 ,
305+ },
306+ )
307+
281308 log .Printf ("Configuring %d pod routers" , len (clonedRouters ))
282309 for _ , routerInfo := range clonedRouters {
283310 // Double-check that router is still running before configuration
@@ -288,12 +315,20 @@ func (cs *CloningService) CloneTemplate(req CloneRequest) error {
288315 }
289316
290317 log .Printf ("Configuring pod router for %s (Pod: %d, VMID: %d)" , routerInfo .TargetName , routerInfo .PodNumber , routerInfo .VMID )
291- err = cs .configurePodRouter (routerInfo .PodNumber , routerInfo .Node , routerInfo .VMID )
318+ err = cs .configurePodRouter (routerInfo .PodNumber , routerInfo .Node , routerInfo .VMID , routerInfo . RouterType )
292319 if err != nil {
293320 errors = append (errors , fmt .Sprintf ("failed to configure pod router for %s: %v" , routerInfo .TargetName , err ))
294321 }
295322 }
296323
324+ // Router configuration complete - update progress
325+ req .SSE .Send (
326+ ProgressMessage {
327+ Message : "Finalizing deployment" ,
328+ Progress : 90 ,
329+ },
330+ )
331+
297332 // 12. Set permissions on the pool to the user/group
298333 for _ , target := range req .Targets {
299334 err = cs .ProxmoxService .SetPoolPermission (target .PoolName , target .Name , target .IsGroup )
@@ -308,6 +343,14 @@ func (cs *CloningService) CloneTemplate(req CloneRequest) error {
308343 errors = append (errors , fmt .Sprintf ("failed to increment template deployments for %s: %v" , req .Template , err ))
309344 }
310345
346+ // Final completion message
347+ req .SSE .Send (
348+ ProgressMessage {
349+ Message : "Template cloning completed!" ,
350+ Progress : 100 ,
351+ },
352+ )
353+
311354 // Handle errors and cleanup if necessary
312355 if len (errors ) > 0 {
313356 cs .cleanupFailedClones (createdPools )
@@ -357,9 +400,7 @@ func (cs *CloningService) DeletePod(pod string) error {
357400 VMID : vm .VmId ,
358401 })
359402 stoppedCount ++
360- } else {
361403 }
362- } else {
363404 }
364405 }
365406
0 commit comments