Resource and Canonical Properties use of null
Prerequisites
- [x] Write a descriptive title.
- [x] Make sure you are able to repro it on the latest version
- [x] Search the existing issues.
Summary
There are built-in resources and canonical properties (_inDesiredState) that use null in addition to actual type of the property. Null should NOT be a valid type unless the property actually accepts null as a valid use case. By allowing null it can confuse users when we have auto-complete in BICEP and weakens the strongly validated schema.
JSON schema null and undefined properties are different.
https://json-schema.org/understanding-json-schema/reference/null
Excerpt:
It's important to remember that in JSON, null isn't equivalent to something being absent. See Required Properties for an example.
The mechanism to indicate a property is required or optional is by the use of the required property.
I understand that we're using nullable types so we can return only the properties that are actually defined instead of empty strings or false bools but it is not best practice.
Resources with Nullable Properties:
-
Microsoft.DSC.Debug/Echo showSecrets:
type: ["boolean", "null"] -
Microsoft.DSC.Transitional/PowerShellScript getScript:
type: ["string", "null"]setScript:type: ["string", "null"]testScript:type: ["string", "null"]input:type: ["string", "boolean", "integer", "object", "array", "null"]output:type: ["array", "null"]_inDesiredState:type: ["boolean", "null"] -
Microsoft.DSC.Transitional/WindowsPowerShellScript getScript:
type: ["string", "null"]setScript:type: ["string", "null"]testScript:type: ["string", "null"]input:type: ["string", "boolean", "integer", "object", "array", "null"]output:type: ["array", "null"]_inDesiredState:type: ["boolean", "null"] -
Microsoft.OpenSSH.SSHD/Windows shell:
type: ["string", "null"]cmdOption:type: ["string", "null"]escapeArguments:type: ["boolean", "null"] -
Microsoft.Windows/RebootPending reasons:
type: ["array", "null"]The entire object itself:type: ["object", "null"] -
Microsoft.Windows/Registry _metadata:
anyOf: [{"$ref": "#/$defs/Metadata"}, {"type": "null"}]valueName:type: ["string", "null"]valueData:anyOf: [{"$ref": "#/$defs/RegistryValueData"}, {"type": "null"}]_exist:type: ["boolean", "null"]
This is related to #538 - part of the canonicalization process is to remove these incorrect type definitions, which are auto-generated by schemars when a struct property is an Option type.