virtvalidator.py 869 Bytes
Newer Older
1 2
from django.core.exceptions import ValidationError
from lxml import etree as ET
3
import logging
4 5 6

rng_file = "/usr/share/libvirt/schemas/domain.rng"

7 8 9 10 11 12 13
# Mandatory xml elements dor parsing
header = "<domain type='kvm'><name>validator</name>\
<memory unit='KiB'>1024</memory>\
<os><type>hvm</type></os>"
footer = "</domain>"

logger = logging.getLogger()
14 15 16 17


def domain_validator(value):
    xml = header + value + footer
18 19 20 21 22 23 24 25 26 27 28 29 30 31
    try:
        parsed_xml = ET.fromstring(xml)
    except Exception as e:
        raise ValidationError(e.message)
    try:
        relaxng = ET.RelaxNG(file=rng_file)
    except:
        logger.critical("%s RelaxNG libvirt domain schema file "
                        "is missing for validation.", rng_file)
    else:
        try:
            relaxng.assertValid(parsed_xml)
        except Exception as e:
            raise ValidationError(e.message)