Add schema file for phosphor-regulators JSON.

Add the schema file for validate-regulators-config.py to validate
the config_file.json.

Signed-off-by: Bob King <Bob_King@wistron.com>
Change-Id: I7e97b41bdb171093f2e07c8ff0db247fffdc6841
diff --git a/phosphor-regulators/schema/config_schema.json b/phosphor-regulators/schema/config_schema.json
new file mode 100644
index 0000000..681c66f
--- /dev/null
+++ b/phosphor-regulators/schema/config_schema.json
@@ -0,0 +1,545 @@
+{
+    "$schema": "http://json-schema.org/schema#",
+    "title": "JSON schema for the phosphor-regulators config file",
+    "$id": "https://github.com/openbmc/phosphor-power/tree/master/phosphor-regulators/schema/config_schema.json",
+    "description": "This schema describes the JSON format for the phosphor-regulators configuration file.",
+    "type": "object",
+
+    "properties":
+    {
+        "comments":
+        {
+            "$ref": "#/definitions/comments"
+        },
+        "rules":
+        {
+            "$ref": "#/definitions/rules"
+        },
+        "chassis":
+        {
+            "$ref": "#/definitions/chassis"
+        }
+    },
+
+    "required": ["chassis"],
+    "additionalProperties": false,
+
+    "definitions":
+    {
+        "rules":
+        {
+            "type": "array",
+            "items":
+            {
+                "type": "object",
+                "properties":
+                {
+                    "comments": {"$ref": "#/definitions/comments" },
+
+                    "id": {"$ref": "#/definitions/id" },
+
+                    "actions": {"$ref": "#/definitions/actions" }
+                },
+
+                "required": ["id", "actions"],
+                "additionalProperties": false
+            },
+            "minItems": 1
+        },
+
+        "comments":
+        {
+            "type": "array",
+            "items":
+            {
+                "type": "string"
+            },
+
+            "minItems": 1
+        },
+
+        "id":
+        {
+            "type": "string",
+            "pattern": "^[A-Za-z0-9_]+$"
+        },
+
+        "action":
+        {
+            "type": "object",
+            "properties":
+            {
+                "comments": {"$ref": "#/definitions/comments" },
+
+                "and": {"$ref": "#/definitions/actions" },
+
+                "compare_presence": {"$ref": "#/definitions/compare_presence" },
+
+                "compare_vpd": {"$ref": "#/definitions/compare_vpd" },
+
+                "i2c_compare_bit": {"$ref": "#/definitions/i2c_bit" },
+
+                "i2c_compare_byte": {"$ref": "#/definitions/i2c_byte" },
+
+                "i2c_compare_bytes": {"$ref": "#/definitions/i2c_bytes" },
+
+                "i2c_write_bit": {"$ref": "#/definitions/i2c_bit" },
+
+                "i2c_write_byte": {"$ref": "#/definitions/i2c_byte" },
+
+                "i2c_write_bytes": {"$ref": "#/definitions/i2c_bytes" },
+
+                "if": {"$ref": "#/definitions/if" },
+
+                "not": {"$ref": "#/definitions/action" },
+
+                "or": {"$ref": "#/definitions/actions" },
+
+                "pmbus_read_sensor": {"$ref": "#/definitions/pmbus_read_sensor" },
+
+                "pmbus_write_vout_command": {"$ref": "#/definitions/pmbus_write_vout_command" },
+
+                "run_rule": {"$ref": "#/definitions/id" },
+
+                "set_device": {"$ref": "#/definitions/id" }
+            },
+            "additionalProperties": false,
+            "oneOf": [
+                {"required": ["and"]},
+                {"required": ["compare_presence"]},
+                {"required": ["compare_vpd"]},
+                {"required": ["i2c_compare_bit"]},
+                {"required": ["i2c_compare_byte"]},
+                {"required": ["i2c_compare_bytes"]},
+                {"required": ["i2c_write_bit"]},
+                {"required": ["i2c_write_byte"]},
+                {"required": ["i2c_write_bytes"]},
+                {"required": ["if"]},
+                {"required": ["not"]},
+                {"required": ["or"]},
+                {"required": ["pmbus_write_vout_command"]},
+                {"required": ["pmbus_read_sensor"]},
+                {"required": ["run_rule"]},
+                {"required": ["set_device"]}
+            ]
+        },
+
+        "actions":
+        {
+            "type": "array",
+            "items": {"$ref": "#/definitions/action" },
+            "minItems": 1
+        },
+
+        "compare_presence":
+        {
+            "type": "object",
+            "properties":
+            {
+                "fru": {"$ref": "#/definitions/fru" },
+
+                "value": {"$ref": "#/definitions/boolean_value" }
+            },
+            "required": ["fru", "value"],
+            "additionalProperties": false
+        },
+
+        "fru":
+        {
+            "type": "string",
+            "minLength": 1
+        },
+
+        "boolean_value":
+        {
+            "type": "boolean"
+        },
+
+        "compare_vpd":
+        {
+            "type": "object",
+            "properties":
+            {
+                "fru": {"$ref": "#/definitions/fru" },
+
+                "keyword": {"$ref": "#/definitions/keyword" },
+
+                "value": {"$ref": "#/definitions/string_value" }
+            },
+            "required": ["fru", "keyword", "value"],
+            "additionalProperties": false
+        },
+
+        "keyword":
+        {
+            "type": "string",
+            "enum": ["CCIN", "Manufacturer", "Model", "PartNumber"]
+        },
+
+        "string_value":
+        {
+            "type": "string"
+        },
+
+        "i2c_bit":
+        {
+            "type": "object",
+            "properties":
+            {
+                "register": {"$ref": "#/definitions/register" },
+
+                "position": {"$ref": "#/definitions/position" },
+
+                "value": {"$ref": "#/definitions/bit_value" }
+            },
+            "required": ["register", "position","value"],
+            "additionalProperties": false
+        },
+
+        "register":
+        {
+            "type": "string",
+            "pattern": "^0x[0-9A-Fa-f]{2}$"
+        },
+
+        "position":
+        {
+            "type": "integer",
+            "minimum": 0,
+            "maximum": 7
+        },
+
+        "bit_value":
+        {
+            "type": "integer",
+            "minimum": 0,
+            "maximum": 1
+        },
+
+        "i2c_byte":
+        {
+            "type": "object",
+            "properties":
+            {
+                "register": {"$ref": "#/definitions/register" },
+
+                "value": {"$ref": "#/definitions/byte_value" },
+
+                "mask": {"$ref": "#/definitions/byte_mask" }
+            },
+            "required": ["register", "value"],
+            "additionalProperties": false
+        },
+
+        "byte_value":
+        {
+            "type": "string",
+            "pattern": "^0x[0-9A-Fa-f]{2}$"
+        },
+
+        "byte_mask":
+        {
+            "type": "string",
+            "pattern": "^0x[0-9A-Fa-f]{2}$"
+        },
+
+        "i2c_bytes":
+        {
+            "type": "object",
+            "properties":
+            {
+                "register": {"$ref": "#/definitions/register" },
+
+                "values": {"$ref": "#/definitions/bytes_values" },
+
+                "masks": {"$ref": "#/definitions/bytes_masks" }
+            },
+            "required": ["register", "values"],
+            "additionalProperties": false
+        },
+
+        "bytes_values":
+        {
+            "type": "array",
+            "items": {"$ref": "#/definitions/byte_value" },
+            "minItems": 1
+        },
+
+        "bytes_masks":
+        {
+            "type": "array",
+            "items": {"$ref": "#/definitions/byte_mask" },
+            "minItems": 1
+        },
+
+        "if":
+        {
+            "type": "object",
+            "properties":
+            {
+                "condition": {"$ref": "#/definitions/action" },
+
+                "then": {"$ref": "#/definitions/actions" },
+
+                "else": {"$ref": "#/definitions/actions" }
+            },
+            "required": ["condition", "then"],
+            "additionalProperties": false
+        },
+
+        "pmbus_write_vout_command":
+        {
+            "type": "object",
+            "properties":
+            {
+                "volts": {"$ref": "#/definitions/volts" },
+
+                "format": {"$ref": "#/definitions/write_vout_format" },
+
+                "exponent": {"$ref": "#/definitions/exponent" },
+
+                "is_verified": {"$ref": "#/definitions/is_verified" }
+            },
+            "required": ["format"],
+            "additionalProperties": false
+        },
+
+        "volts":
+        {
+            "type": "number"
+        },
+
+        "write_vout_format":
+        {
+            "type": "string",
+            "enum": ["linear"]
+        },
+
+        "exponent":
+        {
+            "type": "integer"
+        },
+
+        "is_verified":
+        {
+            "type": "boolean"
+        },
+
+        "pmbus_read_sensor":
+        {
+            "type": "object",
+            "properties":
+            {
+                "type": {"$ref": "#/definitions/pmbus_read_sensor_type" },
+
+                "command": {"$ref": "#/definitions/pmbus_read_sensor_command" },
+
+                "format": {"$ref": "#/definitions/read_sensor_format" },
+
+                "exponent": {"$ref": "#/definitions/exponent" }
+            },
+            "required": ["type", "command", "format"],
+            "additionalProperties": false
+        },
+
+        "pmbus_read_sensor_type":
+        {
+            "type": "string",
+            "enum": ["iout", "iout_peak", "iout_valley", "pout", "temperature", "temperature_peak", "vout", "vout_peak", "vout_valley"]
+        },
+
+        "pmbus_read_sensor_command":
+        {
+            "type": "string",
+            "pattern": "^0x[0-9a-fA-F]{2}$"
+        },
+
+        "read_sensor_format":
+        {
+            "type": "string",
+            "enum": ["linear_11", "linear_16"]
+        },
+
+        "chassis":
+        {
+            "type": "array",
+            "items":
+            {
+                "type": "object",
+                "properties":
+                {
+                    "comments": {"$ref": "#/definitions/comments" },
+
+                    "number": {"$ref": "#/definitions/number" },
+
+                    "devices": {"$ref": "#/definitions/devices" }
+                },
+
+                "required": ["number"],
+                "additionalProperties": false
+            },
+            "minItems": 1
+        },
+
+        "number":
+        {
+            "type": "integer",
+            "minimum": 1
+        },
+
+        "devices":
+        {
+            "type": "array",
+            "items":
+            {
+                "type": "object",
+                "properties":
+                {
+                    "comments": {"$ref": "#/definitions/comments" },
+
+                    "id": {"$ref": "#/definitions/id" },
+
+                    "is_regulator": {"$ref": "#/definitions/is_regulator" },
+
+                    "fru": {"$ref": "#/definitions/fru" },
+
+                    "i2c_interface": {"$ref": "#/definitions/i2c_interface" },
+
+                    "presence_detection": {"$ref": "#/definitions/presence_detection" },
+
+                    "configuration": {"$ref": "#/definitions/configuration" },
+
+                    "rails": {"$ref": "#/definitions/rails" }
+                },
+                "required": ["id", "is_regulator", "fru", "i2c_interface"],
+                "if":
+                {
+                    "properties": { "is_regulator": { "const": false } }
+                },
+                "then":
+                {
+                    "not" : { "required" : ["rails"] }
+                },
+                "additionalProperties": false
+            },
+            "minItems": 1
+        },
+
+        "is_regulator":
+        {
+            "type": "boolean"
+        },
+
+        "i2c_interface":
+        {
+            "type": "object",
+
+            "properties":
+            {
+                "bus": {"$ref": "#/definitions/bus" },
+
+                "address": {"$ref": "#/definitions/address" }
+            },
+
+            "required": ["bus", "address"],
+            "additionalProperties": false
+        },
+
+        "bus":
+        {
+            "type": "integer",
+            "minimum": 0
+        },
+
+        "address":
+        {
+            "type": "string",
+            "pattern": "^0x[0-9A-Fa-f]{2}$"
+        },
+
+        "presence_detection":
+        {
+            "type": "object",
+
+            "properties":
+            {
+                "comments": {"$ref": "#/definitions/comments" },
+
+                "rule_id": {"$ref": "#/definitions/id" },
+
+                "actions": {"$ref": "#/definitions/actions" }
+            },
+            "additionalProperties": false,
+            "oneOf": [
+                {"required": ["rule_id"]},
+                {"required": ["actions"]}
+            ]
+        },
+
+        "configuration":
+        {
+            "type": "object",
+
+            "properties":
+            {
+                "comments": {"$ref": "#/definitions/comments" },
+
+                "volts": {"$ref": "#/definitions/volts" },
+
+                "rule_id": {"$ref": "#/definitions/id" },
+
+                "actions": {"$ref": "#/definitions/actions" }
+            },
+            "additionalProperties": false,
+            "oneOf": [
+                {"required": ["rule_id"]},
+                {"required": ["actions"]}
+            ]
+        },
+
+        "rail":
+        {
+            "type": "object",
+            "properties":
+            {
+                "comments": {"$ref": "#/definitions/comments" },
+
+                "id": {"$ref": "#/definitions/id" },
+
+                "configuration": {"$ref": "#/definitions/configuration" },
+
+                "sensor_monitoring": {"$ref": "#/definitions/sensor_monitoring" }
+            },
+
+            "required": ["id"],
+            "additionalProperties": false
+        },
+
+        "rails":
+        {
+            "type": "array",
+            "items": {"$ref": "#/definitions/rail" },
+            "minItems": 1
+        },
+
+        "sensor_monitoring":
+        {
+            "type": "object",
+
+            "properties":
+            {
+                "comments": {"$ref": "#/definitions/comments" },
+
+                "rule_id": {"$ref": "#/definitions/id" },
+
+                "actions": {"$ref": "#/definitions/actions" }
+            },
+            "additionalProperties": false,
+            "oneOf": [
+                {"required": ["rule_id"]},
+                {"required": ["actions"]}
+            ]
+        }
+
+    }
+}