← Back to team overview

yahoo-eng-team team mailing list archive

[Bug 1429581] [NEW] [VMware] Failed to attach volume due to wrong host iqn

 

Public bug reported:

Attaching iSCSI volumes for VMware, using the following steps:
1.Nova gets volume connector information(get_volume_connector), such as ESX iqn;
2.Calling the cinder-volume initialize_connection, and will register the iqn of the ESX to the iSCSI server.It returns the connection information in the final, such as the iSCSI target;
3.Nova attaches the volume to the VM with the connection_info.

I try to attach an iSCSI volume to an instance, but it's failed in the 3rd step(unable to attach the volume to the VM).
After analyzing the logs, I found the reason for it is the iqn 1th step returning was wrong.

My environment:
My vcenter cluster has two host: ESX-1 and ESX-2, and an instance (VM-2) on the host ESX-2.
I try to attach an iSCSI volume to VM-2, I have found that it returns the iqn of ESX-1 while calling method get_volume_connector, I think it should return the iqn of the host running the VM (that is, ESX-2 iqn), rather than first host iqn, But it always returns the first ESX iqn, as in the following code.


vmwareapi/volumeutils.py:

    def get_volume_connector(self, instance):
        """Return volume connector information."""
        try:
            vm_ref = vm_util.get_vm_ref(self._session, instance)
        except exception.InstanceNotFound:
            vm_ref = None
        iqn = self._iscsi_get_host_iqn()
        connector = {'ip': CONF.vmware.host_ip,
                     'initiator': iqn,
                     'host': CONF.vmware.host_ip}
        if vm_ref:
            connector['instance'] = vm_ref.value
        return connector

    def _iscsi_get_host_iqn(self):
        """Return the host iSCSI IQN."""
        host_mor = vm_util.get_host_ref(self._session, self._cluster)
        hbas_ret = self._session._call_method(
            vim_util, "get_dynamic_property",
            host_mor, "HostSystem",
            "config.storageDevice.hostBusAdapter")

        # Meaning there are no host bus adapters on the host
        if hbas_ret is None:
            return
        host_hbas = hbas_ret.HostHostBusAdapter
        if not host_hbas:
            return
        for hba in host_hbas:
            if hba.__class__.__name__ == 'HostInternetScsiHba':
                return hba.iScsiName


vmwareapi/vm_util.py:

def get_host_ref(session, cluster=None):
    """Get reference to a host within the cluster specified."""
    if cluster is None:
        results = session._call_method(vim_util, "get_objects",
                                       "HostSystem")
        _cancel_retrieve_if_necessary(session, results)
        host_mor = results.objects[0].obj
    else:
        host_ret = session._call_method(vim_util, "get_dynamic_property",
                                        cluster, "ClusterComputeResource",
                                        "host")
        if not host_ret or not host_ret.ManagedObjectReference:
            msg = _('No host available on cluster')
            raise exception.NoValidHost(reason=msg)
        host_mor = host_ret.ManagedObjectReference[0]

    return host_mor

** Affects: nova
     Importance: Undecided
     Assignee: javeme (javaloveme)
         Status: New


** Tags: vmware

** Changed in: nova
     Assignee: (unassigned) => javeme (javaloveme)

-- 
You received this bug notification because you are a member of Yahoo!
Engineering Team, which is subscribed to OpenStack Compute (nova).
https://bugs.launchpad.net/bugs/1429581

Title:
  [VMware] Failed to attach volume due to wrong host iqn

Status in OpenStack Compute (Nova):
  New

Bug description:
  Attaching iSCSI volumes for VMware, using the following steps:
  1.Nova gets volume connector information(get_volume_connector), such as ESX iqn;
  2.Calling the cinder-volume initialize_connection, and will register the iqn of the ESX to the iSCSI server.It returns the connection information in the final, such as the iSCSI target;
  3.Nova attaches the volume to the VM with the connection_info.

  I try to attach an iSCSI volume to an instance, but it's failed in the 3rd step(unable to attach the volume to the VM).
  After analyzing the logs, I found the reason for it is the iqn 1th step returning was wrong.

  My environment:
  My vcenter cluster has two host: ESX-1 and ESX-2, and an instance (VM-2) on the host ESX-2.
  I try to attach an iSCSI volume to VM-2, I have found that it returns the iqn of ESX-1 while calling method get_volume_connector, I think it should return the iqn of the host running the VM (that is, ESX-2 iqn), rather than first host iqn, But it always returns the first ESX iqn, as in the following code.

  
  vmwareapi/volumeutils.py:

      def get_volume_connector(self, instance):
          """Return volume connector information."""
          try:
              vm_ref = vm_util.get_vm_ref(self._session, instance)
          except exception.InstanceNotFound:
              vm_ref = None
          iqn = self._iscsi_get_host_iqn()
          connector = {'ip': CONF.vmware.host_ip,
                       'initiator': iqn,
                       'host': CONF.vmware.host_ip}
          if vm_ref:
              connector['instance'] = vm_ref.value
          return connector

      def _iscsi_get_host_iqn(self):
          """Return the host iSCSI IQN."""
          host_mor = vm_util.get_host_ref(self._session, self._cluster)
          hbas_ret = self._session._call_method(
              vim_util, "get_dynamic_property",
              host_mor, "HostSystem",
              "config.storageDevice.hostBusAdapter")

          # Meaning there are no host bus adapters on the host
          if hbas_ret is None:
              return
          host_hbas = hbas_ret.HostHostBusAdapter
          if not host_hbas:
              return
          for hba in host_hbas:
              if hba.__class__.__name__ == 'HostInternetScsiHba':
                  return hba.iScsiName

  
  vmwareapi/vm_util.py:

  def get_host_ref(session, cluster=None):
      """Get reference to a host within the cluster specified."""
      if cluster is None:
          results = session._call_method(vim_util, "get_objects",
                                         "HostSystem")
          _cancel_retrieve_if_necessary(session, results)
          host_mor = results.objects[0].obj
      else:
          host_ret = session._call_method(vim_util, "get_dynamic_property",
                                          cluster, "ClusterComputeResource",
                                          "host")
          if not host_ret or not host_ret.ManagedObjectReference:
              msg = _('No host available on cluster')
              raise exception.NoValidHost(reason=msg)
          host_mor = host_ret.ManagedObjectReference[0]

      return host_mor

To manage notifications about this bug go to:
https://bugs.launchpad.net/nova/+bug/1429581/+subscriptions


Follow ups

References