Skip to content
This repository has been archived by the owner on Nov 8, 2022. It is now read-only.

Commit

Permalink
Fix #1157: Check for unsupported keys in task manifests
Browse files Browse the repository at this point in the history
  • Loading branch information
geauxvirtual committed Sep 2, 2016
1 parent 9dcbeb0 commit 1916ea0
Show file tree
Hide file tree
Showing 2 changed files with 183 additions and 0 deletions.
44 changes: 44 additions & 0 deletions core/task.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ package core
import (
"encoding/json"
"errors"
"fmt"
"io"
"io/ioutil"
"time"
Expand Down Expand Up @@ -157,13 +158,56 @@ type TaskErrors interface {

type TaskCreationRequest struct {
Name string `json:"name"`
Version int `json:"version"`
Deadline string `json:"deadline"`
Workflow *wmap.WorkflowMap `json:"workflow"`
Schedule Schedule `json:"schedule"`
Start bool `json:"start"`
MaxFailures int `json:"max-failures"`
}

func (tr *TaskCreationRequest) UnmarshalJSON(data []byte) error {
t := make(map[string]json.RawMessage)
if err := json.Unmarshal(data, &t); err != nil {
return err
}
for k, v := range t {
switch k {
case "name":
if err := json.Unmarshal(v, &(tr.Name)); err != nil {
return fmt.Errorf("%v (while parsing 'name')", err)
}
case "deadline":
if err := json.Unmarshal(v, &(tr.Deadline)); err != nil {
return fmt.Errorf("%v (while parsing 'deadline')", err)
}
case "workflow":
if err := json.Unmarshal(v, &(tr.Workflow)); err != nil {
return err
}
case "schedule":
if err := json.Unmarshal(v, &(tr.Schedule)); err != nil {
return err
}
case "start":
if err := json.Unmarshal(v, &(tr.Start)); err != nil {
return fmt.Errorf("%v (while parsing 'start')", err)
}
case "max-failures":
if err := json.Unmarshal(v, &(tr.MaxFailures)); err != nil {
return fmt.Errorf("%v (while parsing 'max-failures')", err)
}
case "version":
if err := json.Unmarshal(v, &(tr.Version)); err != nil {
return fmt.Errorf("%v (while parsing 'version')", err)
}
default:
return fmt.Errorf("Unrecognized key '%v' in task creation request", k)
}
}
return nil
}

// Function used to create a task according to content (1st parameter)
// . Content can be retrieved from a configuration file or a HTTP REST request body
// . Mode is used to specify if the created task should start right away or not
Expand Down
139 changes: 139 additions & 0 deletions scheduler/wmap/wmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,24 @@ type WorkflowMap struct {
CollectNode *CollectWorkflowMapNode `json:"collect"yaml:"collect"`
}

func (w *WorkflowMap) UnmarshalJSON(data []byte) error {
t := make(map[string]json.RawMessage)
if err := json.Unmarshal(data, &t); err != nil {
return err
}
for k, v := range t {
switch k {
case "collect":
if err := json.Unmarshal(v, &w.CollectNode); err != nil {
return err
}
default:
return fmt.Errorf("Unrecognized key '%v' in workflow of task.", k)
}
}
return nil
}

func NewWorkflowMap() *WorkflowMap {
w := &WorkflowMap{}
c := &CollectWorkflowMapNode{
Expand All @@ -159,6 +177,40 @@ type CollectWorkflowMapNode struct {
PublishNodes []PublishWorkflowMapNode `json:"publish,omitempty"yaml:"publish"`
}

func (cw *CollectWorkflowMapNode) UnmarshalJSON(data []byte) error {
t := make(map[string]json.RawMessage)
if err := json.Unmarshal(data, &t); err != nil {
return err
}
for k, v := range t {
switch k {
case "metrics":
if err := json.Unmarshal(v, &cw.Metrics); err != nil {
return err
}
case "config":
if err := json.Unmarshal(v, &cw.Config); err != nil {
return fmt.Errorf("%v (while parsing 'config')", err)
}
case "tags":
if err := json.Unmarshal(v, &cw.Tags); err != nil {
return fmt.Errorf("%v (while parsing 'tags')", err)
}
case "process":
if err := json.Unmarshal(v, &cw.ProcessNodes); err != nil {
return err
}
case "publish":
if err := json.Unmarshal(v, &cw.PublishNodes); err != nil {
return err
}
default:
return fmt.Errorf("Unrecognized key '%v' in collect workflow of task.", k)
}
}
return nil
}

func (c *CollectWorkflowMapNode) GetMetrics() []Metric {
metrics := make([]Metric, len(c.Metrics))
i := 0
Expand Down Expand Up @@ -240,6 +292,45 @@ type ProcessWorkflowMapNode struct {
Target string `json:"target"yaml:"target"`
}

func (pw *ProcessWorkflowMapNode) UnmarshalJSON(data []byte) error {
t := make(map[string]json.RawMessage)
if err := json.Unmarshal(data, &t); err != nil {
return err
}
for k, v := range t {
switch k {
case "plugin_name":
if err := json.Unmarshal(v, &pw.Name); err != nil {
return fmt.Errorf("%v (while parsing 'plugin_name')", err)
}
case "plugin_version":
if err := json.Unmarshal(v, &pw.Version); err != nil {
return fmt.Errorf("%v (while parsing 'plugin_version')", err)
}
case "process":
if err := json.Unmarshal(v, &pw.ProcessNodes); err != nil {
return err
}
case "publish":
if err := json.Unmarshal(v, &pw.PublishNodes); err != nil {
return err
}
case "config":
if err := json.Unmarshal(v, &pw.Config); err != nil {
return fmt.Errorf("%v (while parsing 'config')", err)
}
case "target":
if err := json.Unmarshal(v, &pw.Target); err != nil {
return fmt.Errorf("%v (while parsing 'target')", err)
}
default:
return fmt.Errorf("Unrecognized key '%v' in process workflow of task.", k)
}
}
return nil

}

func NewProcessNode(name string, version int) *ProcessWorkflowMapNode {
p := &ProcessWorkflowMapNode{
Name: name,
Expand Down Expand Up @@ -282,6 +373,36 @@ type PublishWorkflowMapNode struct {
Target string `json:"target"yaml:"target"`
}

func (pw *PublishWorkflowMapNode) UnmarshalJSON(data []byte) error {
t := make(map[string]json.RawMessage)
if err := json.Unmarshal(data, &t); err != nil {
return err
}
for k, v := range t {
switch k {
case "plugin_name":
if err := json.Unmarshal(v, &pw.Name); err != nil {
return fmt.Errorf("%v (while parsing 'plugin_name')", err)
}
case "plugin_version":
if err := json.Unmarshal(v, &pw.Version); err != nil {
return fmt.Errorf("%v (while parsing 'plugin_version')", err)
}
case "config":
if err := json.Unmarshal(v, &pw.Config); err != nil {
return fmt.Errorf("%v (while parsing 'config')", err)
}
case "target":
if err := json.Unmarshal(v, &pw.Target); err != nil {
return fmt.Errorf("%v (while parsing 'target')", err)
}
default:
return fmt.Errorf("Unrecognized key '%v' in publish workflow of task.", k)
}
}
return nil
}

func NewPublishNode(name string, version int) *PublishWorkflowMapNode {
p := &PublishWorkflowMapNode{
Name: name,
Expand All @@ -308,6 +429,24 @@ type metricInfo struct {
Version_ int `json:"version"yaml:"version"`
}

func (m *metricInfo) UnmarshalJSON(data []byte) error {
t := make(map[string]json.RawMessage)
if err := json.Unmarshal(data, &t); err != nil {
return err
}
for k, v := range t {
switch k {
case "version":
if err := json.Unmarshal(v, &m.Version_); err != nil {
return fmt.Errorf("%v (while parsing 'version')", err)
}
default:
return fmt.Errorf("Unrecognized key '%v' in metrics in collect workflow of task", k)
}
}
return nil
}

type Metric struct {
namespace []string
version int
Expand Down

0 comments on commit 1916ea0

Please sign in to comment.