JSON Зависимость схемы от минимального значения - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь добавить к свойству зависимость на основе значения свойства перед ним. В моем JSON есть свойство instance. Только если это свойство> 2, покажите свойство StartIndex. Я попытался добавить еще один if-then-else к моему ранее существовавшему (завернутому в allOf), но это не удалось, поэтому я решил выбрать маршрут зависимости.

Вот схема JSON с моей попыткой при добавлении зависимости со свойством StartIndex:

{
  "definitions": {},
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://example.com/root.json",
  "type": "object",
  "title": " ",
  "required": [
    "NetworkProfile",
    "GroupEmailAddress",
    "FILESTORAGE",
    "Memory",
    "Instances",
    "StartIndex"
  ],
  "properties": {
    "Name": {
      "$id": "#/properties/Name",
      "type": "string",
      "title": "Name",
      "default": "",
      "description": "The first five characters are generated per <a href=\"https://confluence.dell.com/display/AD/Common+Questions#CommonQuestions-HowisthenameoftheVirtualMachinedetermined?\" target=\"_blank\">specs</a>. Specify the next eight characters here and we suggest: Data Center (2), Layer (2-3), Sequential Number (2).",
      "examples": [
        ""
      ],
      "minLength": 0,
      "maxLength": 8,
      "pattern": "^[a-zA-Z0-9]*$",
      "validationMessages": {
        "pattern": "Must contain only alphanumeric characters.",
        "required": "Must contain only alphanumeric characters."
      }
    },
    "Instances": {
      "$id": "#/properties/Instances",
      "default": 2,
      "examples": [
        "2"
      ],
      "pattern": "^(.*)$",
      "title": "Number of VM Node",
      "description": "Number of VM instance in this request",
      "minimum": 1,
      "maximum": 5,
      "type": "number"
    },
    "StartIndex": {
      "dependencies": {
        "Instances": {
          "minimum": 2
        }
      },
      "$id": "#/properties/StartIndex",
      "default": 1,
      "examples": [
        "1"
      ],
      "pattern": "^(.*)$",
      "title": "Start Index for these VMs",
      "description": "The starting sequence number for this set of servers",
      "type": "number",
      "minimum": 1
    },
    "Memory": {
      "$id": "#/properties/Memory",
      "type": "number",
      "enum": [
        4,
        8,
        16
      ],
      "title": "RAM (GB)",
      "default": 4,
      "examples": [
        ""
      ],
      "pattern": "^(.*)$"
    },
    "GroupEmailAddress": {
      "$id": "#/properties/GroupEmailAddress",
      "type": "string",
      "title": "Group Email Address",
      "default": "",
      "description": "This should be an email address for your application group. Security will use this email address to contact when TLS cert needs to be renewed.",
      "examples": [
        ""
      ]
    },
    "User": {
      "$id": "#/properties/User",
      "type": "string",
      "title": "Admin Group",
      "default": "",
      "examples": [
        ""
      ],
      "description": "The user account that will have access to the vm. Default belong to requester if not specified. Additional users can be added by using a comma(,) as a separator. <br> (e.g. Americas\\firstName_lastName). Only PAC group is accepted for PROD.",
      "pattern": "^((Americas|Asia-Pacific|Europe)\\\\.[a-zA-Z0-9_.%]*[*,]?[\\s]*)*$"
    },
    "NetworkProfile": {
      "$id": "#/properties/NetworkProfile",
      "type": "string",
      "enum": [
        "APP",
        "WEB"
      ],
      "title": "Server Type/Function",
      "description": "Web Server is meant to serve static pages e.g. HTML and CSS, while Application Server is responsible for generating dynamic content by executing server side code.",
      "default": "",
      "examples": [
        ""
      ],
      "pattern": "^(.*)$"
    },
    "eDell": {
      "$id": "#/properties/eDell",
      "title": "Is the VM related to <a href=\"https://confluence.dell.com/display/AD/Common+Questions#CommonQuestions-WhatiseDell?\" target=\"_blank\">eDell</a>? ",
      "type": "boolean",
      "default": false
    },
    "Disks": {
      "$id": "#/properties/Disks",
      "type": "array",
      "title": "Local (Non-OS) Storage. Default OS Drive (C) size is 60GB. The (D) drive is fixed at 20 GB, can use E-Z for additional storage. Can only add an additional 900GB.",
      "items": {
        "$id": "#/properties/Disks/items",
        "type": "object",
        "title": " ",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$id": "#/properties/Disks/items/properties/data",
            "type": "object",
            "title": " ",
            "required": [
              "capacity",
              "initial_location"
            ],
            "properties": {
              "capacity": {
                "$id": "#/properties/Disks/items/properties/data/properties/capacity",
                "type": "number",
                "title": "Capacity (GB)",
                "default": "",
                "examples": [
                  "20"
                ],
                "minimum": 5,
                "maximum": 900
              },
              "initial_location": {
                "$id": "#/properties/Disks/items/properties/data/properties/initial_location",
                "type": "string",
                "title": "Drive Letter",
                "default": "E",
                "examples": [
                  "/u02"
                ],
                "description": "Drive Letter of the partition without colon",
                "pattern": "^[eE,fF,gG,hH,iI,jJ,kK,lL,mM,nN,oO,pP,qQ,rR,sS,tT,uU,vV,wW,xX,yY,zZ]{1}$",
                "validationMessages": {
                  "pattern": "C,D are reserved use E-Z.",
                  "required": "C,D are reserved use E-Z."
                }
              }
            }
          }
        }
      }
    },
    "FILESTORAGE": {
      "$id": "#/FileStorage",
      "type": "string",
      "enum": [
        "YES",
        "NO"
      ],
      "title": "Add File Storage",
      "default": "NO",
      "examples": [
        ""
      ],
      "pattern": "^(.*)$"
    }
  },
  "if": {
    "properties": {
      "FILESTORAGE": {
        "const": "YES"
      }
    }
  },
  "then": {
    "properties": {
      "NASDisk": {
        "$id": "#/properties/NASDisk",
        "type": "object",
        "title": "File Storage",
        "required": [
          "AppName",
          "SizeGB",
          "Protocol",
          "ShareOwner",
          "Function"
        ],
        "properties": {
          "Protocol": {
            "$id": "#/properties/NASDisk/properties/Protocol",
            "type": "string",
            "default": "CIFS",
            "options": {
              "hidden": "true"
            }
          },
          "Function": {
            "$id": "#/properties/NASDisks/properties/Function",
            "type": "string",
            "enum": [
              "File",
              "Storage",
              "Backup",
              "App",
              "Log",
              "Database",
              "Repository"
            ],
            "title": "Choose Function for NAS",
            "default": "File",
            "examples": [
              ""
            ],
            "pattern": "^(.*)$"
          },
          "AppName": {
            "$id": "#/properties/NASDisk/properties/AppName",
            "type": "string",
            "title": "App Name",
            "default": "",
            "description": "Abbreviation or alias of the application name to be prefix to the share name, limit to 10 letters",
            "pattern": "^[a-zA-Z]{1,10}$"
          },
          "SizeGB": {
            "$id": "#/properties/NASDisk/properties/SizeGB",
            "type": "number",
            "title": "Size (GB)",
            "default": 5,
            "examples": [
              5
            ],
            "minimum": 5,
            "maximum": 500
          },
          "ShareOwner": {
            "$id": "#/properties/NASDisk/properties/ShareOwner",
            "type": "string",
            "title": "Share Owner",
            "default": "",
            "description": "User account with ownership of the share. Group ownership can be specified using the format DOMAIN\\UserName.  <br> (e.g. Americas\\firstName_lastName).",
            "examples": [
              "adms_c_lawlor"
            ],
            "pattern": "^((Americas|Asia-Pacific|Europe)\\\\.[a-zA-Z0-9_.%]*[*,]?[\\s]*)*$"
          },
          "FC_Members": {
            "$id": "#/properties/NASDisk/properties/FC_Members",
            "type": "string",
            "description": "Comma separated AD groups that will have full control of share."
          },
          "RW_Members": {
            "$id": "#/properties/NASDisk/properties/RW_Members",
            "type": "string",
            "description": "Comma separated AD groups that will have read/write control of share."
          }
        }
      }
    }
  },
  "else": {}
}

Вот была моя попытка allOf:

  "allOf": [
    {
      "if": {
        "properties": {
          "FILESTORAGE": {
            "const": "YES"
          }
        }
      },
      "then": {
        "properties": {
          "NASDisk": {
            "$id": "#/properties/NASDisk",
            "type": "object",
            "title": "File Storage",
            "required": [
              "AppName",
              "SizeGB",
              "Protocol",
              "ShareOwner",
              "Function"
            ],
            "properties": {
              "Protocol": {
                "$id": "#/properties/NASDisk/properties/Protocol",
                "type": "string",
                "default": "CIFS",
                "options": {
                  "hidden": "true"
                }
              },
              "Function": {
                "$id": "#/properties/NASDisks/properties/Function",
                "type": "string",
                "enum": [
                  "File",
                  "Storage",
                  "Backup",
                  "App",
                  "Log",
                  "Database",
                  "Repository"
                ],
                "title": "Choose Function for NAS",
                "default": "File",
                "examples": [
                  ""
                ],
                "pattern": "^(.*)$"
              },
              "AppName": {
                "$id": "#/properties/NASDisk/properties/AppName",
                "type": "string",
                "title": "App Name",
                "default": "",
                "description": "Abbreviation or alias of the application name to be prefix to the share name, limit to 10 letters",
                "pattern": "^[a-zA-Z]{1,10}$"
              },
              "SizeGB": {
                "$id": "#/properties/NASDisk/properties/SizeGB",
                "type": "number",
                "title": "Size (GB)",
                "default": 5,
                "examples": [
                  5
                ],
                "minimum": 5,
                "maximum": 500
              },
              "ShareOwner": {
                "$id": "#/properties/NASDisk/properties/ShareOwner",
                "type": "string",
                "title": "Share Owner",
                "default": "",
                "description": "User account with ownership of the share. Group ownership can be specified using the format DOMAIN\\UserName.  <br> (e.g. Americas\\firstName_lastName).",
                "examples": [
                  "adms_c_lawlor"
                ],
                "pattern": "^((Americas|Asia-Pacific|Europe)\\\\.[a-zA-Z0-9_.%]*[*,]?[\\s]*)*$"
              },
              "FC_Members": {
                "$id": "#/properties/NASDisk/properties/FC_Members",
                "type": "string",
                "description": "Comma separated AD groups that will have full control of share."
              },
              "RW_Members": {
                "$id": "#/properties/NASDisk/properties/RW_Members",
                "type": "string",
                "description": "Comma separated AD groups that will have read/write control of share."
              }
            }
          }
        }
      },
      "else": {
        
      }
    },
    {
      "if": {
        "properties": {
          "Instances": {
            "minimum": "1"
          }
        }
      },
      "then": {
        "properties": {
          "StartIndex": {
            "$id": "#/properties/StartIndex",
            "hidden": true,
            "default": "1",
            "examples": [
              "1"
            ],
            "pattern": "^(.*)$",
            "title": "Start Index for these VMs",
            "description": "The starting sequence number for this set of servers",
            "type": "number",
            "minimum": 0
          }
        }
      },
      "else": {
        "properties": {
          "StartIndex": {
            "$id": "#/properties/StartIndex",
            "default": "",
            "examples": [
              "1"
            ],
            "pattern": "^(.*)$",
            "title": "Start Index for these VMs",
            "description": "The starting sequence number for this set of servers",
            "type": "number",
            "minimum": 0
          }
        }
      }
    }
  ]

ОБНОВЛЕНИЕ: Итак, я действительно выясняю это, используя вложенные свойства, как показано здесь

"isMultiDropdown": {
      "title": "",
      "$id": "#/properties/isMultiDropdown",
      "required": [
        "isMulti"
      ],
      "type": "object",
      "if": {
        "properties": {
          "isMulti": {
            "const": "YES"
          }
        }
      },
      "then": {
        "properties": {
          "StartIndex": {
            "$id": "#/properties/StartIndex",
            "default": "",
            "examples": [
              "1"
            ],
            "pattern": "^(.*)$",
            "title": "Start Index for these VMs",
            "description": "The starting sequence number for this set of servers",
            "type": "number",
            "minimum": 0
          }
        }
      },
      "properties": {
        "isMulti": {
          "$id": "#/properties/isMultiDropdown/isMulti",
          "enum": [
            "YES",
            "NO"
          ],
          "title": "Are you provisioning multiple instances?",
          "default": "NO",
          "examples": [
            ""
          ],
          "pattern": "^(.*)$",
          "type": "string"
        }
      }
    }
    ```
...