Проверка значений комбинаций с помощью jsonschema - PullRequest
0 голосов
/ 29 января 2020

Я использую jsonschema для проверки файла конфигурации. В настоящее время у меня возникают проблемы с проверкой комбинаций значений вложенных свойств.

Я изначально реализовал if / then / else, но не увидел желаемого поведения после нескольких проходов. То же самое было сделано для переключения, зависимостей и, наконец, использования импликации.

Это моя схема:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "account_group": {
      "type": "string"
    },
    "region": {
      "type": "string",
      "pattern": "^(us(-gov)?|ap|ca|cn|eu|sa)-(central|(north|south)?(east|west)?)-\\d$"
    },
    "appid": {
      "type": "string"
    },
    "services": {
      "type": "object",
      "minProperties": 1,
      "patternProperties": {
        "^[A-Za-z_]*$": {
          "type": "object",
          "properties": {
            "source": {
              "type": "string"
            },
            "port": {
              "type": "number"
            },
            "cpu": {
              "type": "number",
              "enum": [256, 512, 1024, 2048, 4096]
            },
            "memory": {
              "type": "number",
              "enum": [0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
                12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
                22, 23, 24, 25, 26, 27, 28, 29, 30]
            }
          },
          "required": [
            "source",
            "port",
            "cpu",
            "memory"
          ],
        }
      },
      "additionalProperties": false
    },
    "stages": {
      "type": "object",
      "minProperties": 1
    },
    "workingDirectory": {
      "type": "string"
    }
  },
  "required": [
    "name",
    "account_group",
    "appid",
    "services"
  ]
}

Примечание: я удалил свой последний блок allOf, чтобы избежать представления некорректного кода Я уже протестировал против

То, что я пытаюсь выполнить, sh - проверка правильности комбинации значений процессора / памяти в файле конфигурации, который анализируется и сравнивается со схемой.

Комбинации:

256/[0.5, 1, 2]
512/[1-4]
1024/[2-8]
2048/[2-16]
4096/[2-30]

Кто-нибудь любезно предложит соответствующий дизайн схемы для проверки этих комбинаций?

По существу мне нужна проверка для сбоя, если процессор равен 256, и значение память - это что угодно, но не 0,5, 1, 2 - сбой, если процессор равен 512, а значение памяти не равно 1 - 4 и т. д. c.

Я получил наиболее близкое значение с помощью импликации, но я ' Мы видели много комбинаций, использующих зависимости, которые еще больше запутали меня. Лично я чувствовал, что / тогда / еще будет наиболее логичным подходом, но он не дал ожидаемого поведения.

1 Ответ

2 голосов
/ 29 января 2020

if / then - лучший выбор для этого. Шаблон импликации тоже работает, но с if / then приятнее работать. Общая стратегия состоит в том, чтобы создать определение для каждого из ваших условий и затем использовать allOf для их объединения. Вы, конечно, могли бы поместить условия в строку вместо использования definitions, но это намного лучше читается, что облегчает обслуживание. Я сделал первые два, чтобы проиллюстрировать. Вы можете экстраполировать оттуда.

{
  "type": "object",
  "properties": {
    "source": { "type": "string" },
    "port": { "type": "number" },
    "cpu": { "enum": [256, 512, 1024, 2048, 4096] },
    "memory": { "enum": [0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
                         12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
                         22, 23, 24, 25, 26, 27, 28, 29, 30] }
  },
  "required": ["source", "port", "cpu", "memory"],
  "allOf": [
    { "$ref": "#/definitions/if-cpu-256-then-memory-0.5-1-2" },
    { "$ref": "#/definitions/if-cpu-512-then-memory-1-4" }
  ],
  "definitions": {
    "if-cpu-256-then-memory-0.5-1-2": {
      "if": {
        "properties": {
          "cpu": { "const": 256 }
        },
        "required": ["cpu"]
      },
      "then": {
        "properties": {
          "memory": { "enum": [0.5, 1, 2] }
        }
      }
    },
    "if-cpu-512-then-memory-1-4": {
      "if": {
        "properties": {
          "cpu": { "const": 512 }
        },
        "required": ["cpu"]
      },
      "then": {
        "properties": {
          "memory": { "minimum": 1, "maximum": 4 }
        }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...