add event base intelligency
This commit is contained in:
@@ -29,7 +29,7 @@ func TestNewScheduler_ValidInput(t *testing.T) {
|
||||
dur := 7200.0
|
||||
cronStr := "0 0 * * * *"
|
||||
|
||||
sched := workflow_execution.NewScheduler(s, e, dur, cronStr)
|
||||
sched := workflow_execution.NewScheduler(0, s, e, dur, cronStr)
|
||||
|
||||
assert.NotNil(t, sched)
|
||||
assert.Equal(t, dur, sched.DurationS)
|
||||
@@ -42,7 +42,7 @@ func TestNewScheduler_InvalidStart(t *testing.T) {
|
||||
dur := 7200.0
|
||||
cronStr := "0 0 * * * *"
|
||||
|
||||
sched := workflow_execution.NewScheduler(s, e, dur, cronStr)
|
||||
sched := workflow_execution.NewScheduler(0, s, e, dur, cronStr)
|
||||
assert.Nil(t, sched)
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ func TestNewScheduler_InvalidEnd(t *testing.T) {
|
||||
dur := 7200.0
|
||||
cronStr := "0 0 * * * *"
|
||||
|
||||
sched := workflow_execution.NewScheduler(s, e, dur, cronStr)
|
||||
sched := workflow_execution.NewScheduler(0, s, e, dur, cronStr)
|
||||
assert.NotNil(t, sched)
|
||||
assert.Nil(t, sched.End)
|
||||
}
|
||||
@@ -120,7 +120,7 @@ func TestGetExecutions_Success(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
execs, err := ws.GetExecutions(wf)
|
||||
execs, err := ws.GetExecutions(wf, false)
|
||||
assert.NoError(t, err)
|
||||
assert.Greater(t, len(execs), 0)
|
||||
assert.Equal(t, wf.UUID, execs[0].WorkflowID)
|
||||
|
||||
@@ -93,7 +93,7 @@ func TestGetName_ReturnsCorrectFormat(t *testing.T) {
|
||||
|
||||
func TestVerifyAuth_AlwaysTrue(t *testing.T) {
|
||||
exec := &workflow_execution.WorkflowExecution{}
|
||||
assert.True(t, exec.VerifyAuth(nil))
|
||||
assert.True(t, exec.VerifyAuth("get", nil))
|
||||
}
|
||||
|
||||
func TestUpdateOne_RejectsZeroState(t *testing.T) {
|
||||
|
||||
@@ -23,6 +23,7 @@ import (
|
||||
*/
|
||||
type WorkflowExecution struct {
|
||||
utils.AbstractObject // AbstractObject contains the basic fields of an object (id, name)
|
||||
Priority int `json:"priority" bson:"priority"` // will best effort on default // Will Best Effort on priority
|
||||
PeerBuyByGraph map[string]map[string][]string `json:"peer_buy_by_graph,omitempty" bson:"peer_buy_by_graph,omitempty"` // BookByResource is a map of the resource id and the list of the booking id
|
||||
PeerBookByGraph map[string]map[string][]string `json:"peer_book_by_graph,omitempty" bson:"peer_book_by_graph,omitempty"` // BookByResource is a map of the resource id and the list of the booking id
|
||||
ExecutionsID string `json:"executions_id,omitempty" bson:"executions_id,omitempty"`
|
||||
@@ -108,7 +109,7 @@ func (d *WorkflowExecution) GetAccessor(request *tools.APIRequest) utils.Accesso
|
||||
return NewAccessor(request) // Create a new instance of the accessor
|
||||
}
|
||||
|
||||
func (d *WorkflowExecution) VerifyAuth(request *tools.APIRequest) bool {
|
||||
func (d *WorkflowExecution) VerifyAuth(callName string, request *tools.APIRequest) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
@@ -37,20 +37,42 @@ type WorkflowSchedule struct {
|
||||
DurationS float64 `json:"duration_s" default:"-1"` // End is the end time of the schedule
|
||||
Cron string `json:"cron,omitempty"` // here the cron format : ss mm hh dd MM dw task
|
||||
|
||||
BookingMode booking.BookingMode `json:"booking_mode,omitempty"` // BookingMode qualify the preemption order of the scheduling. if no payment allowed with preemption set up When_Possible
|
||||
SelectedInstances workflow.ConfigItem `json:"selected_instances"`
|
||||
SelectedPartnerships workflow.ConfigItem `json:"selected_partnerships"`
|
||||
SelectedBuyings workflow.ConfigItem `json:"selected_buyings"`
|
||||
SelectedStrategies workflow.ConfigItem `json:"selected_strategies"`
|
||||
|
||||
SelectedBillingStrategy pricing.BillingStrategy `json:"selected_billing_strategy"`
|
||||
}
|
||||
|
||||
func NewScheduler(start string, end string, durationInS float64, cron string) *WorkflowSchedule {
|
||||
s, err := time.Parse("2006-01-02T15:04:05", start)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
// TODO PREEMPTION !
|
||||
/*
|
||||
To schedule a preempted, omg.
|
||||
pour faire ça on doit alors lancé une exécution prioritaire qui passera devant toutes les autres, celon un niveau de priorité.
|
||||
Preemptible = 7, pour le moment il n'existera que 0 et 7.
|
||||
Dans le cas d'une préemption l'exécution est immédiable et bloquera tout le monde tant qu'il n'a pas été exécuté.
|
||||
Une ressource doit pouvoir être preemptible pour être exécutée de la sorte.
|
||||
Se qui implique si on est sur une ressource par ressource que si un élement n'est pas préemptible,
|
||||
alors il devra être effectué dés que possible
|
||||
|
||||
Dans le cas dés que possible, la start date est immédiate MAIS !
|
||||
ne pourra se lancé que SI il n'existe pas d'exécution se lançant durant la période indicative. ( Ultra complexe )
|
||||
*/
|
||||
|
||||
func NewScheduler(mode int, start string, end string, durationInS float64, cron string) *WorkflowSchedule {
|
||||
ws := &WorkflowSchedule{
|
||||
UUID: uuid.New().String(),
|
||||
Start: s,
|
||||
DurationS: durationInS,
|
||||
Cron: cron,
|
||||
UUID: uuid.New().String(),
|
||||
Start: time.Now(),
|
||||
BookingMode: booking.BookingMode(mode),
|
||||
DurationS: durationInS,
|
||||
Cron: cron,
|
||||
}
|
||||
s, err := time.Parse("2006-01-02T15:04:05", start)
|
||||
if err == nil && ws.BookingMode == booking.PLANNED {
|
||||
ws.Start = s // can apply a defined start other than now, if planned
|
||||
}
|
||||
|
||||
e, err := time.Parse("2006-01-02T15:04:05", end)
|
||||
if err == nil {
|
||||
ws.End = &e
|
||||
@@ -68,7 +90,9 @@ func (ws *WorkflowSchedule) GetBuyAndBook(wfID string, request *tools.APIRequest
|
||||
return false, nil, []*WorkflowExecution{}, []*purchase_resource.PurchaseResource{}, []*booking.Booking{}, errors.New("could not load the workflow with id: " + err.Error())
|
||||
}
|
||||
wf := res.(*workflow.Workflow)
|
||||
longest, priceds, wf, err := wf.Planify(ws.Start, ws.End, request)
|
||||
isPreemptible, longest, priceds, wf, err := wf.Planify(ws.Start, ws.End,
|
||||
ws.SelectedInstances, ws.SelectedPartnerships, ws.SelectedBuyings, ws.SelectedStrategies,
|
||||
int(ws.BookingMode), request)
|
||||
if err != nil {
|
||||
return false, wf, []*WorkflowExecution{}, []*purchase_resource.PurchaseResource{}, []*booking.Booking{}, err
|
||||
}
|
||||
@@ -77,7 +101,7 @@ func (ws *WorkflowSchedule) GetBuyAndBook(wfID string, request *tools.APIRequest
|
||||
if ws.End != nil && ws.Start.Add(time.Duration(longest)*time.Second).After(*ws.End) {
|
||||
ws.Warning = "The workflow may be too long to be executed in the given time frame, we will try to book it anyway\n"
|
||||
}
|
||||
execs, err := ws.GetExecutions(wf)
|
||||
execs, err := ws.GetExecutions(wf, isPreemptible)
|
||||
if err != nil {
|
||||
return false, wf, []*WorkflowExecution{}, []*purchase_resource.PurchaseResource{}, []*booking.Booking{}, err
|
||||
}
|
||||
@@ -250,7 +274,7 @@ VERIFY THAT WE HANDLE DIFFERENCE BETWEEN LOCATION TIME && BOOKING
|
||||
* getExecutions is a function that returns the executions of a workflow
|
||||
* it returns an array of workflow_execution.WorkflowExecution
|
||||
*/
|
||||
func (ws *WorkflowSchedule) GetExecutions(workflow *workflow.Workflow) ([]*WorkflowExecution, error) {
|
||||
func (ws *WorkflowSchedule) GetExecutions(workflow *workflow.Workflow, isPreemptible bool) ([]*WorkflowExecution, error) {
|
||||
workflows_executions := []*WorkflowExecution{}
|
||||
dates, err := ws.GetDates()
|
||||
if err != nil {
|
||||
@@ -262,12 +286,19 @@ func (ws *WorkflowSchedule) GetExecutions(workflow *workflow.Workflow) ([]*Workf
|
||||
UUID: uuid.New().String(), // set the uuid of the execution
|
||||
Name: workflow.Name + "_execution_" + date.Start.String(), // set the name of the execution
|
||||
},
|
||||
Priority: 1,
|
||||
ExecutionsID: ws.UUID,
|
||||
ExecDate: date.Start, // set the execution date
|
||||
EndDate: date.End, // set the end date
|
||||
State: enum.DRAFT, // set the state to 1 (scheduled)
|
||||
WorkflowID: workflow.GetID(), // set the workflow id dependancy of the execution
|
||||
}
|
||||
if ws.BookingMode != booking.PLANNED {
|
||||
obj.Priority = 0
|
||||
}
|
||||
if ws.BookingMode == booking.PREEMPTED && isPreemptible {
|
||||
obj.Priority = 7
|
||||
}
|
||||
workflows_executions = append(workflows_executions, obj)
|
||||
}
|
||||
return workflows_executions, nil
|
||||
|
||||
Reference in New Issue
Block a user