First batch
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					out/*
 | 
				
			||||||
							
								
								
									
										26
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    // Use IntelliSense to learn about possible attributes.
 | 
				
			||||||
 | 
					    // Hover to view descriptions of existing attributes.
 | 
				
			||||||
 | 
					    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
 | 
				
			||||||
 | 
					    "version": "0.2.0",
 | 
				
			||||||
 | 
					    "configurations": [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "Launch test function",
 | 
				
			||||||
 | 
					            "type": "go",
 | 
				
			||||||
 | 
					            "request": "launch",
 | 
				
			||||||
 | 
					            "mode": "test",
 | 
				
			||||||
 | 
					            "program": "${workspaceFolder}",
 | 
				
			||||||
 | 
					            "args": [
 | 
				
			||||||
 | 
					                "-test.run",
 | 
				
			||||||
 | 
					                "TestMongoInit"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "Launch Package",
 | 
				
			||||||
 | 
					            "type": "go",
 | 
				
			||||||
 | 
					            "request": "launch",
 | 
				
			||||||
 | 
					            "mode": "auto",
 | 
				
			||||||
 | 
					            "program": "${fileDirname}"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										26
									
								
								conf.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								conf.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					package oclib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ===================================================
 | 
				
			||||||
 | 
					//	This class has to be updated everytime
 | 
				
			||||||
 | 
					//	a new configuration variable is defined
 | 
				
			||||||
 | 
					//	in a componant that imports oc-lib
 | 
				
			||||||
 | 
					// ===================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Config struct {
 | 
				
			||||||
 | 
						MongoURL string
 | 
				
			||||||
 | 
						DCNAME string
 | 
				
			||||||
 | 
						DBPOINT string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var instance *Config
 | 
				
			||||||
 | 
					var once sync.Once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func GetConfig() *Config {
 | 
				
			||||||
 | 
						once.Do(func() {
 | 
				
			||||||
 | 
							instance = &Config{}
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						return instance
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										13
									
								
								data.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								data.go
									
									
									
									
									
								
							@@ -1,5 +1,16 @@
 | 
				
			|||||||
package oclib
 | 
					package oclib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Data struct {
 | 
					type Data struct {
 | 
				
			||||||
	Resource
 | 
						AbstractResource
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Protocols		[]string	`json:"protocol"` //TODO Enum type
 | 
				
			||||||
 | 
						DataType    	string   `json:"datatype"`
 | 
				
			||||||
 | 
						Example  		string   `json:"example" required:"true" validate:"required" description:"base64 encoded data"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (d *Data) GetType() ResourceType{
 | 
				
			||||||
 | 
						return DATA
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								data_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								data_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					package oclib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestPostOneData(t *testing.T){
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1 +1,39 @@
 | 
				
			|||||||
package oclib
 | 
					package oclib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Datacenter struct {
 | 
				
			||||||
 | 
						Resource
 | 
				
			||||||
 | 
						ID			string	`json:"ID", required: "true"`
 | 
				
			||||||
 | 
						Name		string	`json:"Name", required: "true" `
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Owner        string `json:"owner" `
 | 
				
			||||||
 | 
						BookingPrice int    `json:"bookingPrice" `
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CPU DatacenterCpuModel    `json:"cpu" required:"true"`
 | 
				
			||||||
 | 
						RAM DatacenterMemoryModel `json:"ram" required:"true"`
 | 
				
			||||||
 | 
						GPU []DatacenterGpuModel  `json:"gpu" required:"true"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type DatacenterCpuModel struct {
 | 
				
			||||||
 | 
						Cores         uint   `json:"cores" required:"true"` //TODO: validate
 | 
				
			||||||
 | 
						Architecture  string `json:"architecture"`          //TOOD: enum
 | 
				
			||||||
 | 
						Shared        bool   `json:"shared"`
 | 
				
			||||||
 | 
						MinimumMemory uint   `json:"minimum_memory"`
 | 
				
			||||||
 | 
						Platform      string `json:"platform"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type DatacenterMemoryModel struct {
 | 
				
			||||||
 | 
						Size uint `json:"size" description:"Units in MB"`
 | 
				
			||||||
 | 
						Ecc  bool `json:"ecc"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type DatacenterGpuModel struct {
 | 
				
			||||||
 | 
						CudaCores   uint   `json:"cuda_cores"`
 | 
				
			||||||
 | 
						Model       string `json:"model"`
 | 
				
			||||||
 | 
						Memory      uint   `json:"memory" description:"Units in MB"`
 | 
				
			||||||
 | 
						TensorCores uint   `json:"tensor_cores"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (d *Datacenter) GetType() ResourceType{
 | 
				
			||||||
 | 
						return DATACENTER
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -2,7 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
abstract Ressource {
 | 
					abstract Ressource {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +name: string
 | 
					    +name: string
 | 
				
			||||||
    +icon: string
 | 
					    +icon: string
 | 
				
			||||||
    +description: string
 | 
					    +description: string
 | 
				
			||||||
@@ -11,12 +11,12 @@ abstract Ressource {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Data {
 | 
					class Data {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +name: string
 | 
					    +name: string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Processing {
 | 
					class Processing {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +name: string
 | 
					    +name: string
 | 
				
			||||||
    +container: string
 | 
					    +container: string
 | 
				
			||||||
    +command: int
 | 
					    +command: int
 | 
				
			||||||
@@ -25,83 +25,83 @@ class Processing {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Storage {
 | 
					class Storage {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +name: string
 | 
					    +name: string
 | 
				
			||||||
    +url: string
 | 
					    +url: string
 | 
				
			||||||
    +capacity: int
 | 
					    +capacity: int
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Datacenter {
 | 
					class Datacenter {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +name: string
 | 
					    +name: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Workflow {
 | 
					class Workflow {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +name: string
 | 
					    +name: string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ResourceSet {
 | 
					class ResourceSet {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +name: string
 | 
					    +name: string
 | 
				
			||||||
    +ressources: Ressource[]
 | 
					    +ressources: Ressource[]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class WorkflowSchedule {
 | 
					class WorkflowSchedule {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +start: date
 | 
					    +start: date
 | 
				
			||||||
    +end: date
 | 
					    +end: date
 | 
				
			||||||
    +cron : string
 | 
					    +cron : string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Graph {
 | 
					class Graph {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +ressources: map[GraphicElement.ID]Ressource 
 | 
					    +ressources: map[GraphicElement.UUID]Ressource 
 | 
				
			||||||
    +links: Link[] 
 | 
					    +links: Link[] 
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Link {
 | 
					class Link {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +source: GraphicElement.ID
 | 
					    +source: GraphicElement.UUID
 | 
				
			||||||
    +target: GraphicElement.ID
 | 
					    +target: GraphicElement.UUID
 | 
				
			||||||
    +graphic: GraphicLink
 | 
					    +graphic: GraphicLink
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class GraphicLink {
 | 
					class GraphicLink {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +startXY: coord
 | 
					    +startXY: coord
 | 
				
			||||||
    +endXY: coord
 | 
					    +endXY: coord
 | 
				
			||||||
    +style: string
 | 
					    +style: string
 | 
				
			||||||
}   
 | 
					}   
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class GraphicElement {
 | 
					class GraphicElement {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +style: string
 | 
					    +style: string
 | 
				
			||||||
    +xy: coord
 | 
					    +xy: coord
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Calendar {
 | 
					class Calendar {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +name: string
 | 
					    +name: string
 | 
				
			||||||
    +workflows: Workflow[]
 | 
					    +workflows: Workflow[]
 | 
				
			||||||
    +owner: string
 | 
					    +owner: string
 | 
				
			||||||
}  
 | 
					}  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class UserWorkflows {
 | 
					class UserWorkflows {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +user: string
 | 
					    +user: string
 | 
				
			||||||
    +workflows: Workflow[]
 | 
					    +workflows: Workflow[]
 | 
				
			||||||
}   
 | 
					}   
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DatacenterWorkflows {
 | 
					class DatacenterWorkflows {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +datacenter: Datacenter
 | 
					    +datacenter: Datacenter
 | 
				
			||||||
    +workflows: Workflow[]
 | 
					    +workflows: Workflow[]
 | 
				
			||||||
}   
 | 
					}   
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Graph {
 | 
					class Graph {
 | 
				
			||||||
    +id: int
 | 
					    +UUID: int
 | 
				
			||||||
    +graph: Graph
 | 
					    +graph: Graph
 | 
				
			||||||
    +workflows: Workflow[]
 | 
					    +workflows: Workflow[]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -121,7 +121,7 @@ Ressource <|-- Workflow
 | 
				
			|||||||
ResourceSet "1" o-- "0..*" Ressource
 | 
					ResourceSet "1" o-- "0..*" Ressource
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Workflow "1" o-- "0..*" ResourceSet
 | 
					Workflow "1" o-- "0..*" ResourceSet
 | 
				
			||||||
Workflow "1" o-- "0..*" WorkflowSchedule
 | 
					Workflow "1" o-- "0..1" WorkflowSchedule
 | 
				
			||||||
Workflow "1" o-- "0..*" Graph
 | 
					Workflow "1" o-- "0..*" Graph
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Graph "1" o-- "0..*" Resources
 | 
					Graph "1" o-- "0..*" Resources
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								doc/oclib.png
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								doc/oclib.png
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 102 KiB  | 
							
								
								
									
										12
									
								
								graphic_element.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								graphic_element.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					package oclib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Coordinate struct {
 | 
				
			||||||
 | 
						x	int
 | 
				
			||||||
 | 
						y 	int
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GraphicElement struct{
 | 
				
			||||||
 | 
						ID		string		`json:"ID" required:"true"`
 | 
				
			||||||
 | 
						style	string		`json:"style" required:"true"`
 | 
				
			||||||
 | 
						xy		Coordinate	`json:"xy" required:"true"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										7
									
								
								link.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								link.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					package oclib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Link struct {
 | 
				
			||||||
 | 
						Source		string
 | 
				
			||||||
 | 
						Destination	string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										187
									
								
								mongo.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								mongo.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,187 @@
 | 
				
			|||||||
 | 
					package oclib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"go.mongodb.org/mongo-driver/mongo"
 | 
				
			||||||
 | 
						"go.mongodb.org/mongo-driver/mongo/options"
 | 
				
			||||||
 | 
						"go.mongodb.org/mongo-driver/x/bsonx"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						mngoClient *mongo.Client
 | 
				
			||||||
 | 
						mngoDB     *mongo.Database
 | 
				
			||||||
 | 
						MngoCtx    context.Context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MngoCollData       *mongo.Collection
 | 
				
			||||||
 | 
						MngoCollComputing  *mongo.Collection
 | 
				
			||||||
 | 
						MngoCollStorage    *mongo.Collection
 | 
				
			||||||
 | 
						MngoCollDatacenter *mongo.Collection
 | 
				
			||||||
 | 
						MngoCollWorkspace  *mongo.Collection
 | 
				
			||||||
 | 
						MngoCollSchedule   *mongo.Collection
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Trying to get vscode to display this
 | 
				
			||||||
 | 
					func MongoInit() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// var baseConfig string
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
						var cancel context.CancelFunc
 | 
				
			||||||
 | 
						var conf map[string]string
 | 
				
			||||||
 | 
						var MongoURL string
 | 
				
			||||||
 | 
						var DBname string
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						db_conf, err := os.ReadFile("oclib_conf.json")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							logger.Fatal().Msg("Could not find configuration file")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						json.Unmarshal(db_conf,&conf)
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if len(os.Getenv("DOCKER_ENVIRONMENT")) == 0 {
 | 
				
			||||||
 | 
							MongoURL = conf["DB_URL_LOCAL"]
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							MongoURL = conf["DB_URL_DOCKER"]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						DBname = conf["DCNAME"] + "-" + conf["DBPOINT"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// MongoURL, err := beego.AppConfig.String(baseConfig + "::url")
 | 
				
			||||||
 | 
						// if err != nil {
 | 
				
			||||||
 | 
						// 	logger.Critical().Msg("MongoDB URI error: %v", err)
 | 
				
			||||||
 | 
						// 	panic(err)
 | 
				
			||||||
 | 
						// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						logger.Info().Msg("Connecting to" + MongoURL)
 | 
				
			||||||
 | 
						MngoCtx, cancel = context.WithTimeout(context.Background(), 10*time.Second)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						createClient(MongoURL)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						logger.Info().Msg("Connecting mongo client to db " + DBname)
 | 
				
			||||||
 | 
						prepareDB(conf["DCNAME"],conf["DBPOINT"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						logger.Info().Msg("Database is READY")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO : Soit retourner MngoCtx, soit comprendre comment passer sa référence et la mettre à jour
 | 
				
			||||||
 | 
					func createClient(MongoURL string){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						clientOptions := options.Client().ApplyURI(MongoURL)
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						mngoClient, _ = mongo.NewClient(options.Client().ApplyURI(MongoURL))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err = mngoClient.Connect(MngoCtx); err != nil {
 | 
				
			||||||
 | 
							logger.Fatal().Msg("Mongodb NewClient " + MongoURL + ":"  + "err" )
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Ping the primary
 | 
				
			||||||
 | 
						if mngoClient, err = mongo.Connect(MngoCtx, clientOptions); err != nil {
 | 
				
			||||||
 | 
							logger.Fatal().Msg("Mongodb connect " + MongoURL + ":"  + "err" )
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err = mngoClient.Ping(MngoCtx, nil); err != nil {
 | 
				
			||||||
 | 
							logger.Fatal().Msg("Mongodb ping " + MongoURL + ":"  + "err" )
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func prepareDB(dc_name string, db_point string) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// var err error
 | 
				
			||||||
 | 
						DBname := dc_name + "-"  + db_point
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mngoDB = mngoClient.Database(DBname)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MngoCollData = mngoDB.Collection("Data")
 | 
				
			||||||
 | 
						MngoCollComputing = mngoDB.Collection("Computing")
 | 
				
			||||||
 | 
						MngoCollStorage = mngoDB.Collection("Storage")
 | 
				
			||||||
 | 
						MngoCollDatacenter = mngoDB.Collection("Datacenter")
 | 
				
			||||||
 | 
						MngoCollWorkspace = mngoDB.Collection("Workspace")
 | 
				
			||||||
 | 
						MngoCollSchedule = mngoDB.Collection("Schedule")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						list_collection := [...]string{"Data","Computing","Storage","Datacenter","Workspace","Schedule"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, collection_name := range(list_collection){
 | 
				
			||||||
 | 
							new_collection := mngoDB.Collection(collection_name)
 | 
				
			||||||
 | 
							createCollection(new_collection)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// if _, err = MngoCollComputing.Indexes().CreateMany(MngoCtx, []mongo.IndexModel{
 | 
				
			||||||
 | 
						// 	{
 | 
				
			||||||
 | 
						// 		Keys: bsonx.Doc{
 | 
				
			||||||
 | 
						// 			{Key: "description", Value: bsonx.String("text")},
 | 
				
			||||||
 | 
						// 			{Key: "owner", Value: bsonx.String("text")},
 | 
				
			||||||
 | 
						// 			{Key: "license", Value: bsonx.String("text")},
 | 
				
			||||||
 | 
						// 		},
 | 
				
			||||||
 | 
						// 	},
 | 
				
			||||||
 | 
						// }); err != nil && err.(mongo.CommandError).Code != 85 {
 | 
				
			||||||
 | 
						// 	logger.Critical().Msg(err)
 | 
				
			||||||
 | 
						// 	panic(err)
 | 
				
			||||||
 | 
						// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// if _, err = MngoCollStorage.Indexes().CreateMany(MngoCtx, []mongo.IndexModel{
 | 
				
			||||||
 | 
						// 	{
 | 
				
			||||||
 | 
						// 		Keys: bsonx.Doc{
 | 
				
			||||||
 | 
						// 			{Key: "name", Value: bsonx.String("text")},
 | 
				
			||||||
 | 
						// 			{Key: "description", Value: bsonx.String("text")},
 | 
				
			||||||
 | 
						// 		},
 | 
				
			||||||
 | 
						// 	},
 | 
				
			||||||
 | 
						// }); err != nil && err.(mongo.CommandError).Code != 85 {
 | 
				
			||||||
 | 
						// 	logger.Critical().Msg(err)
 | 
				
			||||||
 | 
						// 	panic(err)
 | 
				
			||||||
 | 
						// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// if _, err = MngoCollDatacenter.Indexes().CreateMany(MngoCtx, []mongo.IndexModel{
 | 
				
			||||||
 | 
						// 	{
 | 
				
			||||||
 | 
						// 		Keys: bsonx.Doc{
 | 
				
			||||||
 | 
						// 			{Key: "name", Value: bsonx.String("text")},
 | 
				
			||||||
 | 
						// 			{Key: "description", Value: bsonx.String("text")},
 | 
				
			||||||
 | 
						// 			{Key: "owner", Value: bsonx.String("text")},
 | 
				
			||||||
 | 
						// 		},
 | 
				
			||||||
 | 
						// 	},
 | 
				
			||||||
 | 
						// }); err != nil && err.(mongo.CommandError).Code != 85 {
 | 
				
			||||||
 | 
						// 	logger.Critical().Msg(err)
 | 
				
			||||||
 | 
						// 	panic(err)
 | 
				
			||||||
 | 
						// }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func createCollection(new_collection *mongo.Collection)  {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var err error 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if _, err = new_collection.Indexes().CreateMany(MngoCtx, []mongo.IndexModel{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Keys: bsonx.Doc{
 | 
				
			||||||
 | 
									{Key: "description", Value: bsonx.String("text")},
 | 
				
			||||||
 | 
									{Key: "example", Value: bsonx.String("text")},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}); err != nil {
 | 
				
			||||||
 | 
							var cmdErr mongo.CommandError
 | 
				
			||||||
 | 
							if errors.As(err, &cmdErr) && cmdErr.Code != 85 {
 | 
				
			||||||
 | 
								logger.Fatal().Msg("It failed but I saw it: " + err.Error())
 | 
				
			||||||
 | 
								panic(err)
 | 
				
			||||||
 | 
							} else if !errors.As(err, &cmdErr) {
 | 
				
			||||||
 | 
								logger.Fatal().Msg("Unexpected error: " + err.Error())
 | 
				
			||||||
 | 
								panic(err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										10
									
								
								mongo_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								mongo_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					package oclib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					func TestMongoInit(T *testing.T){
 | 
				
			||||||
 | 
						MongoInit()
 | 
				
			||||||
 | 
						fmt.Printf("It worked !")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										6
									
								
								oclib_conf.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								oclib_conf.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "DB_URL_LOCAL" : "mongodb://127.0.0.1:27017",
 | 
				
			||||||
 | 
					    "DB_URL_DOCKER": "mongodb://mongo:27017/",
 | 
				
			||||||
 | 
					    "DBPOINT" : "oclib_tests",
 | 
				
			||||||
 | 
					    "DCNAME" : "testDC"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										30
									
								
								processing.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								processing.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					package oclib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Processing struct {
 | 
				
			||||||
 | 
						Resource
 | 
				
			||||||
 | 
						Container		string					`json:"Container"`	// We could create a specific class for container, that could check if the name exists/is available
 | 
				
			||||||
 | 
						Repository		string					`json:"Repository"`	// Indicate where to find the container image	=> Could add a struct handling authentication to the repo
 | 
				
			||||||
 | 
						Command			string					`json:"Command"`
 | 
				
			||||||
 | 
						Arguments		[]string				`json:"Arguments"`
 | 
				
			||||||
 | 
						Environment		[]map[string]string		`json:"Environment"`	// a key/value struct is what ressembles the most a NAME=VALUE struct
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ExecutionRequirements ExecutionRequirementsModel	`json:"ExecutionRequirements"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Price			uint					`json:"Price"`
 | 
				
			||||||
 | 
						License			string					`json:"License"`
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ExecutionRequirementsModel struct {
 | 
				
			||||||
 | 
						CPUs 			uint `json:"cpus" required:"true"`
 | 
				
			||||||
 | 
						GPUs 			uint `json:"gpus" description:"Amount of GPUs needed"`
 | 
				
			||||||
 | 
						RAM  			uint `json:"ram" required:"true" description:"Units in MB"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Parallel     	bool   `json:"parallel"`
 | 
				
			||||||
 | 
						ScalingModel 	uint   `json:"scaling_model"`
 | 
				
			||||||
 | 
						DiskIO       	string `json:"disk_io"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p *Processing) GetType() ResourceType{
 | 
				
			||||||
 | 
						return PROCESSING
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										88
									
								
								resource.go
									
									
									
									
									
								
							
							
						
						
									
										88
									
								
								resource.go
									
									
									
									
									
								
							@@ -1,12 +1,94 @@
 | 
				
			|||||||
package oclib
 | 
					package oclib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Resource struct {
 | 
					import (
 | 
				
			||||||
	Id               string
 | 
						"go.mongodb.org/mongo-driver/bson/primitive"
 | 
				
			||||||
	Name             string
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AbstractResource is the struct containing all of the attributes commons to all ressources
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Resource is the interface to be implemented by all classes inheriting from Resource to have the same behavior
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//http://www.inanzzz.com/index.php/post/wqbs/a-basic-usage-of-int-and-string-enum-types-in-golang
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ResourceType int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						INVALID 	ResourceType = iota
 | 
				
			||||||
 | 
						DATA		
 | 
				
			||||||
 | 
						PROCESSING	
 | 
				
			||||||
 | 
						STORAGE		
 | 
				
			||||||
 | 
						DATACENTER
 | 
				
			||||||
 | 
						WORKFLOW	
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var extensions = [...]string{
 | 
				
			||||||
 | 
						"INVALID",
 | 
				
			||||||
 | 
						"DATA",
 | 
				
			||||||
 | 
						"PROCESSING",
 | 
				
			||||||
 | 
						"STORAGE",
 | 
				
			||||||
 | 
						"DATACENTER",
 | 
				
			||||||
 | 
						"WORKFLOW",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Resource interface{
 | 
				
			||||||
 | 
						GetType()				ResourceType
 | 
				
			||||||
 | 
						getOneResourceByID()	Resource
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type AbstractResource struct {
 | 
				
			||||||
 | 
						Uuid			 	string			`json:"Id" required:"true" `
 | 
				
			||||||
 | 
						Name             	string			`json:"Name" required:"true" `
 | 
				
			||||||
	ShortDescription 	string
 | 
						ShortDescription 	string
 | 
				
			||||||
	Description      	string
 | 
						Description      	string
 | 
				
			||||||
	Logo             	string
 | 
						Logo             	string
 | 
				
			||||||
	Owner            	string
 | 
						Owner            	string
 | 
				
			||||||
	OwnerLogo        	string
 | 
						OwnerLogo        	string
 | 
				
			||||||
	SourceUrl        	string
 | 
						SourceUrl        	string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Graphic			 	GraphicElement	`json:"GraphicElement" `
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// func (r *AbstractResource) getOneResourceByID(id string, resType ResourceType){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 	targetDBCollection := r.GetType().MongoCollection()		// Change the rType by the result of reflect
 | 
				
			||||||
 | 
					// 	var retObj interface{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 	filter := bson.M{"_id": getObjIDFromString(id)}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 	res := targetDBCollection.FindOne(services.MngoCtx, filter)
 | 
				
			||||||
 | 
					// 	res.Decode(retObj)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 	if res.Err() != nil {
 | 
				
			||||||
 | 
					// 		logs.Warn("Couldn't find resource: " + res.Err().Error())
 | 
				
			||||||
 | 
					// 	}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 	return retObj, res.Err()
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getObjIDFromString(id string) interface{} {
 | 
				
			||||||
 | 
						objectID, err := primitive.ObjectIDFromHex(id)
 | 
				
			||||||
 | 
						if err == nil {
 | 
				
			||||||
 | 
							return objectID
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return id
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func postToMongo(id string) {
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *AbstractResource) isLinked(){
 | 
				
			||||||
 | 
						// Get the link collection in this workflow
 | 
				
			||||||
 | 
						// test if the current resource is a dest OR a source at least one
 | 
				
			||||||
 | 
						// (len(slice[r.ID == dest]) > 0 || len(slice[r.ID == 1]) > 1 )
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// func (r *Resource) GetType() ResourceType {
 | 
				
			||||||
 | 
					// 	return INVALID
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
@@ -1 +1,6 @@
 | 
				
			|||||||
package oclib
 | 
					package oclib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Resources' key must be the Resource' Uuid, to garanty the set-like structure
 | 
				
			||||||
 | 
					type WorkflowSet struct{
 | 
				
			||||||
 | 
						Resources	map[string]Resource
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										21
									
								
								storage.go
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								storage.go
									
									
									
									
									
								
							@@ -1 +1,22 @@
 | 
				
			|||||||
package oclib
 | 
					package oclib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type URL struct {
 | 
				
			||||||
 | 
						Protocol	string	`json:"protocol"`
 | 
				
			||||||
 | 
						Path		string	`json:"path"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Storage struct {
 | 
				
			||||||
 | 
						Resource			`json:"resource" required:"true"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Capacity	uint	`json:"capacity" required:"true"`
 | 
				
			||||||
 | 
						Url			URL		`json:"URL" `		// Will allow to select between several protocols 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Encryption   bool   `json:"encryption" `
 | 
				
			||||||
 | 
						Redundancy   string `json:"redundancy" `
 | 
				
			||||||
 | 
						Throughput   string `json:"throughput" `
 | 
				
			||||||
 | 
						BookingPrice uint   `json:"bookingPrice" `
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *Storage) GetType() ResourceType{
 | 
				
			||||||
 | 
						return STORAGE
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										25
									
								
								workflow.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								workflow.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					package oclib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Workflow struct{
 | 
				
			||||||
 | 
						Resource
 | 
				
			||||||
 | 
						Datas		map[string]Data
 | 
				
			||||||
 | 
						Storages	map[string]Storage
 | 
				
			||||||
 | 
						Processing	map[string]Processing
 | 
				
			||||||
 | 
						Datacenters	map[string]Datacenter
 | 
				
			||||||
 | 
						Links		map[string]Link
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Schedule	WorkflowSchedule
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w *Workflow) isDCLink(link Link) bool {
 | 
				
			||||||
 | 
						if _, exists := w.Datacenters[link.Destination]; exists {
 | 
				
			||||||
 | 
					        return true
 | 
				
			||||||
 | 
					    } else if _, exists := w.Datacenters[link.Source]; exists {
 | 
				
			||||||
 | 
					        return true
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1 +1,15 @@
 | 
				
			|||||||
package oclib
 | 
					package oclib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type WorkflowSchedule struct {
 | 
				
			||||||
 | 
						Id		string `json:"id"`
 | 
				
			||||||
 | 
						Start	time.Time 
 | 
				
			||||||
 | 
						End		time.Time
 | 
				
			||||||
 | 
						Cron	string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (ws *WorkflowSchedule) GetAllDates() (timetable []time.Time){
 | 
				
			||||||
 | 
						// Return all the execution time generated by the Cron
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user