コード例 #1
0
def migrate_compute_ports_vms(resource, event, trigger, **kwargs):
    """Update the VMs ports on the backend after migrating nsx-v -> nsx-v3

    After using api_replay to migrate the neutron data from NSX-V to NSX-T
    we need to update the VM ports to use OpaqueNetwork instead of
    DistributedVirtualPortgroup
    """
    # Connect to the DVS manager, using the configuration parameters
    try:
        vm_mng = dvs.VMManager()
    except Exception as e:
        LOG.error(
            "Cannot connect to the DVS: Please update the [dvs] "
            "section in the nsx.ini file: %s", e)
        return

    port_filters = {}
    if kwargs.get('property'):
        properties = admin_utils.parse_multi_keyval_opt(kwargs['property'])
        project = properties.get('project-id')
        if project:
            port_filters['project_id'] = [project]

    # Go over all the ports from the plugin
    admin_cxt = neutron_context.get_admin_context()
    with PortsPlugin() as plugin:
        neutron_ports = plugin.get_ports(admin_cxt, filters=port_filters)

    for port in neutron_ports:
        # skip non compute ports
        if (not port.get('device_owner').startswith(
                const.DEVICE_OWNER_COMPUTE_PREFIX)):
            continue
        device_id = port.get('device_id')

        # get the vm moref & spec from the DVS
        vm_moref = vm_mng.get_vm_moref_obj(device_id)
        vm_spec = vm_mng.get_vm_spec(vm_moref)
        if not vm_spec:
            LOG.error("Failed to get the spec of vm %s", device_id)
            continue

        # Go over the VM interfaces and check if it should be updated
        update_spec = False
        for prop in vm_spec.propSet:
            if (prop.name == 'network'
                    and hasattr(prop.val, 'ManagedObjectReference')):
                for net in prop.val.ManagedObjectReference:
                    if (net._type == 'DistributedVirtualPortgroup'
                            or net._type == 'Network'):
                        update_spec = True

        if not update_spec:
            LOG.info("No need to update the spec of vm %s", device_id)
            continue

        # find the old interface by it's mac and delete it
        device = get_vm_network_device(vm_mng, vm_moref, port['mac_address'])
        if device is None:
            LOG.warning("No device with MAC address %s exists on the VM",
                        port['mac_address'])
            continue
        device_type = device.__class__.__name__

        LOG.info("Detaching old interface from VM %s", device_id)
        vm_mng.detach_vm_interface(vm_moref, device)

        # add the new interface as OpaqueNetwork
        LOG.info("Attaching new interface to VM %s", device_id)
        nsx_net_id = get_network_nsx_id(admin_cxt.session, port['network_id'])
        vm_mng.attach_vm_interface(vm_moref, port['id'], port['mac_address'],
                                   nsx_net_id, device_type)
コード例 #2
0
ファイル: ports.py プロジェクト: linvictor88/vmware-nsx
def migrate_compute_ports_vms(resource, event, trigger, **kwargs):
    """Update the VMs ports on the backend after migrating nsx-v -> nsx-v3

    After using api_replay to migrate the neutron data from NSX-V to NSX-T
    we need to update the VM ports to use OpaqueNetwork instead of
    DistributedVirtualPortgroup
    """
    # Connect to the DVS manager, using the configuration parameters
    try:
        vm_mng = dvs.VMManager()
    except Exception as e:
        LOG.error(
            "Cannot connect to the DVS: Please update the [dvs] "
            "section in the nsx.ini file: %s", e)
        return

    port_filters = {}
    if kwargs.get('property'):
        properties = admin_utils.parse_multi_keyval_opt(kwargs['property'])
        project = properties.get('project-id')
        if project:
            port_filters['project_id'] = [project]
        net_name = properties.get('net-name', 'VM Network')
        LOG.info("Common network name for migration %s", net_name)
        host_moref = properties.get('host-moref')
        # TODO(garyk): We can explore the option of passing the cluster
        # moref then this will remove the need for the host-moref and the
        # resource pool moref.
        respool_moref = properties.get('respool-moref')
        datastore_moref = properties.get('datastore-moref')
        if not host_moref:
            LOG.error("Unable to migrate with no host")
            return

    # Go over all the ports from the plugin
    admin_cxt = neutron_context.get_admin_context()
    with PortsPlugin() as plugin:
        neutron_ports = plugin.get_ports(admin_cxt, filters=port_filters)

    for port in neutron_ports:
        # skip non compute ports
        if (not port.get('device_owner').startswith(
                const.DEVICE_OWNER_COMPUTE_PREFIX)):
            continue
        device_id = port.get('device_id')

        # get the vm moref & spec from the DVS
        vm_moref = vm_mng.get_vm_moref_obj(device_id)
        vm_spec = vm_mng.get_vm_spec(vm_moref)
        if not vm_spec:
            LOG.error("Failed to get the spec of vm %s", device_id)
            continue

        # Go over the VM interfaces and check if it should be updated
        update_spec = False
        for prop in vm_spec.propSet:
            if (prop.name == 'network'
                    and hasattr(prop.val, 'ManagedObjectReference')):
                for net in prop.val.ManagedObjectReference:
                    if (net._type == 'DistributedVirtualPortgroup'
                            or net._type == 'Network'):
                        update_spec = True

        if not update_spec:
            LOG.info("No need to update the spec of vm %s", device_id)
            continue

        device = get_vm_network_device(vm_mng, vm_moref, port['mac_address'])
        if device is None:
            LOG.warning("No device with MAC address %s exists on the VM",
                        port['mac_address'])
            continue

        # Update interface to be common network
        devices = [vm_mng.update_vm_network(device, name=net_name)]
        LOG.info("Update instance %s to common network", device_id)
        vm_mng.update_vm_interface(vm_moref, devices=devices)
        LOG.info("Migrate instance %s to host %s", device_id, host_moref)
        vm_mng.relocate_vm(vm_moref,
                           host_moref=host_moref,
                           datastore_moref=datastore_moref,
                           respool_moref=respool_moref)
        LOG.info("Update instance %s to opaque network", device_id)
        device = get_vm_network_device(vm_mng, vm_moref, port['mac_address'])
        vif_info = {
            'nsx_id': get_network_nsx_id(admin_cxt.session,
                                         port['network_id']),
            'iface_id': port['id']
        }
        devices = [vm_mng.update_vm_opaque_spec(vif_info, device)]
        vm_mng.update_vm_interface(vm_moref, devices=devices)
        LOG.info("Instance %s successfully migrated!", device_id)