{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "title": "JSON schema validating a GNS3 appliance",

  "definitions": {
    "dynamips_slot": {
        "enum": [
          "C7200-IO-2FE",
          "C7200-IO-FE",
          "C7200-IO-GE-E",
          "NM-16ESW",
          "NM-1E",
          "NM-1FE-TX",
          "NM-4E",
          "NM-4T",
          "PA-2FE-TX",
          "PA-4E",
          "PA-4T+",
          "PA-8E",
          "PA-8T",
          "PA-A1",
          "PA-FE-TX",
          "PA-GE",
          "PA-POS-OC3",
          "C2600-MB-2FE",
          "C2600-MB-1E",
          "C1700-MB-1FE",
          "C2600-MB-2E",
          "C2600-MB-1FE",
          "C1700-MB-WIC1",
          "GT96100-FE",
          "Leopard-2FE",
          ""]
    },

    "dynamips_wic": {
        "enum": [
          "WIC-1ENET",
          "WIC-1T",
          "WIC-2T",
          ""]
    }
  },

  "properties": {
    "name": {
      "type": "string",
      "title": "Appliance name"
    },
    "category": {
      "enum": [
          "router",
          "multilayer_switch",
          "switch",
          "firewall",
          "guest"
      ],
      "title": "Category of the appliance"
    },
    "description": {
      "type": "string",
      "title": "Description of the appliance. Could be a marketing description"
    },
    "vendor_name": {
      "type": "string",
      "title": "Name of the vendor"
    },
    "vendor_url": {
      "type": "string",
      "format": "uri",
      "title": "Website of the vendor"
    },
    "documentation_url": {
      "type": "string",
      "format": "uri",
      "title": "An optional documentation for using the appliance on vendor website"
    },
    "product_name": {
      "type": "string",
      "title": "Product name"
    },
    "product_url": {
      "type": "string",
      "format": "uri",
      "title": "An optional product url on vendor website"
    },
    "registry_version": {
      "enum": [1, 2, 3, 4, 5, 6],
      "title": "Version of the registry compatible with this appliance"
    },
    "status": {
      "enum": ["stable", "experimental", "broken"],
      "title": "Document if the appliance is working or not"
    },
    "availability": {
      "enum": ["free", "with-registration", "free-to-try", "service-contract"],
      "title": "About image availability: can be downloaded directly; download requires a free registration; paid but a trial version (time or feature limited) is available; not available publicly"
    },
    "maintainer": {
      "type": "string",
      "title": "Maintainer name"
    },
    "maintainer_email": {
      "type": "string",
      "format": "email",
      "title": "Maintainer email"
    },
    "usage": {
        "type": "string",
        "title": "How to use the appliance"
    },
    "symbol": {
      "type": "string",
      "title": "An optional symbol for the appliance"
    },
    "first_port_name": {
        "type": "string",
        "title": "Optional name of the first networking port example: eth0"
    },
    "port_name_format": {
        "type": "string",
        "title": "Optional formating of the networking port example: eth{0}"
    },
    "port_segment_size": {
        "type": "integer",
        "title": "Optional port segment size. A port segment is a block of port. For example Ethernet0/0 Ethernet0/1 is the module 0 with a port segment size of 2"
    },
    "linked_clone": {
        "type": "boolean",
        "title": "False if you don't want to use a single image for all nodes"
    },

    "docker": {
        "type": "object",
        "title": "Docker specific options",
        "properties": {
            "adapters": {
                "type": "integer",
                "title": "Number of ethernet adapters"
            },
            "image": {
                "type": "string",
                "title": "Docker image in the Docker Hub"
            },
            "start_command": {
                "type": "string",
                "title": "Command executed when the container start. Empty will use the default"
            },
            "environment": {
                "type": "string",
                "title": "One KEY=VAR environment by line"
            },
            "console_type": {
              "enum": ["telnet", "vnc", "http", "https", "none"],
              "title": "Type of console connection for the administration of the appliance"
            },
            "console_http_port": {
                "description": "Internal port in the container of the HTTP server",
                "type": "integer"
            },
            "console_http_path": {
                "description": "Path of the web interface",
                "type": "string"
            },
            "extra_hosts": {
                "description": "Hosts which will be written to /etc/hosts into container" ,
                "type": "string"
            },
            "extra_volumes": {
                "description": "Additional directories to make persistent that are not included in the images VOLUME directive" ,
                "type": "array",
                "items": {
                    "type": "string"
                }
            }
        },
        "required": [
            "adapters",
            "image"
        ]
    },
    "iou": {
        "type": "object",
        "title": "IOU specific options",
        "properties": {
            "ethernet_adapters": {
                "type": "integer",
                "title": "Number of ethernet adapters"
            },
            "serial_adapters": {
                "type": "integer",
                "title": "Number of serial adapters"
            },
            "nvram": {
                "type": "integer",
                "title": "Host NVRAM"
            },
            "ram": {
                "type": "integer",
                "title": "Host RAM"
            },
            "startup_config": {
                "type": "string",
                "title": "Config loaded at startup"
            }
        },
        "required": [
            "ethernet_adapters",
            "serial_adapters",
            "nvram",
            "ram",
            "startup_config"
        ]
    },
    "dynamips": {
        "type": "object",
        "title": "Dynamips specific options",
        "properties": {
            "chassis": {
                "title": "Chassis type",
                "enum": ["1720", "1721", "1750", "1751", "1760", "2610", "2620", "2610XM", "2620XM", "2650XM", "2621", "2611XM", "2621XM", "2651XM", "3620", "3640", "3660", ""]
            },
            "platform": {
                "title": "Platform type",
                "enum": ["c1700", "c2600", "c2691", "c3725", "c3745", "c3600", "c7200"]
            },
            "ram": {
                "title": "Amount of ram",
                "type": "integer",
                "minimum": 1
            },
            "nvram": {
                "title": "Amount of nvram",
                "type": "integer",
                "minimum": 1
            },
            "startup_config": {
                "type": "string",
                "title": "Config loaded at startup"
            },
            "wic0": { "$ref": "#/definitions/dynamips_wic" },
            "wic1": { "$ref": "#/definitions/dynamips_wic" },
            "wic2": { "$ref": "#/definitions/dynamips_wic" },
            "slot0": { "$ref": "#/definitions/dynamips_slot" },
            "slot1": { "$ref": "#/definitions/dynamips_slot" },
            "slot2": { "$ref": "#/definitions/dynamips_slot" },
            "slot3": { "$ref": "#/definitions/dynamips_slot" },
            "slot4": { "$ref": "#/definitions/dynamips_slot" },
            "slot5": { "$ref": "#/definitions/dynamips_slot" },
            "slot6": { "$ref": "#/definitions/dynamips_slot" },
            "midplane": { "enum": ["std", "vxr"] },
            "npe": { "enum": ["npe-100", "npe-150", "npe-175", "npe-200", "npe-225", "npe-300", "npe-400", "npe-g2"] }
        },
        "required": [
            "platform",
            "ram",
            "nvram"
        ]
    },

    "qemu": {
      "type": "object",
      "title": "Qemu specific options",
      "properties": {
        "adapter_type": {
          "enum": [
              "e1000",
              "e1000-82544gc",
              "e1000-82545em",
              "e1000e",
              "i82550",
              "i82551",
              "i82557a",
              "i82557b",
              "i82557c",
              "i82558a",
              "i82558b",
              "i82559a",
              "i82559b",
              "i82559c",
              "i82559er",
              "i82562",
              "i82801",
              "ne2k_pci",
              "pcnet",
              "rocker",
              "rtl8139",
              "virtio",
              "virtio-net-pci",
              "vmxnet3"
          ],
          "title": "Type of network adapter"
        },
        "adapters": {
          "type": "integer",
          "title": "Number of adapters"
        },
        "ram": {
          "type": "integer",
          "title": "Ram allocated to the appliance (MB)"
        },
        "cpus": {
          "type": "integer",
          "title": "Number of Virtual CPU"
        },
        "hda_disk_interface": {
            "enum": ["ide", "sata", "nvme","scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
            "title": "Disk interface for the installed hda_disk_image"
        },
        "hdb_disk_interface": {
            "enum": ["ide", "sata", "nvme", "scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
            "title": "Disk interface for the installed hdb_disk_image"
        },
        "hdc_disk_interface": {
            "enum": ["ide", "sata", "nvme", "scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
            "title": "Disk interface for the installed hdc_disk_image"
        },
        "hdd_disk_interface": {
            "enum": ["ide", "sata", "nvme", "scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
            "title": "Disk interface for the installed hdd_disk_image"
        },
        "arch": {
          "enum": ["aarch64", "alpha", "arm", "cris", "i386", "lm32", "m68k", "microblaze", "microblazeel", "mips", "mips64", "mips64el", "mipsel", "moxie", "or32", "ppc", "ppc64", "ppcemb", "s390x", "sh4", "sh4eb", "sparc", "sparc64", "tricore", "unicore32", "x86_64", "xtensa", "xtensaeb"],
          "title": "Architecture emulated"
        },
        "console_type": {
          "enum": ["telnet", "vnc", "spice", "spice+agent", "none"],
          "title": "Type of console connection for the administration of the appliance"
        },
        "boot_priority": {
            "enum": ["c", "d", "n", "cn", "cd", "dn", "dc", "nc", "nd"],
            "title": "Disk boot priority. Refer to -boot option in qemu manual for more details."
        },
        "kernel_command_line": {
            "type": "string",
            "title": "Command line parameters send to the kernel"
        },
        "kvm": {
            "title": "KVM requirements",
            "enum": ["require", "allow", "disable"]
        },
        "options": {
            "type": "string",
            "title": "Optional additional qemu command line options"
        },
        "cpu_throttling": {
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "title": "Throttle the CPU"
        },
        "process_priority": {
            "title": "Process priority for QEMU",
            "enum": ["realtime",
                     "very high",
                     "high",
                     "normal",
                     "low",
                     "very low",
                     "null"]
        }
      },
      "required": [
          "adapter_type",
          "adapters",
          "ram",
          "arch",
          "console_type",
          "kvm"
      ]
    },
    "images": {
      "type": "array",
      "title": "Images for this appliance",
      "items": {
        "type": "object",
        "title": "An image file",
        "properties": {
          "filename": {
            "type": "string",
            "title": "Filename"
          },
          "version": {
            "type": "string",
            "title": "Version of the file"
          },
          "md5sum": {
            "type": "string",
            "title": "md5sum of the file",
            "type": "string",
            "pattern": "^[a-f0-9]{32}$"
          },
          "filesize": {
              "type": "integer",
              "title": "File size in bytes"
          },
          "download_url": {
            "type": "string",
            "format": "uri",
            "title": "Download url where you can download the appliance from a browser"
          },
          "direct_download_url": {
            "type": "string",
            "format": "uri",
            "title": "Optional. Non authenticated url to the image file where you can download the image."
          },
          "compression": {
            "enum": ["bzip2", "gzip", "lzma", "xz", "rar", "zip", "7z"],
            "title": "Optional, compression type of direct download url image."
          }
        },
        "required": [
            "filename",
            "version",
            "md5sum",
            "filesize"
        ]
      }
    },
    "versions": {
      "type": "array",
      "title": "Versions of the appliance",
      "items": {
        "type": "object",
        "title": "A version of the appliance",
        "properties": {
          "name": {
            "type": "string",
            "title": "Name of the version"
          },
          "idlepc": {"type": "string", "pattern": "^0x[0-9a-f]{8}"},
          "images": {
            "type": "object",
            "title": "Images used for this version",
            "properties": {
              "kernel_image": {
                "type": "string",
                "title": "Kernel image"
              },
              "initrd": {
                "type": "string",
                "title": "Initrd disk image"
              },
              "image": {
                "type": "string",
                "title": "OS image"
              },
              "bios_image": {
                "type": "string",
                "title": "Bios image"
              },
              "hda_disk_image": {
                "type": "string",
                "title": "Hda disk image"
              },
              "hdb_disk_image": {
                "type": "string",
                "title": "Hdc disk image"
              },
              "hdc_disk_image": {
                "type": "string",
                "title": "Hdd disk image"
              },
              "hdd_disk_image": {
                "type": "string",
                "title": "Hdd diskimage"
              },
              "cdrom_image": {
                "type": "string",
                "title": "cdrom image"
              }
            }
          }
        },
        "required": [
            "name"
        ]
      }
    }
  },
  "required": [
    "name",
    "category",
    "description",
    "vendor_name",
    "vendor_url",
    "product_name",
    "registry_version",
    "status",
    "maintainer",
    "maintainer_email"
  ]
}
