#!/usr/bin/python3
import json
import logging

import hooking
from xml.dom import minidom
from vdsm.network import cmd


BRIDGE_NAME = 'br-int'
PROVIDER_TYPE_KEY = 'provider_type'
PMP = 'portid_colon_mirrorid_pair'
PROVIDER_TYPE = 'EXTERNAL_NETWORK'
PLUGIN_TYPE_KEY = 'plugin_type'
PLUGIN_TYPE_OVN = 'OVIRT_PROVIDER_OVN'
VNIC_ID_KEY = 'vnic_id'
OVS_VSCTL = '/usr/bin/ovs-vsctl'


def main():
    portid_mirrorid_pair = get_portid_mirrorid_pair()

    if not portid_mirrorid_pair:
        return

    interface_by_portid = get_ovs_interface_by_portid(portid_mirrorid_pair)
    if not interface_by_portid:
        return

    jdata = json.loads(interface_by_portid)
    jdata_data = jdata.get('data')
    if not jdata_data:
        return

    try:
        iface_uuid = jdata['data'][0][0][1]
    except IndexError:
        logging.log("ovn hook mirror iface_uuid index error")

    set_mirrorid_to_interface(iface_uuid, portid_mirrorid_pair)


def get_ovs_interface_by_portid(resultpm):
    puuid = resultpm.split(':')[0]
    command = [
        '/usr/bin/sudo',
        '-n',
        '/usr/bin/ovs-vsctl',
        '-f',
        'json',
        '--columns=_uuid,external-ids',
        'find',
        'Interface',
        'external_ids:iface-id=' + puuid,
    ]

    returnCode, out, err = cmd.exec_sync(command)
    return out


def set_mirrorid_to_interface(iface_uuid, resultpm):
    mirror_id = resultpm.split(':')[1]
    command = [
        '/usr/bin/sudo',
        '-n',
        '/usr/bin/ovs-vsctl',
        'add',
        'Interface',
        iface_uuid,
        'external_ids',
        'mirror-id=' + mirror_id,
    ]
    returnCode, out, err = cmd.exec_sync(command)


def get_portid_mirrorid_pair():
    domxml = hooking.read_domxml()
    minidomxml = minidom.parseString(domxml.toxml())
    metadata = minidomxml.getElementsByTagName("metadata")
    ovirt_vm_vm = metadata[0].getElementsByTagName("ovirt-vm:vm")
    ovirt_vm_custom = ovirt_vm_vm[0].getElementsByTagName("ovirt-vm:custom")
    resultmp_data = None
    for mp in ovirt_vm_custom:
        rmp = mp.getElementsByTagName("ovirt-vm:portid_colon_mirrorid_pair")
        for r in rmp:
            resultmp_data = r.firstChild.data
    return resultmp_data


if __name__ == '__main__':
    main()
