Order Flow Payment Draft
This commit is contained in:
@@ -3,7 +3,6 @@ package graph
|
||||
import (
|
||||
"time"
|
||||
|
||||
"cloud.o-forge.io/core/oc-lib/models/common/pricing"
|
||||
"cloud.o-forge.io/core/oc-lib/models/resources"
|
||||
"cloud.o-forge.io/core/oc-lib/tools"
|
||||
)
|
||||
@@ -15,7 +14,8 @@ type Graph struct {
|
||||
Links []GraphLink `bson:"links" json:"links" default:"{}" validate:"required"` // Links is the list of links between elements in the graph
|
||||
}
|
||||
|
||||
func (g *Graph) GetAverageTimeRelatedToProcessingActivity(start time.Time, processings []*resources.CustomizedProcessingResource, resource resources.ShallowResourceInterface, f func(GraphItem) resources.ShallowResourceInterface) (float64, float64) {
|
||||
func (g *Graph) GetAverageTimeRelatedToProcessingActivity(start time.Time, processings []*resources.ProcessingResource, resource resources.ResourceInterface,
|
||||
f func(GraphItem) resources.ResourceInterface, request *tools.APIRequest) (float64, float64) {
|
||||
nearestStart := float64(10000000000)
|
||||
oneIsInfinite := false
|
||||
longestDuration := float64(0)
|
||||
@@ -27,16 +27,17 @@ func (g *Graph) GetAverageTimeRelatedToProcessingActivity(start time.Time, proce
|
||||
} else if link.Source.ID == processing.GetID() && f(g.Items[link.Source.ID]) != nil && f(g.Items[link.Source.ID]).GetID() == resource.GetID() { // if the source is the processing and the destination is not a compute
|
||||
source = link.Destination.ID
|
||||
}
|
||||
priced := processing.ConvertToPricedResource(tools.PROCESSING_RESOURCE, request)
|
||||
if source != "" {
|
||||
if processing.UsageStart != nil {
|
||||
near := float64(processing.UsageStart.Sub(start).Seconds())
|
||||
if priced.GetLocationStart() != nil {
|
||||
near := float64(priced.GetLocationStart().Sub(start).Seconds())
|
||||
if near < nearestStart {
|
||||
nearestStart = near
|
||||
}
|
||||
|
||||
}
|
||||
if processing.UsageEnd != nil {
|
||||
duration := float64(processing.UsageEnd.Sub(*processing.UsageStart).Seconds())
|
||||
if priced.GetLocationEnd() != nil {
|
||||
duration := float64(priced.GetLocationEnd().Sub(*priced.GetLocationStart()).Seconds())
|
||||
if longestDuration < duration {
|
||||
longestDuration = duration
|
||||
}
|
||||
@@ -52,18 +53,10 @@ func (g *Graph) GetAverageTimeRelatedToProcessingActivity(start time.Time, proce
|
||||
return nearestStart, longestDuration
|
||||
}
|
||||
|
||||
func (g *Graph) SetItemStartUsage(graphItemID string, start time.Time) {
|
||||
g.Items[graphItemID].SetItemStartUsage(start)
|
||||
}
|
||||
|
||||
func (g *Graph) SetItemEndUsage(graphItemID string, end time.Time) {
|
||||
g.Items[graphItemID].SetItemEndUsage(end)
|
||||
}
|
||||
|
||||
/*
|
||||
* GetAverageTimeBeforeStart is a function that returns the average time before the start of a processing
|
||||
*/
|
||||
func (g *Graph) GetAverageTimeProcessingBeforeStart(average float64, processingID string) float64 {
|
||||
func (g *Graph) GetAverageTimeProcessingBeforeStart(average float64, processingID string, request *tools.APIRequest) float64 {
|
||||
currents := []float64{} // list of current time
|
||||
for _, link := range g.Links { // for each link
|
||||
var source string // source is the source of the link
|
||||
@@ -75,13 +68,17 @@ func (g *Graph) GetAverageTimeProcessingBeforeStart(average float64, processingI
|
||||
if source == "" { // if source is empty, continue
|
||||
continue
|
||||
}
|
||||
_, item := g.GetResource(source) // get the resource of the source
|
||||
current := item.GetExplicitDurationInS() // get the explicit duration of the item
|
||||
if current < 0 { // if current is negative, its means that duration of a before could be infinite continue
|
||||
dt, r := g.GetResource(source) // get the resource of the source
|
||||
if r == nil { // if item is nil, continue
|
||||
continue
|
||||
}
|
||||
priced := r.ConvertToPricedResource(dt, request)
|
||||
current := priced.GetExplicitDurationInS() // get the explicit duration of the item
|
||||
if current < 0 { // if current is negative, its means that duration of a before could be infinite continue
|
||||
return current
|
||||
}
|
||||
current += g.GetAverageTimeProcessingBeforeStart(current, source) // get the average time before start of the source
|
||||
currents = append(currents, current) // append the current to the currents
|
||||
current += g.GetAverageTimeProcessingBeforeStart(current, source, request) // get the average time before start of the source
|
||||
currents = append(currents, current) // append the current to the currents
|
||||
}
|
||||
var max float64 // get the max time to wait dependancies to finish
|
||||
for _, current := range currents {
|
||||
@@ -92,60 +89,45 @@ func (g *Graph) GetAverageTimeProcessingBeforeStart(average float64, processingI
|
||||
return max
|
||||
}
|
||||
|
||||
func (g *Graph) GetResource(id string) (string, resources.ShallowResourceInterface) {
|
||||
func (g *Graph) GetResource(id string) (tools.DataType, resources.ResourceInterface) {
|
||||
if item, ok := g.Items[id]; ok {
|
||||
if item.Data != nil {
|
||||
return tools.DATA_RESOURCE.String(), item.Data
|
||||
return tools.DATA_RESOURCE, item.Data
|
||||
} else if item.Compute != nil {
|
||||
return tools.COMPUTE_RESOURCE.String(), item.Compute
|
||||
return tools.COMPUTE_RESOURCE, item.Compute
|
||||
} else if item.Workflow != nil {
|
||||
return tools.WORKFLOW_RESOURCE.String(), item.Workflow
|
||||
return tools.WORKFLOW_RESOURCE, item.Workflow
|
||||
} else if item.Processing != nil {
|
||||
return tools.PROCESSING_RESOURCE.String(), item.Processing
|
||||
return tools.PROCESSING_RESOURCE, item.Processing
|
||||
} else if item.Storage != nil {
|
||||
return tools.STORAGE_RESOURCE.String(), item.Storage
|
||||
return tools.STORAGE_RESOURCE, item.Storage
|
||||
}
|
||||
}
|
||||
return "", nil
|
||||
return tools.INVALID, nil
|
||||
}
|
||||
|
||||
// GraphItem is a struct that represents an item in a graph
|
||||
type GraphItem struct {
|
||||
ID string `bson:"id" json:"id" validate:"required"` // ID is the unique identifier of the item
|
||||
Width float64 `bson:"width" json:"width" validate:"required"` // Width is the graphical width of the item
|
||||
Height float64 `bson:"height" json:"height" validate:"required"` // Height is the graphical height of the item
|
||||
Position Position `bson:"position" json:"position" validate:"required"` // Position is the graphical position of the item
|
||||
*resources.ItemExploitedResource // ItemResource is the resource of the item affected to the item
|
||||
ID string `bson:"id" json:"id" validate:"required"` // ID is the unique identifier of the item
|
||||
Width float64 `bson:"width" json:"width" validate:"required"` // Width is the graphical width of the item
|
||||
Height float64 `bson:"height" json:"height" validate:"required"` // Height is the graphical height of the item
|
||||
Position Position `bson:"position" json:"position" validate:"required"` // Position is the graphical position of the item
|
||||
*resources.ItemResource // ItemResource is the resource of the item affected to the item
|
||||
}
|
||||
|
||||
func (g *GraphItem) GetResource() resources.ShallowResourceInterface {
|
||||
func (g *GraphItem) GetResource() (tools.DataType, resources.ResourceInterface) {
|
||||
if g.Data != nil {
|
||||
return g.Data
|
||||
return tools.DATA_RESOURCE, g.Data
|
||||
} else if g.Compute != nil {
|
||||
return g.Compute
|
||||
return tools.COMPUTE_RESOURCE, g.Compute
|
||||
} else if g.Workflow != nil {
|
||||
return g.Workflow
|
||||
return tools.WORKFLOW_RESOURCE, g.Workflow
|
||||
} else if g.Processing != nil {
|
||||
return g.Processing
|
||||
return tools.PROCESSING_RESOURCE, g.Processing
|
||||
} else if g.Storage != nil {
|
||||
return g.Storage
|
||||
return tools.STORAGE_RESOURCE, g.Storage
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *GraphItem) GetPricedItem() pricing.PricedItemITF {
|
||||
if g.Data != nil {
|
||||
return g.Data
|
||||
} else if g.Compute != nil {
|
||||
return g.Compute
|
||||
} else if g.Workflow != nil {
|
||||
return g.Workflow
|
||||
} else if g.Processing != nil {
|
||||
return g.Processing
|
||||
} else if g.Storage != nil {
|
||||
return g.Storage
|
||||
}
|
||||
return nil
|
||||
return tools.INVALID, nil
|
||||
}
|
||||
|
||||
// GraphLink is a struct that represents a link between two items in a graph
|
||||
|
Reference in New Issue
Block a user