##############################################################################
# Copyright (c) 2018 Enea AB and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
---
$schema: 'http://json-schema.org/schema#'
$id: 'https://github.com/opnfv/pharos/blob/master/config/pdf/pod1.yaml'

definitions:
  net_config:
    v0.1:
      # NOTE: I hope this is going away soon, so I won't model it yet
      type: 'object'
  compass:
    v0.1:
      type: 'object'
      # NOTE: To be properly modeled by Compass4NFV maintainers
  daisy:
    v0.1:
      type: 'object'
      # NOTE: To be properly modeled by Daisy maintainers
  fuel:
    v0.1:
      type: 'object'
      properties:
        jumphost:
          type: 'object'
          properties:
            bridges:
              type: 'object'
              properties:
                admin:
                  type: ['string', 'null']
                mgmt:
                  type: ['string', 'null']
                private:
                  type: ['string', 'null']
                public:
                  type: ['string', 'null']
              required: ['admin', 'mgmt', 'private', 'public']
              additionalProperties: false
          required: ['bridges']
          additionalProperties: false
        maas:
          type: 'object'
          properties:
            timeout_comissioning:
              type: 'number'
            timeout_deploying:
              type: 'number'
          required: ['timeout_comissioning', 'timeout_deploying']
          additionalProperties: false
        network:
          type: 'object'
          properties:
            node:
              type: 'array'
              items:
                type: 'object'
                properties:
                  interfaces:
                    type: 'array'
                    items:
                      type: ['string', 'null']
                  busaddr:
                    type: 'array'
                    items:
                      type: ['string', 'null']
                required: ['interfaces', 'busaddr']
                additionalProperties: false
          required: ['node']
          additionalProperties: false
        reclass:  # Optional
          type: 'object'
          properties:
            node:
              type: 'array'
              items:
                type: 'object'
                properties:
                  compute_params:
                    type: 'object'
                    properties:
                      common:  # Optional
                        type: 'object'
                        properties: &compute_params_common_properties
                          nova_cpu_pinning:  # Optional
                            type: 'string'
                          compute_hugepages_size:
                            type: 'string'
                            enum: ['2M', '1G']
                          compute_hugepages_count:
                            type: 'number'
                          compute_hugepages_mount:
                            type: 'string'
                          compute_kernel_isolcpu:  # Optional
                            type: 'string'
                          compute_ovs_pmd_cpu_mask:  # Optional
                            type: ['string', 'number']
                          compute_ovs_memory_channels:  # Optional
                            type: ['string', 'number']
                        required: ['compute_hugepages_size', 'compute_hugepages_count',
                                   'compute_hugepages_mount']
                        additionalProperties: false
                      dpdk:  # Optional
                        type: 'object'
                        properties:
                          <<: *compute_params_common_properties
                          compute_dpdk_driver:
                            type: 'string'
                          compute_ovs_dpdk_socket_mem:
                            type: ['string', 'number']
                          compute_ovs_dpdk_lcore_mask:
                            type: ['string', 'number']
                          dpdk0_driver:
                            type: 'string'
                          dpdk0_n_rxq:
                            type: 'number'
                        required: ['compute_dpdk_driver', 'dpdk0_driver', 'dpdk0_n_rxq',
                                   'compute_ovs_dpdk_socket_mem',
                                   'compute_ovs_dpdk_lcore_mask']
                        additionalProperties: false
                    additionalProperties: false
                required: ['compute_params']
                additionalProperties: false
          required: ['node']
          additionalProperties: false
      required: ['jumphost', 'network']
      additionalProperties: false
  osa:
    v0.1:
      type: 'object'
      # NOTE: To be properly modeled by XCI maintainers

##############################################################################
# Top-level structure:
# - define all possible top-level and second-level keys, without enforcing a
#   schema for second-level, just so we can disallow additional properties;
# - require 'version' and allow dynamically generated 'version_x.y' key;
properties:
  idf:
    properties:
      # version_x.y keys are auto-added by `validate_schema.py` based on 'version'
      version_0.1:
        type: 'boolean'
      version:
        type: 'number'
        enum: [0.1]
      installer:
        type: 'array'
        items:
          type: 'string'
          enum: ['apex', 'compass4nfv', 'daisy', 'fuel', 'joid', 'osa']
      net_config:
        type: 'object'
      compass:
        type: 'object'
      daisy:
        type: 'object'
      fuel:
        type: 'object'
      osa:
        type: 'object'
    required: ['version']
    additionalProperties: false
    ############################################################################
    # Schema versioning
    # - based on dynamically added 'version_x.y', require additional IDF blocks
    #   and validate them against the proper schema version;
    dependencies:
      version_0.1:
        properties:
          net_config:
            $ref: '#/definitions/net_config/v0.1'
          compass:
            $ref: '#/definitions/compass/v0.1'
          daisy:
            $ref: '#/definitions/daisy/v0.1'
          fuel:
            $ref: '#/definitions/fuel/v0.1'
          osa:
            $ref: '#/definitions/osa/v0.1'
      fuel:
        required: ['net_config']
      daisy:
        required: ['net_config']
      osa:
        required: ['net_config']

# Do not allow any properties not defined here. This lets us catch typos.
additionalProperties: false
required: ['idf']