diff --git a/config/validate.go b/config/validate.go index f7027137..42cb685b 100644 --- a/config/validate.go +++ b/config/validate.go @@ -6,23 +6,23 @@ import ( ) // TODO: use this function from libcompose -func convertKeysToStrings(item interface{}) interface{} { +func ConvertKeysToStrings(item interface{}) interface{} { switch typedDatas := item.(type) { case map[string]interface{}: for key, value := range typedDatas { - typedDatas[key] = convertKeysToStrings(value) + typedDatas[key] = ConvertKeysToStrings(value) } return typedDatas case map[interface{}]interface{}: newMap := make(map[string]interface{}) for key, value := range typedDatas { stringKey := key.(string) - newMap[stringKey] = convertKeysToStrings(value) + newMap[stringKey] = ConvertKeysToStrings(value) } return newMap case []interface{}: for i, value := range typedDatas { - typedDatas[i] = append(typedDatas, convertKeysToStrings(value)) + typedDatas[i] = ConvertKeysToStrings(value) } return typedDatas default: @@ -35,7 +35,7 @@ func Validate(bytes []byte) (*gojsonschema.Result, error) { if err := yaml.Unmarshal([]byte(bytes), &rawCfg); err != nil { return nil, err } - rawCfg = convertKeysToStrings(rawCfg).(map[string]interface{}) + rawCfg = ConvertKeysToStrings(rawCfg).(map[string]interface{}) loader := gojsonschema.NewGoLoader(rawCfg) schemaLoader := gojsonschema.NewStringLoader(schema) return gojsonschema.Validate(schemaLoader, loader) diff --git a/config/validate_test.go b/config/validate_test.go index 4cb8c935..ac82bde8 100644 --- a/config/validate_test.go +++ b/config/validate_test.go @@ -25,8 +25,19 @@ func testValidate(t *testing.T, cfg []byte, contains string) { func TestValidate(t *testing.T) { testValidate(t, []byte("{}"), "") testValidate(t, []byte(`rancher: - log: true -`), "") + log: true`), "") + testValidate(t, []byte(`write_files: +- container: console + path: /etc/rc.local + permissions: "0755" + owner: root + content: | + #!/bin/bash + wait-for-docker`), "") + testValidate(t, []byte(`rancher: + docker: + extra_args: ['--insecure-registry', 'my.registry.com']`), "") + testValidate(t, []byte("bad_key: {}"), "Additional property bad_key is not allowed") testValidate(t, []byte("rancher: []"), "rancher: Invalid type. Expected: object, given: array")