arm-pod10: Increase MaaS deploy timeout
[pharos.git] / config / pdf / pod1.schema.yaml
index a602b56..4de326e 100644 (file)
@@ -10,173 +10,240 @@ $schema: 'http://json-schema.org/schema#'
 $id: 'https://github.com/opnfv/pharos/blob/master/config/pdf/pod1.yaml'
 
 definitions:
+  ############################################################################
+  # Low-level, general purpose definitions, unversioned
   ip_address:
     type: 'string'  # NOTE: we don't validate this is a valid addr (yet)
   mac_address:
     type: 'string'
     pattern: '^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$'
-  # Common node schema for jumpserver, cluster nodes
+  ############################################################################
+  # Mid-level definitions, common schema for jumpserver & cluster nodes
   node:
-    type: 'object'
-    properties:
-      type:
-        type: 'string'
-        enum: ['baremetal', 'virtual']
-      vendor:
-        type: 'string'
-      model:
-        type: 'string'
-      arch:
-        type: 'string'
-        enum: ['aarch64', 'x86_64']
-      cpus:
-        type: 'number'
-      cpu_cflags:
-        type: 'string'
-      cores:
-        type: 'number'
-      memory:
-        type: 'string'
-        pattern: '^[0-9]+[GT]B?$'
-    required: ['type', 'vendor', 'model', 'arch', 'cpus', 'cpu_cflags', 'cores', 'memory']
-    additionalProperties: false
-  disks:
-    type: 'array'
-    items:
+    v1.0:
       type: 'object'
       properties:
-        name:
+        type:
+          type: 'string'
+          enum: ['baremetal', 'virtual']
+        vendor:
           type: 'string'
-          pattern: '^disk[0-9]+$'
-        disk_capacity:
+        model:
           type: 'string'
-          pattern: '^[0-9]+[MGT]B?$'
-        disk_type:
+        arch:
           type: 'string'
-          enum: ['hdd', 'ssd', 'cdrom', 'tape']
-        disk_interface:
+          enum: ['aarch64', 'x86_64']
+        cpus:
+          type: 'number'
+        cpu_cflags:
           type: 'string'
-          enum: ['sata', 'sas', 'ssd', 'nvme', 'scsi', 'iscsi']
-        disk_rotation:
+        cores:
           type: 'number'
-          enum: [0, 5400, 7200, 10000, 15000]
-      required: ['name', 'disk_capacity', 'disk_type', 'disk_interface', 'disk_rotation']
+        memory:
+          type: 'string'
+          pattern: '^[1-9]\d*[MGT]B?$'
+      required: ['type', 'vendor', 'model', 'arch', 'cpus', 'cpu_cflags', 'cores', 'memory']
       additionalProperties: false
+  disks:
+    v1.0:
+      type: 'array'
+      items:
+        type: 'object'
+        properties:
+          name:
+            type: 'string'
+            pattern: '^disk[0-9]+$'
+          disk_capacity:
+            type: 'string'
+            pattern: '^[1-9][\d\.]*[MGT]B?$'
+          disk_type:
+            type: 'string'
+            enum: ['hdd', 'ssd', 'cdrom', 'tape']
+          disk_interface:
+            type: 'string'
+            enum: ['sata', 'sas', 'ssd', 'nvme', 'scsi', 'iscsi']
+          disk_rotation:
+            type: 'number'
+            enum: [0, 5400, 7200, 10000, 15000]
+        required: ['name', 'disk_capacity', 'disk_type', 'disk_interface', 'disk_rotation']
+        additionalProperties: false
   remote_management:
-    type: 'object'
-    properties:
-      type:
-        type: 'string'
-        enum: ['ipmi', 'amt']
-      versions:
-        type: 'array'
-        items:
+    v1.0:
+      properties:
+        user:
+          type: 'string'
+        pass:
+          type: 'string'
+        port:
           type: 'number'
-          enum: [1.0, 2.0]
-      user:
-        type: 'string'
-      pass:
-        type: 'string'
-      address:
-        $ref: '#/definitions/ip_address'
-      mac_address:
-        $ref: '#/definitions/mac_address'
-    required: ['type', 'versions', 'user', 'pass', 'address', 'mac_address']
-    additionalProperties: false
+        privilege_level:
+          type: 'string'
+        type:
+          type: 'string'
+        versions:
+          type: 'array'
+        address:
+          type: 'string'
+        mac_address:
+          type: 'string'
+      # These subsections are best validated separately for baremetal/virtual
+      oneOf:
+        - type: 'object'
+          properties:
+            type:
+              type: 'string'
+              enum: ['ipmi', 'amt']
+            versions:
+              type: 'array'
+              items:
+                type: 'number'
+                enum: [1.0, 2.0]
+            address:
+              $ref: '#/definitions/ip_address'
+            mac_address:
+              $ref: '#/definitions/mac_address'
+          required: ['type', 'versions', 'address', 'mac_address']
+        - type: 'object'
+          properties:
+            type:
+              type: 'string'
+              enum: ['libvirt']
+            address:
+              type: 'string'  # Loose validation of libvirt URI for now
+          required: ['type', 'address']
+      required: ['user', 'pass']
+      additionalProperties: false
   interfaces:
-    type: 'array'
-    items:
+    v1.0:
+      type: 'array'
+      items:
+        type: 'object'
+        properties:
+          name:
+            type: 'string'
+            pattern: '^nic[0-9]+$'
+          mac_address:
+            $ref: '#/definitions/mac_address'
+          # Optional
+          address:
+            $ref: '#/definitions/ip_address'
+          # Optional
+          vlan:
+            oneOf:
+              - type: 'string'
+                pattern: '^(native|[1-9][0-9]{0,3})(\|(native|[1-9][0-9]{0,3}))*$'
+              - type: 'integer'
+                mininum: 1
+                maximum: 4095
+          # Optional
+          speed:
+            type: 'string'
+            enum: ['1gb', '10gb', '25gb', '40gb']
+            # FIXME: mandatory for nodes?
+          # Optional
+          features:
+            type: ['string', 'null']
+            pattern: '^((dpdk|sriov)\|?)*$'
+            # FIXME: mandatory for nodes?
+        required: ['name', 'mac_address']
+        additionalProperties: false
+  ############################################################################
+  # Top-level PDF blocks, versioned
+  details:
+    v1.0:
       type: 'object'
       properties:
-        name:
+        type:
           type: 'string'
-          pattern: '^nic[0-9]+$'
-        mac_address:
-          $ref: '#/definitions/mac_address'
-        # Optional
-        address:
-          $ref: '#/definitions/ip_address'
-        # Optional
-        vlan:
-          oneOf:
-            - type: 'string'
-              pattern: '^(native|[1-9][0-9]{0,3})(\|(native|[1-9][0-9]{0,3}))*$'
-            - type: 'integer'
-              mininum: 1
-              maximum: 4095
-        # Optional
-        speed:
-          type: 'string'
-          enum: ['1gb', '10gb', '25gb', '40gb']
-          # FIXME: mandatory for nodes?
-        # Optional
-        features:
-          type: ['string', 'null']
-          pattern: '^((dpdk|sriov)\|?)*$'
-          # FIXME: mandatory for nodes?
-      required: ['name', 'mac_address']
+          enum: ['production', 'development']
+        pod_owner:
+          type: 'string'
+        contact:
+          type: 'string'
+          pattern: '^([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+[,; ]*)+$'
+        lab:
+          type: 'string'
+        location:
+          type: 'string'
+        link:
+          type: 'string'
+      required: ['type', 'pod_owner', 'contact', 'lab', 'location', 'link']
       additionalProperties: false
-
-# Do not allow any properties not defined here. This lets us catch typos.
-additionalProperties: false
-
-properties:
-  details:
-    type: 'object'
-    properties:
-      type:
-        type: 'string'
-        enum: ['production', 'development']
-      pod_owner:
-        type: 'string'
-      contact:
-        type: 'string'
-        pattern: '^([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+[,; ]*)+$'
-      lab:
-        type: 'string'
-      location:
-        type: 'string'
-      link:
-        type: 'string'
-    required: ['type', 'pod_owner', 'contact', 'lab', 'location', 'link']
-    additionalProperties: false
   jumphost:
-    type: 'object'
-    properties:
-      name:
-        type: 'string'
-      node:
-        $ref: '#/definitions/node'
-      disks:
-        $ref: '#/definitions/disks'
-      os:
-        type: 'string'
-      remote_params:  # Optional YAML anchor, contents will be validated below
-        type: 'object'
-      remote_management:
-        $ref: '#/definitions/remote_management'
-      interfaces:
-        $ref: '#/definitions/interfaces'
-    required: ['name', 'node', 'disks', 'os', 'remote_management', 'interfaces']
-    additionalProperties: false
-  nodes:
-    type: 'array'
-    items:
+    v1.0:
       type: 'object'
       properties:
         name:
           type: 'string'
         node:
-          $ref: '#/definitions/node'
+          $ref: '#/definitions/node/v1.0'
         disks:
-          $ref: '#/definitions/disks'
+          $ref: '#/definitions/disks/v1.0'
         os:
           type: 'string'
-        remote_params:  # Optional YAML anchor, contents will be validated after inject
+        remote_params:  # Optional YAML anchor, contents will be validated below
           type: 'object'
         remote_management:
-          $ref: '#/definitions/remote_management'
+          $ref: '#/definitions/remote_management/v1.0'
         interfaces:
-          $ref: '#/definitions/interfaces'
-      required: ['name', 'node', 'disks', 'remote_management', 'interfaces']
+          $ref: '#/definitions/interfaces/v1.0'
+      required: ['name', 'node', 'disks', 'os', 'remote_management', 'interfaces']
       additionalProperties: false
+  nodes:
+    v1.0:
+      type: 'array'
+      items:
+        type: 'object'
+        properties:
+          name:
+            type: 'string'
+          node:
+            $ref: '#/definitions/node/v1.0'
+          disks:
+            $ref: '#/definitions/disks/v1.0'
+          os:
+            type: 'string'
+          remote_params:  # Optional YAML anchor, contents will be validated after inject
+            type: 'object'
+          remote_management:
+            $ref: '#/definitions/remote_management/v1.0'
+          interfaces:
+            $ref: '#/definitions/interfaces/v1.0'
+        required: ['name', 'node', 'disks', 'remote_management', 'interfaces']
+        additionalProperties: false
+
+##############################################################################
+# Top-level structure:
+# - define all possible top-level keys, without enforcing a schema for them,
+#   just so we can disallow additional properties;
+# - require 'version' and allow dynamically generated 'version_x.y' key;
+properties:
+  # version_x.y keys are auto-added by `validate_schema.py` based on 'version'
+  version_1.0:
+    type: 'boolean'
+  version:
+    type: 'number'
+    enum: [1.0]
+  details:
+    type: 'object'
+  jumphost:
+    type: 'object'
+  nodes:
+    type: 'array'
+required: ['version']
+additionalProperties: false
+
+##############################################################################
+# Schema versioning
+# - based on dynamically added 'version_x.y', require additional PDF blocks
+#   and validate them against the proper schema version;
+dependencies:
+  version_1.0:
+    properties:
+      details:
+        $ref: '#/definitions/details/v1.0'
+      jumphost:
+        $ref: '#/definitions/jumphost/v1.0'
+      nodes:
+        $ref: '#/definitions/nodes/v1.0'
+    required: ['details', 'jumphost', 'nodes']