def check(self, radl):
        """Check the features in this system."""

        def positive(f, _):
            return f.value >= 0

        def check_ansible_host(f, radl0):
            if radl0.get_ansible_by_id(f.value) is None:
                return False
            return True

        mem_units = ["", "B", "K", "M", "G", "KB", "MB", "GB"]
        SIMPLE_FEATURES = {
            "spot": (str, ["YES", "NO"]),
            "image_type": (str, ["VMDK", "QCOW", "QCOW2", "RAW"]),
            "virtual_system_type": (str, system._check_virtual_system_type),
            "price": ((int, float), positive, None),
            "cpu.count": ((int, float), positive, None),
            "cpu.arch": (str, ['I386', 'X86_64']),
            "cpu.performance": ((int, float), positive, ["ECU", "GCEU", "HRZ"]),
            "memory.size": (int, positive, mem_units),
            "disk.0.os.credentials.new.password": (str, check_password),
            "ansible_host": (str, check_ansible_host),
            SoftFeatures.SOFT: (SoftFeatures, lambda x, r: x.check(r))
        }
        self.check_simple(SIMPLE_FEATURES, radl)

        net_connections = set()

        def check_net_interface_connection(f, radl0):
            if radl0.get_network_by_id(f.value) is None:
                return False
            net_connections.add(f.prop)
            return True

        def check_app(f, x):
            FeaturesApp(f.value.features).check(x)
            return True

        NUM_FEATURES = {
            "net_interface": {
                "connection": (str, check_net_interface_connection),
                "ip": (str, None),
                "dns_name": (str, None)},
            "disk": {
                "image.url": ((str, unicode, list), system._check_disk_image_url),
                "image.name": (str, None),
                "type": (str, None),
                "device": (str, None),
                "mount_path": (str, None),
                "fstype": (str, None),
                "size": (float, positive, mem_units),
                "free_size": (float, positive, mem_units),
                "os.name": (str, ["LINUX", "WINDOWS", "MAC OS X"]),
                "os.flavour": (str, None),
                "os.version": (str, is_version),
                "os.credentials.username": (str, None),
                "os.credentials.password": (str, None),
                "os.credentials.private_key": (str, None),
                "os.credentials.public_key": (str, None),
                "applications": (Features, check_app)
            }
        }
        prefixes = self.check_num(NUM_FEATURES, radl)

        # Check all interfaces
        if len(net_connections) != len(prefixes.get("net_interface", set())):
            raise RADLParseException("Some net_interface does not have a connection")

        return True
Check the features in this system.