2024-08-30 09:14:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								package  workflow  
						 
					
						
							
								
									
										
										
										
											2024-07-19 10:54:58 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"encoding/json" 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 16:11:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"errors" 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-19 10:54:58 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-13 09:49:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"cloud.o-forge.io/core/oc-lib/models/peer" 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-26 10:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"cloud.o-forge.io/core/oc-lib/models/resources" 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 16:11:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"cloud.o-forge.io/core/oc-lib/models/resources/datacenter" 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-26 10:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"cloud.o-forge.io/core/oc-lib/models/resources/workflow/graph" 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-19 10:54:58 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"cloud.o-forge.io/core/oc-lib/models/utils" 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 16:11:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"cloud.o-forge.io/core/oc-lib/tools" 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-19 10:54:58 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-30 14:50:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/ *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  AbstractWorkflow  is  a  struct  that  represents  a  workflow  for  resource  or  native  workflow  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  Warning :  there  is  2  types  of  workflows ,  the  resource  workflow  and  the  native  workflow  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  native  workflow  is  the  one  that  you  create  to  schedule  an  execution  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  resource  workflow  is  the  one  that  is  created  to  set  our  native  workflow  in  catalog  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * / 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-26 10:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								type  AbstractWorkflow  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									resources . ResourceSet 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-30 14:50:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Graph           * graph . Graph       ` bson:"graph,omitempty" json:"graph,omitempty" `        // Graph UI & logic representation of the workflow 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ScheduleActive  bool               ` json:"schedule_active" bson:"schedule_active" `        // ScheduleActive is a flag that indicates if the schedule is active, if not the workflow is not scheduled and no execution or booking will be set 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Schedule        * WorkflowSchedule  ` bson:"schedule,omitempty" json:"schedule,omitempty" `  // Schedule is the schedule of the workflow 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Shared          [ ] string           ` json:"shared,omitempty" bson:"shared,omitempty" `      // Shared is the ID of the shared workflow 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-26 10:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-30 14:50:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// tool function to check if a link is a link between a datacenter and a resource  
						 
					
						
							
								
									
										
										
										
											2024-08-12 14:18:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( w  * AbstractWorkflow )  isDCLink ( link  graph . GraphLink )  ( bool ,  string )  {  
						 
					
						
							
								
									
										
										
										
											2024-08-29 11:03:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  w . Graph  ==  nil  ||  w . Graph . Items  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ,  "" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-20 14:59:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  d ,  ok  :=  w . Graph . Items [ link . Source . ID ] ;  ok  &&  d . Datacenter  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-20 15:27:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  true ,  d . Datacenter . UUID 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-26 10:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-20 14:59:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  d ,  ok  :=  w . Graph . Items [ link . Destination . ID ] ;  ok  &&  d . Datacenter  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-20 15:27:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  true ,  d . Datacenter . UUID 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 14:18:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ,  "" 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-26 10:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-30 14:50:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/ *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  Workflow  is  a  struct  that  represents  a  workflow  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  it  defines  the  native  workflow  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * / 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-19 10:54:58 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								type  Workflow  struct  {  
						 
					
						
							
								
									
										
										
										
											2024-08-30 14:50:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									utils . AbstractObject  // AbstractObject contains the basic fields of an object (id, name) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									AbstractWorkflow      // AbstractWorkflow contains the basic fields of a workflow 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-19 10:54:58 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-30 14:50:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/ *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  CheckBooking  is  a  function  that  checks  the  booking  of  the  workflow  on  peers  ( even  ourselves )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * / 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-23 09:53:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( wfa  * Workflow )  CheckBooking ( caller  * tools . HTTPCaller )  ( bool ,  error )  {  
						 
					
						
							
								
									
										
										
										
											2024-08-12 14:18:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// check if 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-30 14:50:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  wfa . Graph  ==  nil  {  // no graph no booking 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 14:18:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  false ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 16:11:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									accessor  :=  ( & datacenter . DatacenterResource { } ) . GetAccessor ( nil ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  link  :=  range  wfa . Graph . Links  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-30 14:50:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ok ,  dc_id  :=  wfa . isDCLink ( link ) ;  ok  {  // check if the link is a link between a datacenter and a resource 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 16:11:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											dc ,  code ,  _  :=  accessor . LoadOne ( dc_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  code  !=  200  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-30 14:50:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// CHECK BOOKING ON PEER, datacenter could be a remote one 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-13 09:49:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											peerID  :=  dc . ( * datacenter . DatacenterResource ) . PeerID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  peerID  ==  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  false ,  errors . New ( "no peer id" ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-30 14:50:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  // no peer id no booking, we need to know where to book 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-23 09:53:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_ ,  err  :=  ( & peer . Peer { } ) . LaunchPeerExecution ( peerID ,  dc_id ,  utils . BOOKING ,  tools . GET ,  nil ,  caller ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 16:11:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  false ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 14:18:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 16:11:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  true ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 14:18:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( d  * Workflow )  GetName ( )  string  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  d . Name 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-08 15:56:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 16:11:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( d  * Workflow )  GetAccessor ( caller  * tools . HTTPCaller )  utils . Accessor  {  
						 
					
						
							
								
									
										
										
										
											2024-08-30 14:50:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									data  :=  New ( )                      // Create a new instance of the accessor 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									data . Init ( utils . WORKFLOW ,  caller )  // Initialize the accessor with the WORKFLOW model type 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-19 10:54:58 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  data 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( dma  * Workflow )  Deserialize ( j  map [ string ] interface { } )  utils . DBObject  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									b ,  err  :=  json . Marshal ( j ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									json . Unmarshal ( b ,  dma ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  dma 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( dma  * Workflow )  Serialize ( )  map [ string ] interface { }  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  m  map [ string ] interface { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									b ,  err  :=  json . Marshal ( dma ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-24 09:53:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									json . Unmarshal ( b ,  & m ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-19 10:54:58 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  m 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}