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

Commit 1916ea0

Browse files
committed
Fix #1157: Check for unsupported keys in task manifests
1 parent 9dcbeb0 commit 1916ea0

2 files changed

Lines changed: 183 additions & 0 deletions

File tree

core/task.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ package core
2222
import (
2323
"encoding/json"
2424
"errors"
25+
"fmt"
2526
"io"
2627
"io/ioutil"
2728
"time"
@@ -157,13 +158,56 @@ type TaskErrors interface {
157158

158159
type TaskCreationRequest struct {
159160
Name string `json:"name"`
161+
Version int `json:"version"`
160162
Deadline string `json:"deadline"`
161163
Workflow *wmap.WorkflowMap `json:"workflow"`
162164
Schedule Schedule `json:"schedule"`
163165
Start bool `json:"start"`
164166
MaxFailures int `json:"max-failures"`
165167
}
166168

169+
func (tr *TaskCreationRequest) UnmarshalJSON(data []byte) error {
170+
t := make(map[string]json.RawMessage)
171+
if err := json.Unmarshal(data, &t); err != nil {
172+
return err
173+
}
174+
for k, v := range t {
175+
switch k {
176+
case "name":
177+
if err := json.Unmarshal(v, &(tr.Name)); err != nil {
178+
return fmt.Errorf("%v (while parsing 'name')", err)
179+
}
180+
case "deadline":
181+
if err := json.Unmarshal(v, &(tr.Deadline)); err != nil {
182+
return fmt.Errorf("%v (while parsing 'deadline')", err)
183+
}
184+
case "workflow":
185+
if err := json.Unmarshal(v, &(tr.Workflow)); err != nil {
186+
return err
187+
}
188+
case "schedule":
189+
if err := json.Unmarshal(v, &(tr.Schedule)); err != nil {
190+
return err
191+
}
192+
case "start":
193+
if err := json.Unmarshal(v, &(tr.Start)); err != nil {
194+
return fmt.Errorf("%v (while parsing 'start')", err)
195+
}
196+
case "max-failures":
197+
if err := json.Unmarshal(v, &(tr.MaxFailures)); err != nil {
198+
return fmt.Errorf("%v (while parsing 'max-failures')", err)
199+
}
200+
case "version":
201+
if err := json.Unmarshal(v, &(tr.Version)); err != nil {
202+
return fmt.Errorf("%v (while parsing 'version')", err)
203+
}
204+
default:
205+
return fmt.Errorf("Unrecognized key '%v' in task creation request", k)
206+
}
207+
}
208+
return nil
209+
}
210+
167211
// Function used to create a task according to content (1st parameter)
168212
// . Content can be retrieved from a configuration file or a HTTP REST request body
169213
// . Mode is used to specify if the created task should start right away or not

scheduler/wmap/wmap.go

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,24 @@ type WorkflowMap struct {
133133
CollectNode *CollectWorkflowMapNode `json:"collect"yaml:"collect"`
134134
}
135135

136+
func (w *WorkflowMap) UnmarshalJSON(data []byte) error {
137+
t := make(map[string]json.RawMessage)
138+
if err := json.Unmarshal(data, &t); err != nil {
139+
return err
140+
}
141+
for k, v := range t {
142+
switch k {
143+
case "collect":
144+
if err := json.Unmarshal(v, &w.CollectNode); err != nil {
145+
return err
146+
}
147+
default:
148+
return fmt.Errorf("Unrecognized key '%v' in workflow of task.", k)
149+
}
150+
}
151+
return nil
152+
}
153+
136154
func NewWorkflowMap() *WorkflowMap {
137155
w := &WorkflowMap{}
138156
c := &CollectWorkflowMapNode{
@@ -159,6 +177,40 @@ type CollectWorkflowMapNode struct {
159177
PublishNodes []PublishWorkflowMapNode `json:"publish,omitempty"yaml:"publish"`
160178
}
161179

180+
func (cw *CollectWorkflowMapNode) UnmarshalJSON(data []byte) error {
181+
t := make(map[string]json.RawMessage)
182+
if err := json.Unmarshal(data, &t); err != nil {
183+
return err
184+
}
185+
for k, v := range t {
186+
switch k {
187+
case "metrics":
188+
if err := json.Unmarshal(v, &cw.Metrics); err != nil {
189+
return err
190+
}
191+
case "config":
192+
if err := json.Unmarshal(v, &cw.Config); err != nil {
193+
return fmt.Errorf("%v (while parsing 'config')", err)
194+
}
195+
case "tags":
196+
if err := json.Unmarshal(v, &cw.Tags); err != nil {
197+
return fmt.Errorf("%v (while parsing 'tags')", err)
198+
}
199+
case "process":
200+
if err := json.Unmarshal(v, &cw.ProcessNodes); err != nil {
201+
return err
202+
}
203+
case "publish":
204+
if err := json.Unmarshal(v, &cw.PublishNodes); err != nil {
205+
return err
206+
}
207+
default:
208+
return fmt.Errorf("Unrecognized key '%v' in collect workflow of task.", k)
209+
}
210+
}
211+
return nil
212+
}
213+
162214
func (c *CollectWorkflowMapNode) GetMetrics() []Metric {
163215
metrics := make([]Metric, len(c.Metrics))
164216
i := 0
@@ -240,6 +292,45 @@ type ProcessWorkflowMapNode struct {
240292
Target string `json:"target"yaml:"target"`
241293
}
242294

295+
func (pw *ProcessWorkflowMapNode) UnmarshalJSON(data []byte) error {
296+
t := make(map[string]json.RawMessage)
297+
if err := json.Unmarshal(data, &t); err != nil {
298+
return err
299+
}
300+
for k, v := range t {
301+
switch k {
302+
case "plugin_name":
303+
if err := json.Unmarshal(v, &pw.Name); err != nil {
304+
return fmt.Errorf("%v (while parsing 'plugin_name')", err)
305+
}
306+
case "plugin_version":
307+
if err := json.Unmarshal(v, &pw.Version); err != nil {
308+
return fmt.Errorf("%v (while parsing 'plugin_version')", err)
309+
}
310+
case "process":
311+
if err := json.Unmarshal(v, &pw.ProcessNodes); err != nil {
312+
return err
313+
}
314+
case "publish":
315+
if err := json.Unmarshal(v, &pw.PublishNodes); err != nil {
316+
return err
317+
}
318+
case "config":
319+
if err := json.Unmarshal(v, &pw.Config); err != nil {
320+
return fmt.Errorf("%v (while parsing 'config')", err)
321+
}
322+
case "target":
323+
if err := json.Unmarshal(v, &pw.Target); err != nil {
324+
return fmt.Errorf("%v (while parsing 'target')", err)
325+
}
326+
default:
327+
return fmt.Errorf("Unrecognized key '%v' in process workflow of task.", k)
328+
}
329+
}
330+
return nil
331+
332+
}
333+
243334
func NewProcessNode(name string, version int) *ProcessWorkflowMapNode {
244335
p := &ProcessWorkflowMapNode{
245336
Name: name,
@@ -282,6 +373,36 @@ type PublishWorkflowMapNode struct {
282373
Target string `json:"target"yaml:"target"`
283374
}
284375

376+
func (pw *PublishWorkflowMapNode) UnmarshalJSON(data []byte) error {
377+
t := make(map[string]json.RawMessage)
378+
if err := json.Unmarshal(data, &t); err != nil {
379+
return err
380+
}
381+
for k, v := range t {
382+
switch k {
383+
case "plugin_name":
384+
if err := json.Unmarshal(v, &pw.Name); err != nil {
385+
return fmt.Errorf("%v (while parsing 'plugin_name')", err)
386+
}
387+
case "plugin_version":
388+
if err := json.Unmarshal(v, &pw.Version); err != nil {
389+
return fmt.Errorf("%v (while parsing 'plugin_version')", err)
390+
}
391+
case "config":
392+
if err := json.Unmarshal(v, &pw.Config); err != nil {
393+
return fmt.Errorf("%v (while parsing 'config')", err)
394+
}
395+
case "target":
396+
if err := json.Unmarshal(v, &pw.Target); err != nil {
397+
return fmt.Errorf("%v (while parsing 'target')", err)
398+
}
399+
default:
400+
return fmt.Errorf("Unrecognized key '%v' in publish workflow of task.", k)
401+
}
402+
}
403+
return nil
404+
}
405+
285406
func NewPublishNode(name string, version int) *PublishWorkflowMapNode {
286407
p := &PublishWorkflowMapNode{
287408
Name: name,
@@ -308,6 +429,24 @@ type metricInfo struct {
308429
Version_ int `json:"version"yaml:"version"`
309430
}
310431

432+
func (m *metricInfo) UnmarshalJSON(data []byte) error {
433+
t := make(map[string]json.RawMessage)
434+
if err := json.Unmarshal(data, &t); err != nil {
435+
return err
436+
}
437+
for k, v := range t {
438+
switch k {
439+
case "version":
440+
if err := json.Unmarshal(v, &m.Version_); err != nil {
441+
return fmt.Errorf("%v (while parsing 'version')", err)
442+
}
443+
default:
444+
return fmt.Errorf("Unrecognized key '%v' in metrics in collect workflow of task", k)
445+
}
446+
}
447+
return nil
448+
}
449+
311450
type Metric struct {
312451
namespace []string
313452
version int

0 commit comments

Comments
 (0)