From 798453248632fdf6cc5c65a83bdd276c1911362f Mon Sep 17 00:00:00 2001 From: Dan Jaglowski Date: Mon, 27 Jul 2020 15:45:37 -0400 Subject: [PATCH 1/4] Ehanced parameter metadata to include concepts of required/optional, default values, and specific parameter types --- operator/plugin.go | 20 ++- operator/plugin_parameter.go | 110 +++++++++++++++ operator/plugin_test.go | 250 ++++++++++++++++++++++++++++++++++- 3 files changed, 368 insertions(+), 12 deletions(-) create mode 100644 operator/plugin_parameter.go diff --git a/operator/plugin.go b/operator/plugin.go index 6e54f27d6..5d0a323f1 100644 --- a/operator/plugin.go +++ b/operator/plugin.go @@ -21,13 +21,6 @@ type PluginConfig struct { Pipeline []Config } -// PluginParameter is a basic description of a plugin's parameter. -type PluginParameter struct { - Label string - Description string - Type string -} - // PluginRegistry is a registry of plugin templates. type PluginRegistry map[string]*template.Template @@ -63,6 +56,19 @@ func (r PluginRegistry) Render(pluginType string, params map[string]interface{}) ) } + for name, param := range config.Parameters { + if err := param.validate(); err != nil { + return PluginConfig{}, errors.NewError( + "invalid parameter description found in plugin config", + "ensure that all parameter descriptioins are valid for the plugin", + "plugin_type", pluginType, + "plugin_parameter", name, + "rendered_config", writer.String(), + "error_message", err.Error(), + ) + } + } + return config, nil } diff --git a/operator/plugin_parameter.go b/operator/plugin_parameter.go new file mode 100644 index 000000000..19a6a3d93 --- /dev/null +++ b/operator/plugin_parameter.go @@ -0,0 +1,110 @@ +package operator + +import ( + "fmt" + + "github.com/observiq/carbon/errors" +) + +// PluginParameter is a basic description of a plugin's parameter. +type PluginParameter struct { + Label string + Description string + Required bool + Type interface{} // "string", "int", "bool" or array of strings + Default interface{} // Must fit Type +} + +func (param PluginParameter) validate() error { + switch t := param.Type.(type) { + case string: + switch t { + case "string", "int", "bool": // ok + default: + return errors.NewError( + "invalid type for parameter", + "ensure that the type is one of 'string', 'int', 'bool', or an array containing only strings", + ) + } + + if param.Default == nil { + return nil + } + + // Validate default corresponds to type + switch param.Default.(type) { + case string: + if param.Type != "string" { + return errors.NewError( + fmt.Sprintf("default value is a string but parameter type is %s", param.Type), + "ensure that the default value is a string", + ) + } + case int, int32, int64: + if param.Type != "int" { + return errors.NewError( + fmt.Sprintf("default value is an int but parameter type is %s", param.Type), + "ensure that the default value is an int", + ) + } + case bool: + if param.Type != "bool" { + return errors.NewError( + fmt.Sprintf("default value is a bool but parameter type is %s", param.Type), + "ensure that the default value is a bool", + ) + } + default: + return errors.NewError( + "invalid default value", + "ensure that the default value corresponds to parameter type", + ) + } + + return nil + case []interface{}: // array represents enumerated values + for _, e := range t { + if _, ok := e.(string); !ok { + return errors.NewError( + "invalid value for enumerated parameter", + "ensure that all enumerated values are strings", + ) + } + } + + if param.Default == nil { + return nil + } + + // Validate that the default value is included in the enumeration + def, ok := param.Default.(string) + if !ok { + return errors.NewError( + "invalid default for enumerated parameter", + "ensure that the default value is a string", + ) + } + + validDef := false + for _, e := range t { + if str, ok := e.(string); ok && str == def { + validDef = true + } + } + + if !validDef { + return errors.NewError( + "invalid default value for enumerated parameter", + "ensure default value is listed as a valid value", + ) + } + + return nil + + default: + return errors.NewError( + "invalid type for parameter", + "supported types are 'string', 'int', 'bool', and array of strings", + ) + } +} diff --git a/operator/plugin_test.go b/operator/plugin_test.go index 43d9b421e..9653ce457 100644 --- a/operator/plugin_test.go +++ b/operator/plugin_test.go @@ -145,7 +145,7 @@ parameters: other: label: Other Thing description: Another parameter - type: integer + type: int pipeline: `, }, @@ -163,7 +163,7 @@ parameters: other: label: Other Thing description: Another parameter - type: integer + type: int pipeline: `, }, @@ -181,7 +181,7 @@ parameters: other: label: Other Thing description: Another parameter - type: integer + type: int pipeline: `, }, @@ -199,7 +199,7 @@ parameters: other: label: Other Thing description: Another parameter - type: integer + type: int pipeline: `, }, @@ -261,18 +261,258 @@ parameters: path: label: Path description: The path to a thing - type: [] + type: {} pipeline: `, }, { name: "empty_parameter", + expectErr: true, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: +pipeline: +`, + }, + { + name: "unknown_parameter_type", + expectErr: true, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: custom +pipeline: +`, + }, + { + name: "string_parameter_type", + expectErr: false, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: string +pipeline: +`, + }, + { + name: "string_parameter_default", + expectErr: false, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: string + default: hello +pipeline: +`, + }, + { + name: "string_parameter_default_invalid", + expectErr: true, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: string + default: 123 +pipeline: +`, + }, + { + name: "int_parameter_type", expectErr: false, template: `version: 0.0.0 title: My Super Plugin description: This is the best plugin ever parameters: path: + label: Parameter + description: The thing of the thing + type: int +pipeline: +`, + }, + { + name: "int_parameter_default", + expectErr: false, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: int + default: 123 +pipeline: +`, + }, + { + name: "int_parameter_default_invalid", + expectErr: true, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: int + default: hello +pipeline: +`, + }, + { + name: "bool_parameter_type", + expectErr: false, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: bool +pipeline: +`, + }, + { + name: "bool_parameter_default_true", + expectErr: false, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: bool + default: true +pipeline: +`, + }, + { + name: "bool_parameter_default_false", + expectErr: false, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: bool + default: false +pipeline: +`, + }, + { + name: "bool_parameter_default_invalid", + expectErr: true, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: bool + default: 123 +pipeline: +`, + }, + { + name: "enum_parameter_type", + expectErr: false, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: ["one", "two"] +pipeline: +`, + }, + { + name: "enum_parameter_type_alternate", + expectErr: false, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: + - one + - two +pipeline: +`, + }, + { + name: "enum_parameter_type_default", + expectErr: false, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: + - one + - two + default: one +pipeline: +`, + }, + { + name: "enum_parameter_type_default_invalid", + expectErr: true, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: + - one + - two + default: three +pipeline: +`, + }, + { + name: "default_invalid_type", + expectErr: true, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: int + default: {} pipeline: `, }, From 93ff91c1bd50b927ef7f2586f513e3b9c62eb059 Mon Sep 17 00:00:00 2001 From: Dan Jaglowski Date: Mon, 27 Jul 2020 16:00:08 -0400 Subject: [PATCH 2/4] If a parameter is required, do not allow it to have a default value --- operator/plugin_parameter.go | 9 ++++++++- operator/plugin_test.go | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/operator/plugin_parameter.go b/operator/plugin_parameter.go index 19a6a3d93..08718279c 100644 --- a/operator/plugin_parameter.go +++ b/operator/plugin_parameter.go @@ -12,10 +12,17 @@ type PluginParameter struct { Description string Required bool Type interface{} // "string", "int", "bool" or array of strings - Default interface{} // Must fit Type + Default interface{} // Must be valid according to Type } func (param PluginParameter) validate() error { + if param.Required && param.Default != nil { + return errors.NewError( + "required parameter cannot have a default value", + "ensure that required parameters do not have default values", + ) + } + switch t := param.Type.(type) { case string: switch t { diff --git a/operator/plugin_test.go b/operator/plugin_test.go index 9653ce457..6b512d1d2 100644 --- a/operator/plugin_test.go +++ b/operator/plugin_test.go @@ -514,6 +514,22 @@ parameters: type: int default: {} pipeline: +`, + }, + { + name: "required_default", + expectErr: true, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + required: true + type: int + default: 123 +pipeline: `, }, } From 243590676cd813a7023423685b47f2400e0eb9cb Mon Sep 17 00:00:00 2001 From: Dan Jaglowski Date: Mon, 27 Jul 2020 17:30:12 -0400 Subject: [PATCH 3/4] Support enumerated parameter type explicitly, and specify valid values via another field. Also support list of strings as a parameter type --- operator/plugin_parameter.go | 160 +++++++++++++++++++++-------------- operator/plugin_test.go | 109 ++++++++++++++++++++---- 2 files changed, 189 insertions(+), 80 deletions(-) diff --git a/operator/plugin_parameter.go b/operator/plugin_parameter.go index 08718279c..4c7cec4bd 100644 --- a/operator/plugin_parameter.go +++ b/operator/plugin_parameter.go @@ -11,8 +11,9 @@ type PluginParameter struct { Label string Description string Required bool - Type interface{} // "string", "int", "bool" or array of strings - Default interface{} // Must be valid according to Type + Type string // "string", "int", "bool", "strings", or "enum" + ValidValues []string `yaml:"valid_values"` // only useable if Type == "enum" + Default interface{} // Must be valid according to Type & ValidValues } func (param PluginParameter) validate() error { @@ -23,95 +24,124 @@ func (param PluginParameter) validate() error { ) } - switch t := param.Type.(type) { - case string: - switch t { - case "string", "int", "bool": // ok - default: + if err := param.validateType(); err != nil { + return err + } + + if err := param.validateValidValues(); err != nil { + return err + } + + if err := param.validateDefault(); err != nil { + return err + } + + return nil +} + +func (param PluginParameter) validateType() error { + switch param.Type { + case "string", "int", "bool", "strings", "enum": // ok + default: + return errors.NewError( + "invalid type for parameter", + "ensure that the type is one of 'string', 'int', 'bool', 'strings', or 'enum'", + ) + } + return nil +} + +func (param PluginParameter) validateValidValues() error { + switch param.Type { + case "string", "int", "bool", "strings": + if len(param.ValidValues) > 0 { return errors.NewError( - "invalid type for parameter", - "ensure that the type is one of 'string', 'int', 'bool', or an array containing only strings", + fmt.Sprintf("valid_values is undefined for parameter of type '%s'", param.Type), + "remove 'valid_values' field or change type to 'enum'", ) } - - if param.Default == nil { - return nil + case "enum": + if len(param.ValidValues) == 0 { + return errors.NewError( + "parameter of type 'enum' must have 'valid_values' specified", + "specify an array that includes one or more valid values", + ) } + } + return nil +} - // Validate default corresponds to type +func (param PluginParameter) validateDefault() error { + if param.Default == nil { + return nil + } + + // Validate that Default corresponds to Type + switch param.Type { + case "string": + if _, ok := param.Default.(string); !ok { + return errors.NewError( + "default value for a parameter of type 'string' must be a string", + "ensure that the default value is a string", + ) + } + case "int": switch param.Default.(type) { - case string: - if param.Type != "string" { - return errors.NewError( - fmt.Sprintf("default value is a string but parameter type is %s", param.Type), - "ensure that the default value is a string", - ) - } - case int, int32, int64: - if param.Type != "int" { - return errors.NewError( - fmt.Sprintf("default value is an int but parameter type is %s", param.Type), - "ensure that the default value is an int", - ) - } - case bool: - if param.Type != "bool" { - return errors.NewError( - fmt.Sprintf("default value is a bool but parameter type is %s", param.Type), - "ensure that the default value is a bool", - ) - } + case int, int32, int64: // ok default: return errors.NewError( - "invalid default value", - "ensure that the default value corresponds to parameter type", + "default value for a parameter of type 'int' must be an integer", + "ensure that the default value is an integer", ) } - - return nil - case []interface{}: // array represents enumerated values - for _, e := range t { - if _, ok := e.(string); !ok { - return errors.NewError( - "invalid value for enumerated parameter", - "ensure that all enumerated values are strings", - ) - } - } - - if param.Default == nil { - return nil + case "bool": + if _, ok := param.Default.(bool); !ok { + return errors.NewError( + "default value for a parameter of type 'bool' must be a boolean", + "ensure that the default value is a boolean", + ) } - - // Validate that the default value is included in the enumeration - def, ok := param.Default.(string) + case "strings": + defaultList, ok := param.Default.([]interface{}) if !ok { return errors.NewError( - "invalid default for enumerated parameter", + "default value for a parameter of type 'strings' must be an array of strings", "ensure that the default value is a string", ) } - - validDef := false - for _, e := range t { - if str, ok := e.(string); ok && str == def { - validDef = true + for _, s := range defaultList { + if _, ok := s.(string); !ok { + return errors.NewError( + "default value for a parameter of type 'strings' must be an array of strings", + "ensure that the default value is an array of strings", + ) } } - - if !validDef { + case "enum": + if param.Default != nil { + // Validate that the default value is included in the enumeration + def, ok := param.Default.(string) + if !ok { + return errors.NewError( + "invalid default for enumerated parameter", + "ensure that the default value is a string", + ) + } + for _, val := range param.ValidValues { + if val == def { + return nil + } + } return errors.NewError( "invalid default value for enumerated parameter", "ensure default value is listed as a valid value", ) } - - return nil - default: return errors.NewError( "invalid type for parameter", - "supported types are 'string', 'int', 'bool', and array of strings", + "ensure that the type is one of 'string', 'int', 'bool', 'strings', or 'enum'", ) } + return nil } diff --git a/operator/plugin_test.go b/operator/plugin_test.go index 6b512d1d2..2fd4c1c16 100644 --- a/operator/plugin_test.go +++ b/operator/plugin_test.go @@ -204,7 +204,7 @@ pipeline: `, }, { - name: "bad_parameters_type", + name: "bad_parameters", expectErr: true, template: `version: 0.0.0 title: My Super Plugin @@ -252,7 +252,7 @@ pipeline: `, }, { - name: "bad_parameter_type", + name: "bad_parameter", expectErr: true, template: `version: 0.0.0 title: My Super Plugin @@ -277,7 +277,7 @@ pipeline: `, }, { - name: "unknown_parameter_type", + name: "unknown_parameter", expectErr: true, template: `version: 0.0.0 title: My Super Plugin @@ -291,7 +291,7 @@ pipeline: `, }, { - name: "string_parameter_type", + name: "string_parameter", expectErr: false, template: `version: 0.0.0 title: My Super Plugin @@ -335,7 +335,53 @@ pipeline: `, }, { - name: "int_parameter_type", + name: "strings_parameter", + expectErr: false, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: strings +pipeline: +`, + }, + { + name: "strings_parameter_default", + expectErr: false, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: strings + default: + - hello +pipeline: +`, + }, + { + name: "strings_parameter_default_invalid", + expectErr: true, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: strings + default: hello +pipeline: +`, + }, + + { + name: "int_parameter", expectErr: false, template: `version: 0.0.0 title: My Super Plugin @@ -379,7 +425,7 @@ pipeline: `, }, { - name: "bool_parameter_type", + name: "bool_parameter", expectErr: false, template: `version: 0.0.0 title: My Super Plugin @@ -438,7 +484,7 @@ pipeline: `, }, { - name: "enum_parameter_type", + name: "enum_parameter", expectErr: false, template: `version: 0.0.0 title: My Super Plugin @@ -447,12 +493,13 @@ parameters: path: label: Parameter description: The thing of the thing - type: ["one", "two"] + type: enum + valid_values: ["one", "two"] pipeline: `, }, { - name: "enum_parameter_type_alternate", + name: "enum_parameter_alternate", expectErr: false, template: `version: 0.0.0 title: My Super Plugin @@ -461,14 +508,15 @@ parameters: path: label: Parameter description: The thing of the thing - type: + type: enum + valid_values: - one - two pipeline: `, }, { - name: "enum_parameter_type_default", + name: "enum_parameter_default", expectErr: false, template: `version: 0.0.0 title: My Super Plugin @@ -477,7 +525,8 @@ parameters: path: label: Parameter description: The thing of the thing - type: + type: enum + valid_values: - one - two default: one @@ -485,7 +534,7 @@ pipeline: `, }, { - name: "enum_parameter_type_default_invalid", + name: "enum_parameter_default_invalid", expectErr: true, template: `version: 0.0.0 title: My Super Plugin @@ -494,7 +543,8 @@ parameters: path: label: Parameter description: The thing of the thing - type: + type: enum + valid_values: - one - two default: three @@ -502,7 +552,21 @@ pipeline: `, }, { - name: "default_invalid_type", + name: "enum_parameter_no_valid_values", + expectErr: true, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: enum +pipeline: +`, + }, + { + name: "default_invalid", expectErr: true, template: `version: 0.0.0 title: My Super Plugin @@ -530,6 +594,21 @@ parameters: type: int default: 123 pipeline: +`, + }, + { + name: "non_enum_valid_values", + expectErr: true, + template: `version: 0.0.0 +title: My Super Plugin +description: This is the best plugin ever +parameters: + path: + label: Parameter + description: The thing of the thing + type: int + valid_values: [1, 2, 3] +pipeline: `, }, } From 754d8cc71616f09c2aaa79715d45eb0eccc17956 Mon Sep 17 00:00:00 2001 From: Dan Jaglowski Date: Tue, 28 Jul 2020 11:39:20 -0400 Subject: [PATCH 4/4] Updated error message and test strings for plugin parameters --- operator/plugin.go | 4 +- operator/plugin_test.go | 124 ++++++++++++++++++++-------------------- 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/operator/plugin.go b/operator/plugin.go index 5d0a323f1..4441e7efe 100644 --- a/operator/plugin.go +++ b/operator/plugin.go @@ -59,8 +59,8 @@ func (r PluginRegistry) Render(pluginType string, params map[string]interface{}) for name, param := range config.Parameters { if err := param.validate(); err != nil { return PluginConfig{}, errors.NewError( - "invalid parameter description found in plugin config", - "ensure that all parameter descriptioins are valid for the plugin", + "invalid parameter found in plugin config", + "ensure that all parameters are valid for the plugin", "plugin_type", pluginType, "plugin_parameter", name, "rendered_config", writer.String(), diff --git a/operator/plugin_test.go b/operator/plugin_test.go index 2fd4c1c16..a0b39bea2 100644 --- a/operator/plugin_test.go +++ b/operator/plugin_test.go @@ -135,8 +135,8 @@ func TestPluginMetadata(t *testing.T) { name: "full_meta", expectErr: false, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Path @@ -153,8 +153,8 @@ pipeline: name: "bad_version", expectErr: true, template: `version: [] -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Path @@ -172,7 +172,7 @@ pipeline: expectErr: true, template: `version: 0.0.0 title: [] -description: This is the best plugin ever +description: This is a test plugin parameters: path: label: Path @@ -189,7 +189,7 @@ pipeline: name: "bad_description", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin +title: Test Plugin description: [] parameters: path: @@ -207,8 +207,8 @@ pipeline: name: "bad_parameters", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: hello `, }, @@ -216,8 +216,8 @@ parameters: hello name: "bad_parameter_structure", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: this used to be supported pipeline: @@ -227,8 +227,8 @@ pipeline: name: "bad_parameter_label", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: [] @@ -241,8 +241,8 @@ pipeline: name: "bad_parameter_description", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Path @@ -255,8 +255,8 @@ pipeline: name: "bad_parameter", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Path @@ -269,8 +269,8 @@ pipeline: name: "empty_parameter", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: pipeline: @@ -280,8 +280,8 @@ pipeline: name: "unknown_parameter", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -294,8 +294,8 @@ pipeline: name: "string_parameter", expectErr: false, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -308,8 +308,8 @@ pipeline: name: "string_parameter_default", expectErr: false, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -323,8 +323,8 @@ pipeline: name: "string_parameter_default_invalid", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -338,8 +338,8 @@ pipeline: name: "strings_parameter", expectErr: false, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -352,8 +352,8 @@ pipeline: name: "strings_parameter_default", expectErr: false, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -368,8 +368,8 @@ pipeline: name: "strings_parameter_default_invalid", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -384,8 +384,8 @@ pipeline: name: "int_parameter", expectErr: false, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -398,8 +398,8 @@ pipeline: name: "int_parameter_default", expectErr: false, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -413,8 +413,8 @@ pipeline: name: "int_parameter_default_invalid", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -428,8 +428,8 @@ pipeline: name: "bool_parameter", expectErr: false, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -442,8 +442,8 @@ pipeline: name: "bool_parameter_default_true", expectErr: false, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -457,8 +457,8 @@ pipeline: name: "bool_parameter_default_false", expectErr: false, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -472,8 +472,8 @@ pipeline: name: "bool_parameter_default_invalid", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -487,8 +487,8 @@ pipeline: name: "enum_parameter", expectErr: false, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -502,8 +502,8 @@ pipeline: name: "enum_parameter_alternate", expectErr: false, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -519,8 +519,8 @@ pipeline: name: "enum_parameter_default", expectErr: false, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -537,8 +537,8 @@ pipeline: name: "enum_parameter_default_invalid", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -555,8 +555,8 @@ pipeline: name: "enum_parameter_no_valid_values", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -569,8 +569,8 @@ pipeline: name: "default_invalid", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -584,8 +584,8 @@ pipeline: name: "required_default", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter @@ -600,8 +600,8 @@ pipeline: name: "non_enum_valid_values", expectErr: true, template: `version: 0.0.0 -title: My Super Plugin -description: This is the best plugin ever +title: Test Plugin +description: This is a test plugin parameters: path: label: Parameter