mirror of https://github.com/helm/helm
Feat/schema validation (#5350)
* Add the Schema type and a function to read it * Added a function to read a schema from a file * Check that values.yaml matches schema This commit uses the gojsonschema package to validate a values.yaml file against a corresponding values.schema.yaml file. * Add functionality to generate a schema from a values.yaml * Add Schema to Chart and loader * Clean up implementation in chartutil * Add tests for helm install with schema * Add schema validation to helm lint * Clean up "matchSchema" * Modify error output * Add documentation * Fix a linter issue * Fix a test that broke during a rebase * Clean up documentation * Specify JSONSchema spec Since JSONSchema is still in a draft state as of this commit, we need to specify a particular version of the JSONSchema spec * Switch to using builtin functionality for file extensions * Switch to using a third-party library for JSON conversion * Use the constants from the gojsonschema package * Updates to unit tests * Minor change to avoid string cast * Remove JSON Schema generation * Change Schema type from map[string]interface{} to []byte * Convert all Schema YAML to JSON * Fix some tests that were broken by a rebase * Fix up YAML/JSON conversions * This checks subcharts for schema validation The final coalesced values for a given chart will be validated against that chart's schema, as well as any dependent subchart's schema * Add unit tests for ValidateAgainstSchema * Remove nonessential test files * Remove a misleading unit test The TestReadSchema unit test was simply testing the ReadValues function, which is already being validated in the TestReadValues unit test * Update documentation to reflect changes to subchart schemaspull/5649/head
parent
3dd1765491
commit
ffff0e8c33
@ -0,0 +1,4 @@
|
||||
Error: values don't meet the specifications of the schema(s) in the following chart(s):
|
||||
empty:
|
||||
- age: Must be greater than or equal to 0/1
|
||||
|
@ -0,0 +1,5 @@
|
||||
Error: values don't meet the specifications of the schema(s) in the following chart(s):
|
||||
empty:
|
||||
- (root): employmentInfo is required
|
||||
- age: Must be greater than or equal to 0/1
|
||||
|
@ -0,0 +1,5 @@
|
||||
NAME: schema
|
||||
LAST DEPLOYED: 1977-09-02 22:04:05 +0000 UTC
|
||||
NAMESPACE: default
|
||||
STATUS: deployed
|
||||
|
@ -0,0 +1,4 @@
|
||||
Error: values don't meet the specifications of the schema(s) in the following chart(s):
|
||||
subchart-with-schema:
|
||||
- age: Must be greater than or equal to 0/1
|
||||
|
@ -0,0 +1,5 @@
|
||||
NAME: schema
|
||||
LAST DEPLOYED: 1977-09-02 22:04:05 +0000 UTC
|
||||
NAMESPACE: default
|
||||
STATUS: deployed
|
||||
|
@ -0,0 +1,6 @@
|
||||
Error: values don't meet the specifications of the schema(s) in the following chart(s):
|
||||
chart-without-schema:
|
||||
- (root): lastname is required
|
||||
subchart-with-schema:
|
||||
- (root): age is required
|
||||
|
@ -0,0 +1,6 @@
|
||||
apiVersion: v1
|
||||
name: chart-without-schema
|
||||
description: A Helm chart for Kubernetes
|
||||
type: application
|
||||
version: 0.1.0
|
||||
appVersion: 0.1.0
|
@ -0,0 +1,6 @@
|
||||
apiVersion: v1
|
||||
name: subchart-with-schema
|
||||
description: A Helm chart for Kubernetes
|
||||
type: application
|
||||
version: 0.1.0
|
||||
appVersion: 0.1.0
|
@ -0,0 +1 @@
|
||||
# This file is intentionally blank
|
@ -0,0 +1,15 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "Values",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"age": {
|
||||
"description": "Age",
|
||||
"minimum": 0,
|
||||
"type": "integer"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"age"
|
||||
]
|
||||
}
|
@ -0,0 +1 @@
|
||||
# This file is intentionally blank
|
@ -0,0 +1,18 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "Values",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"firstname": {
|
||||
"description": "First name",
|
||||
"type": "string"
|
||||
},
|
||||
"lastname": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"firstname",
|
||||
"lastname"
|
||||
]
|
||||
}
|
@ -0,0 +1 @@
|
||||
firstname: "John"
|
@ -0,0 +1,7 @@
|
||||
apiVersion: v1
|
||||
description: Empty testing chart
|
||||
home: https://k8s.io/helm
|
||||
name: empty
|
||||
sources:
|
||||
- https://github.com/kubernetes/helm
|
||||
version: 0.1.0
|
@ -0,0 +1 @@
|
||||
# This file is intentionally blank
|
@ -0,0 +1,67 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"properties": {
|
||||
"addresses": {
|
||||
"description": "List of addresses",
|
||||
"items": {
|
||||
"properties": {
|
||||
"city": {
|
||||
"type": "string"
|
||||
},
|
||||
"number": {
|
||||
"type": "number"
|
||||
},
|
||||
"street": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"type": "object"
|
||||
},
|
||||
"type": "array"
|
||||
},
|
||||
"age": {
|
||||
"description": "Age",
|
||||
"minimum": 0,
|
||||
"type": "integer"
|
||||
},
|
||||
"employmentInfo": {
|
||||
"properties": {
|
||||
"salary": {
|
||||
"minimum": 0,
|
||||
"type": "number"
|
||||
},
|
||||
"title": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"salary"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"firstname": {
|
||||
"description": "First name",
|
||||
"type": "string"
|
||||
},
|
||||
"lastname": {
|
||||
"type": "string"
|
||||
},
|
||||
"likesCoffee": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"phoneNumbers": {
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"type": "array"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"firstname",
|
||||
"lastname",
|
||||
"addresses",
|
||||
"employmentInfo"
|
||||
],
|
||||
"title": "Values",
|
||||
"type": "object"
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
firstname: John
|
||||
lastname: Doe
|
||||
age: -5
|
||||
likesCoffee: true
|
||||
addresses:
|
||||
- city: Springfield
|
||||
street: Main
|
||||
number: 12345
|
||||
- city: New York
|
||||
street: Broadway
|
||||
number: 67890
|
||||
phoneNumbers:
|
||||
- "(888) 888-8888"
|
||||
- "(555) 555-5555"
|
@ -0,0 +1,7 @@
|
||||
apiVersion: v1
|
||||
description: Empty testing chart
|
||||
home: https://k8s.io/helm
|
||||
name: empty
|
||||
sources:
|
||||
- https://github.com/kubernetes/helm
|
||||
version: 0.1.0
|
@ -0,0 +1,2 @@
|
||||
age: -5
|
||||
employmentInfo: null
|
@ -0,0 +1 @@
|
||||
# This file is intentionally blank
|
@ -0,0 +1,67 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"properties": {
|
||||
"addresses": {
|
||||
"description": "List of addresses",
|
||||
"items": {
|
||||
"properties": {
|
||||
"city": {
|
||||
"type": "string"
|
||||
},
|
||||
"number": {
|
||||
"type": "number"
|
||||
},
|
||||
"street": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"type": "object"
|
||||
},
|
||||
"type": "array"
|
||||
},
|
||||
"age": {
|
||||
"description": "Age",
|
||||
"minimum": 0,
|
||||
"type": "integer"
|
||||
},
|
||||
"employmentInfo": {
|
||||
"properties": {
|
||||
"salary": {
|
||||
"minimum": 0,
|
||||
"type": "number"
|
||||
},
|
||||
"title": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"salary"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"firstname": {
|
||||
"description": "First name",
|
||||
"type": "string"
|
||||
},
|
||||
"lastname": {
|
||||
"type": "string"
|
||||
},
|
||||
"likesCoffee": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"phoneNumbers": {
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"type": "array"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"firstname",
|
||||
"lastname",
|
||||
"addresses",
|
||||
"employmentInfo"
|
||||
],
|
||||
"title": "Values",
|
||||
"type": "object"
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
firstname: John
|
||||
lastname: Doe
|
||||
age: 25
|
||||
likesCoffee: true
|
||||
employmentInfo:
|
||||
title: Software Developer
|
||||
salary: 100000
|
||||
addresses:
|
||||
- city: Springfield
|
||||
street: Main
|
||||
number: 12345
|
||||
- city: New York
|
||||
street: Broadway
|
||||
number: 67890
|
||||
phoneNumbers:
|
||||
- "(888) 888-8888"
|
||||
- "(555) 555-5555"
|
@ -0,0 +1,14 @@
|
||||
firstname: John
|
||||
lastname: Doe
|
||||
age: -5
|
||||
likesCoffee: true
|
||||
addresses:
|
||||
- city: Springfield
|
||||
street: Main
|
||||
number: 12345
|
||||
- city: New York
|
||||
street: Broadway
|
||||
number: 67890
|
||||
phoneNumbers:
|
||||
- "(888) 888-8888"
|
||||
- "(555) 555-5555"
|
@ -0,0 +1,67 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"properties": {
|
||||
"addresses": {
|
||||
"description": "List of addresses",
|
||||
"items": {
|
||||
"properties": {
|
||||
"city": {
|
||||
"type": "string"
|
||||
},
|
||||
"number": {
|
||||
"type": "number"
|
||||
},
|
||||
"street": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"type": "object"
|
||||
},
|
||||
"type": "array"
|
||||
},
|
||||
"age": {
|
||||
"description": "Age",
|
||||
"minimum": 0,
|
||||
"type": "integer"
|
||||
},
|
||||
"employmentInfo": {
|
||||
"properties": {
|
||||
"salary": {
|
||||
"minimum": 0,
|
||||
"type": "number"
|
||||
},
|
||||
"title": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"salary"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"firstname": {
|
||||
"description": "First name",
|
||||
"type": "string"
|
||||
},
|
||||
"lastname": {
|
||||
"type": "string"
|
||||
},
|
||||
"likesCoffee": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"phoneNumbers": {
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"type": "array"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"firstname",
|
||||
"lastname",
|
||||
"addresses",
|
||||
"employmentInfo"
|
||||
],
|
||||
"title": "Values",
|
||||
"type": "object"
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
firstname: John
|
||||
lastname: Doe
|
||||
age: 25
|
||||
likesCoffee: true
|
||||
employmentInfo:
|
||||
title: Software Developer
|
||||
salary: 100000
|
||||
addresses:
|
||||
- city: Springfield
|
||||
street: Main
|
||||
number: 12345
|
||||
- city: New York
|
||||
street: Broadway
|
||||
number: 67890
|
||||
phoneNumbers:
|
||||
- "(888) 888-8888"
|
||||
- "(555) 555-5555"
|
Loading…
Reference in new issue