Ejemplo n.º 1
0
def recreate_xml_to_start(id, ssl=True):
    dict_domain = get_domain(id)

    xml = dict_domain['xml']
    x = DomainXML(xml)

    ##### actions to customize xml

    # spice password
    if ssl is True:
        x.reset_viewer_passwd()
    else:
        # only for test purposes, not use in production
        x.spice_remove_passwd_nossl()

    # redo network
    try:
        list_interfaces = dict_domain['create_dict']['hardware']['interfaces']
    except KeyError:
        list_interfaces = []
        log.info('domain {} withouth key interfaces in crate_dict'.format(id))

    mac_address = []
    for interface_index in range(len(x.vm_dict['interfaces'])):
        mac_address.append(x.vm_dict['interfaces'][interface_index]['mac'])
        x.remove_interface(order=interface_index)

    interface_index = 0

    for id_interface in list_interfaces:
        d_interface = get_interface(id_interface)

        x.add_interface(type=d_interface['kind'],
                        id=d_interface['ifname'],
                        model_type=d_interface['model'],
                        mac=mac_address[interface_index])

        interface_index += 1

    x.remove_selinux_options()

    #remove boot order in disk definition that conflict with /os/boot order in xml
    x.remove_boot_order_from_disks()

    x.dict_from_xml()
    # INFO TO DEVELOPER, OJO, PORQUE AQUI SE PIERDE EL BACKING CHAIN??
    update_domain_dict_hardware(id, x.vm_dict, xml=xml)
    if 'viewer_passwd' in x.__dict__.keys():
        update_domain_viewer_started_values(id, passwd=x.viewer_passwd)
        log.debug("updated viewer password {} in domain {}".format(x.viewer_passwd, id))

    xml = x.return_xml()
    # log.debug('#####################################################')
    # log.debug(xml)
    # log.debug('#####################################################')

    return xml
Ejemplo n.º 2
0
def myDomainEventCallbackRethink(conn, dom, event, detail, opaque):
    now = time.time()
    dom_id = dom.name()
    hyp_id = get_id_hyp_from_uri(conn.getURI())

    dict_event = {
        'domain': dom_id,
        'hyp_id': hyp_id,
        'event': domEventToString(event),
        'detail': domDetailToString(event, detail),
        'when': now
    }

    logs.status.debug("EVENT: {domain} - {event} ({detail}) - {hyp}".format(
        domain=dom_id,
        event=dict_event['event'],
        detail=dict_event['detail'],
        hyp=hyp_id))
    domain_status = get_domain_status(dom_id)
    if domain_status is not None:
        if hyp_id is None or hyp_id == '':
            logs.status.debug(
                'event in Hypervisor not in database with uri.  hyp_id:{}, uri:{}'
                .dom_id, conn.getURI())
        r_status = opaque

        if dict_event['event'] in ('Started', 'Resumed'):
            if domain_status == 'StartingDomainDisposable' and dict_event[
                    'event'] == 'Resumed':
                logs.status.debug(
                    'Event Resumed Received but waiting for Started')

            elif domain_status == 'CreatingDomain' and dict_event[
                    'event'] == 'Started':
                logs.status.debug(
                    'Event Started Received but waiting for Paused')

            elif domain_status == 'Stopped' and dict_event[
                    'event'] == 'Resumed':
                logs.status.debug(
                    'Event Resumed Received but waiting for Paused to update status in database'
                )

            elif domain_status == 'Started' and dict_event[
                    'event'] == 'Resumed':
                logs.status.debug(
                    'Event Resumed Received but is state is started in database'
                )

            else:
                try:
                    xml_started = dom.XMLDesc()
                    vm = DomainXML(xml_started)
                    spice, spice_tls, vnc, vnc_websocket = vm.get_graphics_port(
                    )
                    update_domain_viewer_started_values(
                        dom_id,
                        hyp_id=hyp_id,
                        spice=spice,
                        spice_tls=spice_tls,
                        vnc=vnc,
                        vnc_websocket=vnc_websocket)
                    logs.status.info(
                        f'DOMAIN STARTED - {dom_id} in {hyp_id} (spice: {spice} / spicetls:{spice_tls} / vnc: {vnc} / vnc_websocket: {vnc_websocket})'
                    )
                    update_domain_status(id_domain=dom_id,
                                         status=domEventToString(event),
                                         hyp_id=hyp_id,
                                         detail="Event received: " +
                                         domDetailToString(event, detail))
                except Exception as e:
                    logs.status.debug(
                        'Domain {} has been destroyed while event started is processing, typical if try domain with starting paused and destroyed'
                        .format(dom_id))
                    logs.status.debug('Exception: ' + str(e))

        if dict_event['event'] in ('Suspended'):
            if domain_status == 'CreatingDomain' and dict_event[
                    'event'] == 'Suspended':
                logs.status.debug(
                    'Event Paused Received but waiting for Stoped to update status'
                )
            else:
                update_domain_status(id_domain=dom_id,
                                     status='Paused',
                                     hyp_id=hyp_id,
                                     detail="Event received: " +
                                     domDetailToString(event, detail))

        if dict_event['event'] in ('Stopped', 'Shutdown'):
            remove_domain_viewer_values(dom_id)
            if get_domain_status(dict_event['domain']) != 'Stopped':
                logs.status.debug(
                    'event {} ({}) in hypervisor {} changes status to Stopped in domain {}'
                    .format(dict_event['event'], dict_event['detail'], hyp_id,
                            dict_event['domain']))

                update_domain_status(status='Stopped',
                                     id_domain=dict_event['domain'],
                                     hyp_id=False,
                                     detail='Ready to Start')

        r_status.insert_event_in_db(dict_event)
        if dict_event['event'] in (
                "Defined",
                "Undefined",
                # "Started",
                # "Suspended",
                # "Resumed",
                # "Stopped",
                # "Shutdown",
                "PMSuspended",
                "Crashed"):

            logs.status.error(
                'event strange, why?? event: {}, domain: {}, hyp_id: {}, detail: {}'
                .format(dict_event['event'], dict_event['domain'], hyp_id,
                        dict_event['detail']))

    else:
        logs.status.info(
            'domain {} launch event in hyervisor {}, but id_domain is not in database'
            .format(dom_id, hyp_id))
        logs.status.info('event: {}; detail: {}'.format(
            domEventToString(event), domDetailToString(event, detail)))
Ejemplo n.º 3
0
def myDomainEventCallbackRethink(conn, dom, event, detail, opaque):
    now = time.time()
    dom_id = dom.name()
    hyp_id = get_id_hyp_from_uri(conn.getURI())

    dict_event = {'domain': dom_id,
                  'hyp_id': hyp_id,
                  'event' : domEventToString(event),
                  'detail': domDetailToString(event, detail),
                  'when'  : now}

    logs.status.debug("EVENT: {domain} - {event} ({detail}) - {hyp}".format(domain=dom_id,
                                                                            event=dict_event['event'],
                                                                            detail=dict_event['detail'],
                                                                            hyp=hyp_id
                                                                            ))
    domain_status = get_domain_status(dom_id)
    if domain_status is not None:
        if hyp_id is None or hyp_id == '':
            logs.status.debug('event in Hypervisor not in database with uri.  hyp_id:{}, uri:{}'.dom_id, conn.getURI())
        r_status = opaque

        if dict_event['event'] in ('Started', 'Resumed'):
            if domain_status == 'StartingDomainDisposable' and dict_event['event'] == 'Resumed':
                logs.status.debug('Event Resumed Received but waiting for Started')

            elif domain_status == 'CreatingDomain' and dict_event['event'] == 'Started':
                logs.status.debug('Event Started Received but waiting for Paused')

            elif domain_status == 'Stopped' and dict_event['event'] == 'Resumed':
                logs.status.debug('Event Resumed Received but waiting for Paused to update status in database')

            elif domain_status == 'Started' and dict_event['event'] == 'Resumed':
                logs.status.debug('Event Resumed Received but is state is started in database')

            else:
                try:
                    xml_started = dom.XMLDesc()
                    vm = DomainXML(xml_started)
                    spice, spice_tls, vnc, vnc_websocket = vm.get_graphics_port()
                    update_domain_viewer_started_values(dom_id, hyp_id=hyp_id,
                                                        spice=spice, spice_tls=spice_tls,
                                                        vnc = vnc,vnc_websocket=vnc_websocket)
                    logs.status.info(f'DOMAIN STARTED - {dom_id} in {hyp_id} (spice: {spice} / spicetls:{spice_tls} / vnc: {vnc} / vnc_websocket: {vnc_websocket})')
                    update_domain_status(id_domain=dom_id,
                                         status=domEventToString(event),
                                         hyp_id=hyp_id,
                                         detail="Event received: " + domDetailToString(event, detail)
                                         )
                except Exception as e:
                    logs.status.debug(
                        'Domain {} has been destroyed while event started is processing, typical if try domain with starting paused and destroyed'.format(
                            dom_id))
                    logs.status.debug('Exception: ' + str(e))

        if dict_event['event'] in ('Suspended'):
            if domain_status == 'CreatingDomain' and dict_event['event'] == 'Suspended':
                logs.status.debug('Event Paused Received but waiting for Stoped to update status')
            else:
                update_domain_status(id_domain=dom_id,
                                     status='Paused',
                                     hyp_id=hyp_id,
                                     detail="Event received: " + domDetailToString(event, detail)
                                     )

        if dict_event['event'] in ('Stopped', 'Shutdown'):
            remove_domain_viewer_values(dom_id)
            if get_domain_status(dict_event['domain']) != 'Stopped':
                logs.status.debug('event {} ({}) in hypervisor {} changes status to Stopped in domain {}'.format(
                    dict_event['event'],
                    dict_event['detail'],
                    hyp_id,
                    dict_event['domain']
                ))

                update_domain_status(status='Stopped', id_domain=dict_event['domain'], hyp_id=False,
                                     detail='Ready to Start')

        r_status.insert_event_in_db(dict_event)
        if dict_event['event'] in (
                "Defined",
                "Undefined",
                # "Started",
                # "Suspended",
                # "Resumed",
                # "Stopped",
                # "Shutdown",
                "PMSuspended",
                "Crashed"
        ):


            logs.status.error('event strange, why?? event: {}, domain: {}, hyp_id: {}, detail: {}'.format(
                dict_event['event'],
                dict_event['domain'],
                hyp_id,
                dict_event['detail']
            ))

    else:
        logs.status.info('domain {} launch event in hyervisor {}, but id_domain is not in database'.format(dom_id, hyp_id))
        logs.status.info('event: {}; detail: {}'.format(domEventToString(event), domDetailToString(event, detail)))
Ejemplo n.º 4
0
def recreate_xml_to_start(id, ssl=True, cpu_host_model=False):
    dict_domain = get_domain(id)

    xml = dict_domain['xml']
    x = DomainXML(xml)
    if x.parser is False:
        #error when parsing xml
        return False

    ##### actions to customize xml

    if dict_domain.get('not_change_cpu_section',False) is False:
        x.set_cpu_host_model(cpu_host_model)


    # spice password
    x.add_spice_graphics_if_not_exist()

    if ssl is True:
        #recreate random password in x.viewer_passwd
        x.reset_viewer_passwd()
    else:
        # only for test purposes, not use in production
        x.spice_remove_passwd_nossl()

    #add vlc access
    x.add_vlc_with_websockets()

    # redo network
    try:
        list_interfaces = dict_domain['create_dict']['hardware']['interfaces']
    except KeyError:
        list_interfaces = []
        log.info('domain {} withouth key interfaces in create_dict'.format(id))

    mac_address = []
    for interface_index in range(len(x.vm_dict['interfaces'])):
        mac_address.append(x.vm_dict['interfaces'][interface_index]['mac'])
        x.remove_interface(order=interface_index)

    interface_index = 0

    for id_interface in list_interfaces:
        d_interface = get_interface(id_interface)

        x.add_interface(type=d_interface['kind'],
                        id=d_interface['ifname'],
                        model_type=d_interface['model'],
                        mac=mac_address[interface_index])

        interface_index += 1

    x.remove_selinux_options()

    #remove boot order in disk definition that conflict with /os/boot order in xml
    x.remove_boot_order_from_disks()

    x.dict_from_xml()
    # INFO TO DEVELOPER, OJO, PORQUE AQUI SE PIERDE EL BACKING CHAIN??
    update_domain_dict_hardware(id, x.vm_dict, xml=xml)
    if 'viewer_passwd' in x.__dict__.keys():
        #update password in database
        update_domain_viewer_started_values(id, passwd=x.viewer_passwd)
        log.debug("updated viewer password {} in domain {}".format(x.viewer_passwd, id))

    xml = x.return_xml()
    # log.debug('#####################################################')
    # log.debug(xml)
    # log.debug('#####################################################')

    return xml
Ejemplo n.º 5
0
def recreate_xml_to_start(id, ssl=True, cpu_host_model=False):
    dict_domain = get_domain(id)

    xml = dict_domain['xml']
    x = DomainXML(xml)
    if x.parser is False:
        #error when parsing xml
        return False

    ##### actions to customize xml

    if dict_domain.get('not_change_cpu_section', False) is False:
        x.set_cpu_host_model(cpu_host_model)

    # spice video compression
    #x.add_spice_graphics_if_not_exist()
    x.set_spice_video_options()

    # spice password
    if ssl is True:
        #recreate random password in x.viewer_passwd
        x.reset_viewer_passwd()
    else:
        # only for test purposes, not use in production
        x.spice_remove_passwd_nossl()

    #add vlc access
    x.add_vlc_with_websockets()

    # redo network
    try:
        list_interfaces = dict_domain['create_dict']['hardware']['interfaces']
    except KeyError:
        list_interfaces = []
        log.info('domain {} withouth key interfaces in create_dict'.format(id))

    mac_address = []
    for interface_index in range(len(x.vm_dict['interfaces'])):
        mac_address.append(x.vm_dict['interfaces'][interface_index]['mac'])
        x.remove_interface(order=interface_index)

    interface_index = 0

    for id_interface in list_interfaces:
        d_interface = get_interface(id_interface)

        x.add_interface(type=d_interface['kind'],
                        id=d_interface['ifname'],
                        model_type=d_interface['model'],
                        mac=mac_address[interface_index])

        interface_index += 1

    x.remove_selinux_options()

    #remove boot order in disk definition that conflict with /os/boot order in xml
    x.remove_boot_order_from_disks()

    x.dict_from_xml()
    # INFO TO DEVELOPER, OJO, PORQUE AQUI SE PIERDE EL BACKING CHAIN??
    update_domain_dict_hardware(id, x.vm_dict, xml=xml)
    if 'viewer_passwd' in x.__dict__.keys():
        #update password in database
        update_domain_viewer_started_values(id, passwd=x.viewer_passwd)
        log.debug("updated viewer password {} in domain {}".format(
            x.viewer_passwd, id))

    xml = x.return_xml()
    # log.debug('#####################################################')
    # log.debug(xml)
    # log.debug('#####################################################')

    return xml