From 478e68e6d4614ef24c4c385f5c2c48792bca2b06 Mon Sep 17 00:00:00 2001 From: mr Date: Fri, 20 Mar 2026 14:20:26 +0100 Subject: [PATCH] Workout Time Scheduling --- models/common/planner.go | 4 +-- models/resources/priced_resource.go | 3 +-- models/workflow/graph/graph.go | 40 +++++++++-------------------- models/workflow/workflow.go | 11 +++----- 4 files changed, 19 insertions(+), 39 deletions(-) diff --git a/models/common/planner.go b/models/common/planner.go index 7238876..5bb8900 100755 --- a/models/common/planner.go +++ b/models/common/planner.go @@ -7,7 +7,7 @@ import ( "cloud.o-forge.io/core/oc-lib/tools" ) -func GetPlannerNearestStart(start time.Time, planned map[tools.DataType]map[string]pricing.PricedItemITF, request *tools.APIRequest) float64 { +func GetPlannerNearestStart(start time.Time, planned map[tools.DataType]map[string]pricing.PricedItemITF) float64 { near := float64(-1) // unset sentinel for _, items := range planned { // loop through the planned items for _, priced := range items { // loop through the priced items @@ -27,7 +27,7 @@ func GetPlannerNearestStart(start time.Time, planned map[tools.DataType]map[stri return near } -func GetPlannerLongestTime(end *time.Time, planned map[tools.DataType]map[string]pricing.PricedItemITF, request *tools.APIRequest) float64 { +func GetPlannerLongestTime(end *time.Time, planned map[tools.DataType]map[string]pricing.PricedItemITF) float64 { if end == nil { return -1 } diff --git a/models/resources/priced_resource.go b/models/resources/priced_resource.go index 59c5e10..f1fa798 100755 --- a/models/resources/priced_resource.go +++ b/models/resources/priced_resource.go @@ -84,8 +84,7 @@ func (abs *PricedResource[T]) GetLocationEnd() *time.Time { func (abs *PricedResource[T]) GetLocationStart() *time.Time { if abs.BookingConfiguration == nil { - now := time.Now().Add(2 * time.Minute) - return &now + return nil } return abs.BookingConfiguration.UsageStart } diff --git a/models/workflow/graph/graph.go b/models/workflow/graph/graph.go index 588d946..c048692 100644 --- a/models/workflow/graph/graph.go +++ b/models/workflow/graph/graph.go @@ -1,8 +1,6 @@ package graph import ( - "time" - "cloud.o-forge.io/core/oc-lib/models/resources" "cloud.o-forge.io/core/oc-lib/tools" ) @@ -67,46 +65,32 @@ func (wf *Graph) IsWorkflow(item GraphItem) bool { return item.Workflow != nil } -func (g *Graph) GetAverageTimeRelatedToProcessingActivity(start time.Time, processings []*resources.ProcessingResource, resource resources.ResourceInterface, +func (g *Graph) GetAverageTimeRelatedToProcessingActivity(processings []*resources.ProcessingResource, resource resources.ResourceInterface, f func(GraphItem) resources.ResourceInterface, instance int, partnership int, buying int, strategy int, bookingMode int, request *tools.APIRequest) (float64, float64, error) { - nearestStart := float64(10000000000) oneIsInfinite := false longestDuration := float64(0) for _, link := range g.Links { for _, processing := range processings { - var source string // source is the source of the link - if link.Destination.ID == processing.GetID() && f(g.Items[link.Source.ID]) != nil && f(g.Items[link.Source.ID]).GetID() == resource.GetID() { // if the destination is the processing and the source is not a compute - source = link.Source.ID - } 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 + if !(link.Destination.ID == processing.GetID() && f(g.Items[link.Source.ID]) != nil && f(g.Items[link.Source.ID]).GetID() == resource.GetID()) && + !(link.Source.ID == processing.GetID() && f(g.Items[link.Source.ID]) != nil && f(g.Items[link.Source.ID]).GetID() == resource.GetID()) { + continue } priced, err := processing.ConvertToPricedResource(tools.PROCESSING_RESOURCE, &instance, &partnership, &buying, &strategy, &bookingMode, request) if err != nil { return 0, 0, err } - if source != "" { - if priced.GetLocationStart() != nil { - near := float64(priced.GetLocationStart().Sub(start).Seconds()) - if near < nearestStart { - nearestStart = near - } - - } - if priced.GetLocationEnd() != nil { - duration := float64(priced.GetLocationEnd().Sub(*priced.GetLocationStart()).Seconds()) - if longestDuration < duration { - longestDuration = duration - } - } else { - oneIsInfinite = true - } + duration := priced.GetExplicitDurationInS() + if duration < 0 { + oneIsInfinite = true + } else if longestDuration < duration { + longestDuration = duration } } } if oneIsInfinite { - return nearestStart, -1, nil + return 0, -1, nil } - return nearestStart, longestDuration, nil + return 0, longestDuration, nil } /* @@ -155,7 +139,7 @@ func (g *Graph) GetAverageTimeProcessingBeforeStart(average float64, processingI func (g *Graph) GetResource(id string) (tools.DataType, resources.ResourceInterface) { if item, ok := g.Items[id]; ok { - if item.Data != nil { + if item.NativeTool != nil { return tools.NATIVE_TOOL, item.NativeTool } else if item.Data != nil { return tools.DATA_RESOURCE, item.Data diff --git a/models/workflow/workflow.go b/models/workflow/workflow.go index e49417b..7e23173 100644 --- a/models/workflow/workflow.go +++ b/models/workflow/workflow.go @@ -632,7 +632,7 @@ func (wf *Workflow) Planify(start time.Time, end *time.Time, instances ConfigIte tools.COMPUTE_RESOURCE: wf.Graph.IsCompute} { if _, priceds, err = plan[resources.ResourceInterface](k, instances, partnerships, buyings, strategies, bookingMode, wf, priceds, request, f, func(res resources.ResourceInterface, priced pricing.PricedItemITF) (time.Time, float64, error) { - nearestStart, longestDuration, err := wf.Graph.GetAverageTimeRelatedToProcessingActivity(start, ps, res, func(i graph.GraphItem) (r resources.ResourceInterface) { + nearestStart, longestDuration, err := wf.Graph.GetAverageTimeRelatedToProcessingActivity(ps, res, func(i graph.GraphItem) (r resources.ResourceInterface) { if f(i) { _, r = i.GetResource() } @@ -650,11 +650,11 @@ func (wf *Workflow) Planify(start time.Time, end *time.Time, instances ConfigIte return false, 0, priceds, nil, err } } - longest := common.GetPlannerLongestTime(end, priceds, request) + longest := common.GetPlannerLongestTime(end, priceds) if _, priceds, err = plan[resources.ResourceInterface](tools.WORKFLOW_RESOURCE, instances, partnerships, buyings, strategies, bookingMode, wf, priceds, request, wf.Graph.IsWorkflow, func(res resources.ResourceInterface, priced pricing.PricedItemITF) (time.Time, float64, error) { - start := start.Add(time.Duration(common.GetPlannerNearestStart(start, priceds, request)) * time.Second) + start := start.Add(time.Duration(common.GetPlannerNearestStart(start, priceds)) * time.Second) longest := float64(-1) r, code, err := res.GetAccessor(request).LoadOne(res.GetID()) if code != 200 || err != nil { @@ -678,7 +678,7 @@ func (wf *Workflow) Planify(start time.Time, end *time.Time, instances ConfigIte } } - return start.Add(time.Duration(common.GetPlannerNearestStart(start, priceds, request)) * time.Second), longest, nil + return start.Add(time.Duration(common.GetPlannerNearestStart(start, priceds)) * time.Second), longest, nil }, func(start time.Time, longest float64) (*time.Time, error) { s := start.Add(time.Duration(longest) * time.Second) return &s, nil @@ -756,9 +756,6 @@ func plan[T resources.ResourceInterface]( priced.SetLocationEnd(*e) } } - if e, err := end(started, priced.GetExplicitDurationInS()); err != nil && e != nil { - priced.SetLocationEnd(*e) - } resources = append(resources, realItem.(T)) if priceds[dt][item.ID] != nil { priced.AddQuantity(priceds[dt][item.ID].GetQuantity())