mirror of https://github.com/crossplane/docs.git
Merge 001a0c46ae into 469b94324a
This commit is contained in:
commit
f8b1c549e9
|
|
@ -1091,4 +1091,167 @@ crossplane beta validate schema resources.yaml
|
||||||
Total 5 resources: 0 missing schemas, 4 success cases, 1 failure cases
|
Total 5 resources: 0 missing schemas, 4 success cases, 1 failure cases
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### beta lint
|
||||||
|
|
||||||
|
The `crossplane beta lint` command checks [composite resource definitions]({{<ref "../concepts/composite-resource-definitions">}})
|
||||||
|
against a set of best practices. These rules help ensure that your XRDs are well-formed and follow Crossplane's API design guidelines.
|
||||||
|
|
||||||
|
{{< hint "note" >}}
|
||||||
|
The `crossplane beta lint` command performs all checks offline.
|
||||||
|
|
||||||
|
A Kubernetes cluster running Crossplane isn't required.
|
||||||
|
{{< /hint >}}
|
||||||
|
|
||||||
|
#### Flags
|
||||||
|
|
||||||
|
{{< table "table table-sm table-striped" >}}
|
||||||
|
| Short flag | Long flag | Description |
|
||||||
|
| ------------ | ------------------ | ------------------------------------------------------------------------ |
|
||||||
|
| `-h` | `--help` | Show context sensitive help. |
|
||||||
|
| `-o` | `--output` | Output format. Valid values are stdout (default) or json. |
|
||||||
|
| | `--skip-reference` | Skip printing the reference docs to the rule that was violated. |
|
||||||
|
{{< /table >}}
|
||||||
|
|
||||||
|
#### Rules
|
||||||
|
|
||||||
|
##### XRD001 - No boolean fields
|
||||||
|
|
||||||
|
Boolean fields are inflexible and cannot be extended. Replace them with enum-based strings so you can introduce additional states later.
|
||||||
|
See [Kubernetes API conventions](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#primitive-types)
|
||||||
|
|
||||||
|
```yaml {label="Incorrect:"}
|
||||||
|
# Removed for brevity
|
||||||
|
properties:
|
||||||
|
spec:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
enabled:
|
||||||
|
type: boolean # flagged by XRD001
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml {label="Best practice:"}
|
||||||
|
# Removed for brevity
|
||||||
|
properties:
|
||||||
|
enabled:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- Enabled
|
||||||
|
- Disabled
|
||||||
|
```
|
||||||
|
|
||||||
|
##### XRD002 - Check for required fields
|
||||||
|
|
||||||
|
Marking fields as required up front forces every user to provide them and makes future changes risky - this rule flags any `required:`
|
||||||
|
list in your XRD so you can decide if each field truly needs to be mandatory.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Removed for brevity
|
||||||
|
properties:
|
||||||
|
spec:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
version:
|
||||||
|
type: string
|
||||||
|
required: # flagged by XRD002
|
||||||
|
- version
|
||||||
|
```
|
||||||
|
|
||||||
|
##### XRD003 - Check for missing descriptions
|
||||||
|
|
||||||
|
Every property in your schema should include a description: so that `kubectl explain` and documentation generators can produce helpful output.
|
||||||
|
|
||||||
|
```yaml {label="Incorrect:"}
|
||||||
|
# Removed for brevity
|
||||||
|
versions:
|
||||||
|
- name: v1alpha1
|
||||||
|
schema:
|
||||||
|
openAPIV3Schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
spec:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
version: # flagged by XRD003
|
||||||
|
type: string
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml {label="Best practice:"}
|
||||||
|
# Removed for brevity
|
||||||
|
properties:
|
||||||
|
spec:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
version:
|
||||||
|
type: string
|
||||||
|
description: |
|
||||||
|
The version of the database engine to deploy.
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Ignore rules
|
||||||
|
|
||||||
|
If you need to opt out of a specific check for example, a field that you know is safe even though it violates a rule
|
||||||
|
you can append a `# nolint <RULE_ID>` comment directly above the violating node or line:
|
||||||
|
|
||||||
|
```yaml {label="Missing description"}
|
||||||
|
# Removed for brevity
|
||||||
|
properties:
|
||||||
|
spec:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
# nolint XRD003
|
||||||
|
version:
|
||||||
|
type: string
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml {label="Boolean field"}
|
||||||
|
# Removed for brevity
|
||||||
|
properties:
|
||||||
|
spec:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
version:
|
||||||
|
# nolint XRD001
|
||||||
|
type: boolean
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Example usage
|
||||||
|
|
||||||
|
Running the command on an XRD file:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
crossplane beta lint my-xrd.yaml
|
||||||
|
xdatabases.custom-api.example.org:20 [XRD001] Boolean field detected at path spec.versions[0].schema.openAPIV3Schema.properties.spec.properties.enabled — consider using an enum instead for extensibility. More information: (https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#primitive-types)
|
||||||
|
xdatabases.custom-api.example.org:25 [XRD002] Required field 'enabled' at path spec.versions[0].schema.openAPIV3Schema.properties.spec.required — consider making it optional with a default.
|
||||||
|
Found 2 issues: 0 errors, 2 warnings
|
||||||
|
exit status 2
|
||||||
|
```
|
||||||
|
|
||||||
|
This outputs any violations of the best practices, along with references to the relevant guidelines for fixing them.
|
||||||
|
|
||||||
|
To integrate in CI or tooling, output as JSON (--output=json):
|
||||||
|
|
||||||
|
```shell
|
||||||
|
crossplane beta lint my-xrd.yaml --output=json
|
||||||
|
{
|
||||||
|
"summary": {
|
||||||
|
"valid": false,
|
||||||
|
"total": 3,
|
||||||
|
"errors": 0,
|
||||||
|
"warnings": 3
|
||||||
|
},
|
||||||
|
"issues": [
|
||||||
|
{
|
||||||
|
"id": "XRD001",
|
||||||
|
"name": "xdatabases.custom-api.example.org",
|
||||||
|
"line": 20,
|
||||||
|
"error": false,
|
||||||
|
"reference": "https://github.com/kubernetes/community/blob/master/contributors/devel/sig-archi
|
||||||
|
tecture/api-conventions.md#primitive-types",
|
||||||
|
"message": "Boolean field detected at path spec.versions[0].schema.openAPIV3Schema.properties.
|
||||||
|
spec.properties.enabled — consider using an enum instead for extensibility."
|
||||||
|
},
|
||||||
|
...
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue