From 49ce6366b3f4cdabf9570a8fb133074e28b0a1f1 Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Mon, 11 Jan 2016 10:39:39 +0100 Subject: [PATCH] KVM support in JSON schema This PR add KVM support in the appliance schema. It's a part of https://github.com/GNS3/gns3-gui/issues/904 from @boenrobot KVM has three value: * "require" - Forbid installation on the target server if KVM is not available there (i.e. a Windows and OSX; be it local or remote). Install only with KVM enabled. * "allow" - Enable KVM if supported on the target server, but allow installation to continue with KVM disabled if not supported (this should be the default). * "disable" - Even if KVM is supported on the target server, install with KVM disabled. All appliances have been updated to reflect their correct value. Also it's add a sample tool for quickly patch all appliances. --- appliances/alpine-linux.gns3a | 3 +- appliances/arista-veos.gns3a | 3 +- appliances/bird.gns3a | 3 +- appliances/checkpoint-gaia.gns3a | 1 + appliances/cisco-asa.gns3a | 1 + appliances/cisco-asav.gns3a | 3 +- appliances/cisco-csr1000v.gns3a | 3 +- appliances/cisco-iosv.gns3a | 3 +- appliances/cisco-iosvl2.gns3a | 3 +- appliances/cisco-iosxrv.gns3a | 3 +- appliances/cisco-nxosv.gns3a | 3 +- appliances/cumulus-vx.gns3a | 3 +- appliances/firefox.gns3a | 1 + appliances/hp-vsr1001.gns3a | 3 +- appliances/internet.gns3a | 1 + appliances/juniper-vsrx.gns3a | 1 + appliances/kali-linux.gns3a | 3 +- appliances/microcore-linux.gns3a | 3 +- appliances/microsoft-windows+ie.gns3a | 1 + appliances/mikrotik-chr.gns3a | 1 + appliances/netem.gns3a | 1 + appliances/openbsd.gns3a | 3 +- appliances/openvswitch.gns3a | 3 +- appliances/openwrt-realview.gns3a | 1 + appliances/openwrt.gns3a | 3 +- appliances/ostinato.gns3a | 1 + appliances/pfsense.gns3a | 1 + appliances/tinycore-linux.gns3a | 1 + appliances/vrin.gns3a | 3 +- appliances/vyos.gns3a | 3 +- patch_appliance.py | 82 +++++++++++++++++++++++++++ schemas/appliance.json | 7 ++- 32 files changed, 136 insertions(+), 19 deletions(-) create mode 100644 patch_appliance.py diff --git a/appliances/alpine-linux.gns3a b/appliances/alpine-linux.gns3a index 7f30185..8fe3e3c 100644 --- a/appliances/alpine-linux.gns3a +++ b/appliances/alpine-linux.gns3a @@ -17,7 +17,8 @@ "adapters": 1, "ram": 32, "arch": "x86_64", - "console_type": "telnet" + "console_type": "telnet", + "kvm": "allow" }, "images": [ { diff --git a/appliances/arista-veos.gns3a b/appliances/arista-veos.gns3a index b090329..297bc8d 100644 --- a/appliances/arista-veos.gns3a +++ b/appliances/arista-veos.gns3a @@ -17,7 +17,8 @@ "adapters": 8, "ram": 1024, "arch": "x86_64", - "console_type": "telnet" + "console_type": "telnet", + "kvm": "require" }, "images": [ { diff --git a/appliances/bird.gns3a b/appliances/bird.gns3a index 03a6f04..111180d 100644 --- a/appliances/bird.gns3a +++ b/appliances/bird.gns3a @@ -16,7 +16,8 @@ "adapters": 4, "ram": 128, "arch": "x86_64", - "console_type": "telnet" + "console_type": "telnet", + "kvm": "allow" }, "images": [ { diff --git a/appliances/checkpoint-gaia.gns3a b/appliances/checkpoint-gaia.gns3a index cd93f0f..eae73ee 100644 --- a/appliances/checkpoint-gaia.gns3a +++ b/appliances/checkpoint-gaia.gns3a @@ -18,6 +18,7 @@ "arch": "x86_64", "console_type": "telnet", "boot_priority": "dc", + "kvm": "require", "process_priority": "normal" }, "images": [ diff --git a/appliances/cisco-asa.gns3a b/appliances/cisco-asa.gns3a index 0b6a5d7..f07df58 100644 --- a/appliances/cisco-asa.gns3a +++ b/appliances/cisco-asa.gns3a @@ -20,6 +20,7 @@ "arch": "i386", "console_type": "telnet", "kernel_command_line": "ide_generic.probe_mask=0x01 ide_core.chs=0.0:980,16,32 auto nousb console=ttyS0,9600 bigphysarea=65536 ide1=noprobe no-hlt", + "kvm": "disable", "options": "-no-kvm -icount auto -hdachs 980,16,32", "cpu_throttling": 80, "process_priority": "low" diff --git a/appliances/cisco-asav.gns3a b/appliances/cisco-asav.gns3a index b44fca4..39505c1 100644 --- a/appliances/cisco-asav.gns3a +++ b/appliances/cisco-asav.gns3a @@ -20,7 +20,8 @@ "adapters": 8, "ram": 2048, "arch": "x86_64", - "console_type": "vnc" + "console_type": "vnc", + "kvm": "require" }, "images": [ { diff --git a/appliances/cisco-csr1000v.gns3a b/appliances/cisco-csr1000v.gns3a index f68ee3b..73b52ab 100644 --- a/appliances/cisco-csr1000v.gns3a +++ b/appliances/cisco-csr1000v.gns3a @@ -18,7 +18,8 @@ "adapters": 4, "ram": 3072, "arch": "x86_64", - "console_type": "telnet" + "console_type": "telnet", + "kvm": "require" }, "images": [ { diff --git a/appliances/cisco-iosv.gns3a b/appliances/cisco-iosv.gns3a index 5c3fc02..6dd0a4f 100644 --- a/appliances/cisco-iosv.gns3a +++ b/appliances/cisco-iosv.gns3a @@ -17,7 +17,8 @@ "adapters": 4, "ram": 512, "arch": "i386", - "console_type": "telnet" + "console_type": "telnet", + "kvm": "require" }, "images": [ { diff --git a/appliances/cisco-iosvl2.gns3a b/appliances/cisco-iosvl2.gns3a index 0965818..90e2d14 100644 --- a/appliances/cisco-iosvl2.gns3a +++ b/appliances/cisco-iosvl2.gns3a @@ -18,7 +18,8 @@ "adapters": 16, "ram": 768, "arch": "i386", - "console_type": "telnet" + "console_type": "telnet", + "kvm": "require" }, "images": [ { diff --git a/appliances/cisco-iosxrv.gns3a b/appliances/cisco-iosxrv.gns3a index 128f42e..e26f9e0 100644 --- a/appliances/cisco-iosxrv.gns3a +++ b/appliances/cisco-iosxrv.gns3a @@ -19,7 +19,8 @@ "adapters": 4, "ram": 3072, "arch": "i386", - "console_type": "telnet" + "console_type": "telnet", + "kvm": "require" }, "images": [ { diff --git a/appliances/cisco-nxosv.gns3a b/appliances/cisco-nxosv.gns3a index c43e65b..36f6042 100644 --- a/appliances/cisco-nxosv.gns3a +++ b/appliances/cisco-nxosv.gns3a @@ -18,7 +18,8 @@ "adapters": 16, "ram": 3072, "arch": "x86_64", - "console_type": "telnet" + "console_type": "telnet", + "kvm": "require" }, "images": [ { diff --git a/appliances/cumulus-vx.gns3a b/appliances/cumulus-vx.gns3a index 8b873db..275c703 100644 --- a/appliances/cumulus-vx.gns3a +++ b/appliances/cumulus-vx.gns3a @@ -19,7 +19,8 @@ "adapters": 4, "ram": 256, "arch": "x86_64", - "console_type": "vnc" + "console_type": "vnc", + "kvm": "require" }, "images": [ { diff --git a/appliances/firefox.gns3a b/appliances/firefox.gns3a index 35217fe..03a31a0 100644 --- a/appliances/firefox.gns3a +++ b/appliances/firefox.gns3a @@ -18,6 +18,7 @@ "ram": 256, "arch": "i386", "console_type": "vnc", + "kvm": "allow", "options": "-vga std -usbdevice tablet" }, "images": [ diff --git a/appliances/hp-vsr1001.gns3a b/appliances/hp-vsr1001.gns3a index 08cb0a7..9dff117 100644 --- a/appliances/hp-vsr1001.gns3a +++ b/appliances/hp-vsr1001.gns3a @@ -18,7 +18,8 @@ "ram": 1024, "arch": "x86_64", "console_type": "vnc", - "boot_priority": "dc" + "boot_priority": "dc", + "kvm": "require" }, "images": [ { diff --git a/appliances/internet.gns3a b/appliances/internet.gns3a index 0e5c0e4..68acebd 100644 --- a/appliances/internet.gns3a +++ b/appliances/internet.gns3a @@ -18,6 +18,7 @@ "ram": 64, "arch": "i386", "console_type": "telnet", + "kvm": "allow", "options": "-device e1000,netdev=internet0 -netdev vde,sock=/var/run/vde2/qemu0.ctl,id=internet0" }, "images": [ diff --git a/appliances/juniper-vsrx.gns3a b/appliances/juniper-vsrx.gns3a index 5379344..e408e15 100644 --- a/appliances/juniper-vsrx.gns3a +++ b/appliances/juniper-vsrx.gns3a @@ -19,6 +19,7 @@ "ram": 1024, "arch": "x86_64", "console_type": "telnet", + "kvm": "require", "options": "-smp 2" }, "images": [ diff --git a/appliances/kali-linux.gns3a b/appliances/kali-linux.gns3a index 91fdfe4..792f566 100644 --- a/appliances/kali-linux.gns3a +++ b/appliances/kali-linux.gns3a @@ -16,7 +16,8 @@ "adapters": 8, "ram": 1024, "arch": "x86_64", - "console_type": "vnc" + "console_type": "vnc", + "kvm": "require" }, "images": [ { diff --git a/appliances/microcore-linux.gns3a b/appliances/microcore-linux.gns3a index 172fbeb..a178445 100644 --- a/appliances/microcore-linux.gns3a +++ b/appliances/microcore-linux.gns3a @@ -18,7 +18,8 @@ "adapters": 1, "ram": 64, "arch": "i386", - "console_type": "telnet" + "console_type": "telnet", + "kvm": "allow" }, "images": [ { diff --git a/appliances/microsoft-windows+ie.gns3a b/appliances/microsoft-windows+ie.gns3a index 2e80918..16bc2c6 100644 --- a/appliances/microsoft-windows+ie.gns3a +++ b/appliances/microsoft-windows+ie.gns3a @@ -15,6 +15,7 @@ "ram": 512, "arch": "i386", "console_type": "vnc", + "kvm": "require", "options": "-vga std -soundhw es1370 -usbdevice tablet" }, "images": [ diff --git a/appliances/mikrotik-chr.gns3a b/appliances/mikrotik-chr.gns3a index 6174eab..25b4f6e 100644 --- a/appliances/mikrotik-chr.gns3a +++ b/appliances/mikrotik-chr.gns3a @@ -22,6 +22,7 @@ "arch": "x86_64", "console_type": "telnet", "boot_priority": "c", + "kvm": "allow", "options": "-nographic" }, "images": [ diff --git a/appliances/netem.gns3a b/appliances/netem.gns3a index d4a8e4d..f5439fb 100644 --- a/appliances/netem.gns3a +++ b/appliances/netem.gns3a @@ -18,6 +18,7 @@ "ram": 96, "arch": "i386", "console_type": "telnet", + "kvm": "allow", "options": "-nographic" }, "images": [ diff --git a/appliances/openbsd.gns3a b/appliances/openbsd.gns3a index 064a762..d2e8f5d 100644 --- a/appliances/openbsd.gns3a +++ b/appliances/openbsd.gns3a @@ -18,7 +18,8 @@ "adapters": 8, "ram": 256, "arch": "x86_64", - "console_type": "telnet" + "console_type": "telnet", + "kvm": "allow" }, "images": [ { diff --git a/appliances/openvswitch.gns3a b/appliances/openvswitch.gns3a index 01f8413..35d0482 100644 --- a/appliances/openvswitch.gns3a +++ b/appliances/openvswitch.gns3a @@ -15,7 +15,8 @@ "adapters": 24, "ram": 128, "arch": "x86_64", - "console_type": "telnet" + "console_type": "telnet", + "kvm": "allow" }, "images": [ { diff --git a/appliances/openwrt-realview.gns3a b/appliances/openwrt-realview.gns3a index dc31d1d..92abb6f 100644 --- a/appliances/openwrt-realview.gns3a +++ b/appliances/openwrt-realview.gns3a @@ -17,6 +17,7 @@ "ram": 128, "arch": "arm", "console_type": "telnet", + "kvm": "allow", "options": "-M realview-eb-mpcore" }, "images": [ diff --git a/appliances/openwrt.gns3a b/appliances/openwrt.gns3a index 204cb24..681ce4a 100644 --- a/appliances/openwrt.gns3a +++ b/appliances/openwrt.gns3a @@ -17,7 +17,8 @@ "adapters": 2, "ram": 64, "arch": "i386", - "console_type": "telnet" + "console_type": "telnet", + "kvm": "allow" }, "images": [ { diff --git a/appliances/ostinato.gns3a b/appliances/ostinato.gns3a index 797bbe6..f6cf211 100644 --- a/appliances/ostinato.gns3a +++ b/appliances/ostinato.gns3a @@ -20,6 +20,7 @@ "ram": 256, "arch": "i386", "console_type": "vnc", + "kvm": "allow", "options": "-vga std -usbdevice tablet" }, "images": [ diff --git a/appliances/pfsense.gns3a b/appliances/pfsense.gns3a index 9a7f5db..3a9c1ff 100644 --- a/appliances/pfsense.gns3a +++ b/appliances/pfsense.gns3a @@ -18,6 +18,7 @@ "arch": "x86_64", "console_type": "telnet", "boot_priority": "dc", + "kvm": "allow", "process_priority": "normal" }, "images": [ diff --git a/appliances/tinycore-linux.gns3a b/appliances/tinycore-linux.gns3a index 845a8e0..34b12e4 100644 --- a/appliances/tinycore-linux.gns3a +++ b/appliances/tinycore-linux.gns3a @@ -19,6 +19,7 @@ "ram": 96, "arch": "i386", "console_type": "vnc", + "kvm": "allow", "options": "-vga std -usbdevice tablet" }, "images": [ diff --git a/appliances/vrin.gns3a b/appliances/vrin.gns3a index fc69dee..7260db4 100644 --- a/appliances/vrin.gns3a +++ b/appliances/vrin.gns3a @@ -15,7 +15,8 @@ "adapters": 1, "ram": 256, "arch": "x86_64", - "console_type": "telnet" + "console_type": "telnet", + "kvm": "allow" }, "images": [ { diff --git a/appliances/vyos.gns3a b/appliances/vyos.gns3a index 71172ea..f48aa51 100644 --- a/appliances/vyos.gns3a +++ b/appliances/vyos.gns3a @@ -20,7 +20,8 @@ "ram": 512, "arch": "x86_64", "console_type": "telnet", - "boot_priority": "dc" + "boot_priority": "dc", + "kvm": "allow" }, "images": [ { diff --git a/patch_appliance.py b/patch_appliance.py new file mode 100644 index 0000000..2dc3b4c --- /dev/null +++ b/patch_appliance.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python +# +# Copyright (C) 2015 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +This file is sample tools for patching all appliances. It's usefull when +you need to add a property to all appliances. +""" + +import glob +import sys +import json +import jsonschema + +def ask(question, type='string', optional=False): + while True: + if optional: + sys.stdout.write(question + "(optional leave blank for skip) : ") + else: + sys.stdout.write(question + ": ") + sys.stdout.flush() + val = sys.stdin.readline().strip() + if len(val) == 0: + if optional: + return None + continue + if type == 'integer': + try: + val = int(val) + except ValueError: + continue + sys.stdout.write("\n") + return val + + +def ask_multiple(question, options, optional=False): + while True: + for i, option in enumerate(options): + question += '\n{}) {}'.format(i + 1, option) + question += '\n' + answer = ask(question, type='integer', optional=optional) + if answer is None: + if optional: + return None + else: + if answer > 0 and answer <= len(options): + return options[answer - 1] + + +with open('schemas/appliance.json') as f: + schema = json.load(f) + +for appliance in glob.glob('appliances/*.gns3a'): + print('=> Patch', appliance) + # Load appliance + with open(appliance) as f: + config = json.load(f) + + # Our patch + if not 'qemu' in config: + continue + config['qemu']['kvm'] = ask_multiple('KVM support for {}'.format(appliance), ['require', 'allow', 'disable']) + + # Validate our changes + jsonschema.validate(config, schema) + + # Save + with open(appliance, 'w') as f: + json.dump(config, f,indent=4) diff --git a/schemas/appliance.json b/schemas/appliance.json index baca5b9..87f0c0f 100644 --- a/schemas/appliance.json +++ b/schemas/appliance.json @@ -245,6 +245,10 @@ "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" @@ -272,7 +276,8 @@ "adapters", "ram", "arch", - "console_type" + "console_type", + "kvm" ] }, "images": {