Skip to content

Commit

Permalink
Added support for raw booleans when using complex_conditional (#3109)
Browse files Browse the repository at this point in the history
Co-authored-by: Ajinkya Udgirkar <audgirka@redhat.com>
  • Loading branch information
audgirka and audgirka authored Mar 1, 2023
1 parent c5042f1 commit 1c5148c
Show file tree
Hide file tree
Showing 6 changed files with 332 additions and 3 deletions.
9 changes: 8 additions & 1 deletion src/ansiblelint/schemas/ansible.json
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,14 @@
},
{
"items": {
"type": "string"
"anyOf": [
{
"type": "boolean"
},
{
"type": "string"
}
]
},
"type": "array"
}
Expand Down
9 changes: 8 additions & 1 deletion src/ansiblelint/schemas/playbook.json
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,14 @@
},
{
"items": {
"type": "string"
"anyOf": [
{
"type": "boolean"
},
{
"type": "string"
}
]
},
"type": "array"
}
Expand Down
9 changes: 8 additions & 1 deletion src/ansiblelint/schemas/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,14 @@
},
{
"items": {
"type": "string"
"anyOf": [
{
"type": "boolean"
},
{
"type": "string"
}
]
},
"type": "array"
}
Expand Down
11 changes: 11 additions & 0 deletions test/schemas/negative_test/playbooks/when.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
- name: Test for when (failure)
hosts: localhost
gather_facts: false
tasks:
- name: Testing for when is passed a list
ansible.builtin.debug:
msg: "this is ok"
when:
- true
- 123
286 changes: 286 additions & 0 deletions test/schemas/negative_test/playbooks/when.yml.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,286 @@
# ajv errors

```json
[
{
"instancePath": "/0",
"keyword": "required",
"message": "must have required property 'ansible.builtin.import_playbook'",
"params": {
"missingProperty": "ansible.builtin.import_playbook"
},
"schemaPath": "#/oneOf/0/required"
},
{
"instancePath": "/0",
"keyword": "required",
"message": "must have required property 'import_playbook'",
"params": {
"missingProperty": "import_playbook"
},
"schemaPath": "#/oneOf/1/required"
},
{
"instancePath": "/0",
"keyword": "oneOf",
"message": "must match exactly one schema in oneOf",
"params": {
"passingSchemas": null
},
"schemaPath": "#/oneOf"
},
{
"instancePath": "/0",
"keyword": "additionalProperties",
"message": "must NOT have additional properties",
"params": {
"additionalProperty": "hosts"
},
"schemaPath": "#/additionalProperties"
},
{
"instancePath": "/0",
"keyword": "additionalProperties",
"message": "must NOT have additional properties",
"params": {
"additionalProperty": "gather_facts"
},
"schemaPath": "#/additionalProperties"
},
{
"instancePath": "/0",
"keyword": "additionalProperties",
"message": "must NOT have additional properties",
"params": {
"additionalProperty": "tasks"
},
"schemaPath": "#/additionalProperties"
},
{
"instancePath": "/0/tasks/0",
"keyword": "required",
"message": "must have required property 'block'",
"params": {
"missingProperty": "block"
},
"schemaPath": "#/required"
},
{
"instancePath": "/0/tasks/0/when",
"keyword": "type",
"message": "must be boolean",
"params": {
"type": "boolean"
},
"schemaPath": "#/$defs/complex_conditional/oneOf/0/type"
},
{
"instancePath": "/0/tasks/0/when",
"keyword": "type",
"message": "must be string",
"params": {
"type": "string"
},
"schemaPath": "#/$defs/complex_conditional/oneOf/1/type"
},
{
"instancePath": "/0/tasks/0/when/1",
"keyword": "type",
"message": "must be boolean",
"params": {
"type": "boolean"
},
"schemaPath": "#/$defs/complex_conditional/oneOf/2/items/anyOf/0/type"
},
{
"instancePath": "/0/tasks/0/when/1",
"keyword": "type",
"message": "must be string",
"params": {
"type": "string"
},
"schemaPath": "#/$defs/complex_conditional/oneOf/2/items/anyOf/1/type"
},
{
"instancePath": "/0/tasks/0/when/1",
"keyword": "anyOf",
"message": "must match a schema in anyOf",
"params": {},
"schemaPath": "#/$defs/complex_conditional/oneOf/2/items/anyOf"
},
{
"instancePath": "/0/tasks/0/when",
"keyword": "oneOf",
"message": "must match exactly one schema in oneOf",
"params": {
"passingSchemas": null
},
"schemaPath": "#/$defs/complex_conditional/oneOf"
},
{
"instancePath": "/0/tasks/0/when",
"keyword": "type",
"message": "must be boolean",
"params": {
"type": "boolean"
},
"schemaPath": "#/$defs/complex_conditional/oneOf/0/type"
},
{
"instancePath": "/0/tasks/0/when",
"keyword": "type",
"message": "must be string",
"params": {
"type": "string"
},
"schemaPath": "#/$defs/complex_conditional/oneOf/1/type"
},
{
"instancePath": "/0/tasks/0/when/1",
"keyword": "type",
"message": "must be boolean",
"params": {
"type": "boolean"
},
"schemaPath": "#/$defs/complex_conditional/oneOf/2/items/anyOf/0/type"
},
{
"instancePath": "/0/tasks/0/when/1",
"keyword": "type",
"message": "must be string",
"params": {
"type": "string"
},
"schemaPath": "#/$defs/complex_conditional/oneOf/2/items/anyOf/1/type"
},
{
"instancePath": "/0/tasks/0/when/1",
"keyword": "anyOf",
"message": "must match a schema in anyOf",
"params": {},
"schemaPath": "#/$defs/complex_conditional/oneOf/2/items/anyOf"
},
{
"instancePath": "/0/tasks/0/when",
"keyword": "oneOf",
"message": "must match exactly one schema in oneOf",
"params": {
"passingSchemas": null
},
"schemaPath": "#/$defs/complex_conditional/oneOf"
},
{
"instancePath": "/0/tasks/0",
"keyword": "anyOf",
"message": "must match a schema in anyOf",
"params": {},
"schemaPath": "#/items/anyOf"
},
{
"instancePath": "/0",
"keyword": "oneOf",
"message": "must match exactly one schema in oneOf",
"params": {
"passingSchemas": null
},
"schemaPath": "#/items/oneOf"
}
]
```

# check-jsonschema

stdout:

```json
{
"status": "fail",
"errors": [
{
"filename": "negative_test/playbooks/when.yml",
"path": "$[0]",
"message": "{'name': 'Test for when (failure)', 'hosts': 'localhost', 'gather_facts': False, 'tasks': [{'name': 'Testing for when is passed a list', 'ansible.builtin.debug': {'msg': 'this is ok'}, 'when': [True, 123]}]} is not valid under any of the given schemas",
"has_sub_errors": true,
"best_match": {
"path": "$[0]",
"message": "'gather_facts', 'hosts', 'tasks' do not match any of the regexes: '^(ansible\\\\.builtin\\\\.)?import_playbook$', 'name', 'tags', 'vars', 'when'"
},
"sub_errors": [
{
"path": "$[0]",
"message": "'gather_facts', 'hosts', 'tasks' do not match any of the regexes: '^(ansible\\\\.builtin\\\\.)?import_playbook$', 'name', 'tags', 'vars', 'when'"
},
{
"path": "$[0]",
"message": "{'name': 'Test for when (failure)', 'hosts': 'localhost', 'gather_facts': False, 'tasks': [{'name': 'Testing for when is passed a list', 'ansible.builtin.debug': {'msg': 'this is ok'}, 'when': [True, 123]}]} is not valid under any of the given schemas"
},
{
"path": "$[0]",
"message": "'ansible.builtin.import_playbook' is a required property"
},
{
"path": "$[0]",
"message": "'import_playbook' is a required property"
},
{
"path": "$[0].tasks[0]",
"message": "{'name': 'Testing for when is passed a list', 'ansible.builtin.debug': {'msg': 'this is ok'}, 'when': [True, 123]} is not valid under any of the given schemas"
},
{
"path": "$[0].tasks[0].when",
"message": "[True, 123] is not valid under any of the given schemas"
},
{
"path": "$[0].tasks[0].when",
"message": "[True, 123] is not of type 'boolean'"
},
{
"path": "$[0].tasks[0].when",
"message": "[True, 123] is not of type 'string'"
},
{
"path": "$[0].tasks[0].when[1]",
"message": "123 is not valid under any of the given schemas"
},
{
"path": "$[0].tasks[0].when[1]",
"message": "123 is not of type 'boolean'"
},
{
"path": "$[0].tasks[0].when[1]",
"message": "123 is not of type 'string'"
},
{
"path": "$[0].tasks[0]",
"message": "'block' is a required property"
},
{
"path": "$[0].tasks[0].when",
"message": "[True, 123] is not valid under any of the given schemas"
},
{
"path": "$[0].tasks[0].when",
"message": "[True, 123] is not of type 'boolean'"
},
{
"path": "$[0].tasks[0].when",
"message": "[True, 123] is not of type 'string'"
},
{
"path": "$[0].tasks[0].when[1]",
"message": "123 is not valid under any of the given schemas"
},
{
"path": "$[0].tasks[0].when[1]",
"message": "123 is not of type 'boolean'"
},
{
"path": "$[0].tasks[0].when[1]",
"message": "123 is not of type 'string'"
}
]
}
],
"parse_errors": []
}
```
11 changes: 11 additions & 0 deletions test/schemas/test/playbooks/when.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
- name: Test for when (passing)
hosts: localhost
gather_facts: false
tasks:
- name: Testing for when is passed a list
ansible.builtin.debug:
msg: "this is ok"
when:
- true
- "foo"

0 comments on commit 1c5148c

Please sign in to comment.