2016-10-13 17:15:09 -04:00
package def
2016-09-16 19:06:53 -04:00
import (
2016-11-10 19:47:03 -05:00
"bitbucket.org/sunybingcloud/electron/constants"
2016-09-16 19:06:53 -04:00
"encoding/json"
"github.com/pkg/errors"
2016-10-13 17:15:09 -04:00
"os"
2016-09-16 19:06:53 -04:00
)
type Task struct {
2017-01-03 20:57:25 -05:00
Name string ` json:"name" `
CPU float64 ` json:"cpu" `
RAM float64 ` json:"ram" `
Watts float64 ` json:"watts" `
Image string ` json:"image" `
CMD string ` json:"cmd" `
Instances * int ` json:"inst" `
Host string ` json:"host" `
TaskID string ` json:"taskID" `
2016-12-23 21:04:15 -05:00
ClassToWatts map [ string ] float64 ` json:"class_to_watts" `
2016-09-16 19:06:53 -04:00
}
func TasksFromJSON ( uri string ) ( [ ] Task , error ) {
var tasks [ ] Task
file , err := os . Open ( uri )
if err != nil {
return nil , errors . Wrap ( err , "Error opening file" )
}
err = json . NewDecoder ( file ) . Decode ( & tasks )
if err != nil {
return nil , errors . Wrap ( err , "Error unmarshalling" )
}
return tasks , nil
2016-10-13 17:15:09 -04:00
}
2016-10-15 21:24:14 -04:00
2016-11-10 19:47:03 -05:00
// Update the host on which the task needs to be scheduled.
2016-11-28 17:18:33 -05:00
func ( tsk * Task ) UpdateHost ( newHost string ) bool {
2016-11-10 19:47:03 -05:00
// Validation
2016-11-28 17:18:33 -05:00
isCorrectHost := false
for _ , existingHost := range constants . Hosts {
if newHost == existingHost {
isCorrectHost = true
2016-11-15 15:11:00 -05:00
}
}
2016-11-28 17:18:33 -05:00
if ! isCorrectHost {
2016-11-10 19:47:03 -05:00
return false
} else {
2016-11-28 17:18:33 -05:00
tsk . Host = newHost
2016-11-10 19:47:03 -05:00
return true
}
}
// Set the taskID of the task.
func ( tsk * Task ) SetTaskID ( taskID string ) bool {
// Validation
if taskID == "" {
return false
} else {
tsk . TaskID = taskID
return true
}
}
2017-02-05 14:49:07 -05:00
// Sorter implements sort.Sort interface to sort tasks by Watts requirement.
2016-10-15 21:24:14 -04:00
type WattsSorter [ ] Task
func ( slice WattsSorter ) Len ( ) int {
return len ( slice )
}
func ( slice WattsSorter ) Less ( i , j int ) bool {
return slice [ i ] . Watts < slice [ j ] . Watts
}
func ( slice WattsSorter ) Swap ( i , j int ) {
slice [ i ] , slice [ j ] = slice [ j ] , slice [ i ]
}
2016-11-10 19:47:03 -05:00
2017-02-05 14:49:07 -05:00
// Sorter implements sort.Sort interface to sort tasks by CPU requirement.
type CPUSorter [ ] Task
func ( slice CPUSorter ) Len ( ) int {
return len ( slice )
}
func ( slice CPUSorter ) Less ( i , j int ) bool {
return slice [ i ] . CPU < slice [ j ] . CPU
}
func ( slice CPUSorter ) Swap ( i , j int ) {
slice [ i ] , slice [ j ] = slice [ j ] , slice [ i ]
}
2016-11-10 19:47:03 -05:00
// Compare two tasks.
func Compare ( task1 * Task , task2 * Task ) bool {
// If comparing the same pointers (checking the addresses).
if task1 == task2 {
return true
}
2016-11-28 20:02:03 -05:00
if task1 . TaskID != task2 . TaskID {
2016-11-10 19:47:03 -05:00
return false
2016-11-28 20:02:03 -05:00
} else {
return true
2016-11-10 19:47:03 -05:00
}
}