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