'Connect the host and volume; return dict describing connection.'

def fc_initialize_connection(self, volume, connector, fss_hosts):

    vid = 0
    fc_target_info = {}
    free_fc_initiator = None
    volume_name = self._get_fss_volume_name(volume)
    vid = self._get_fss_vid_from_name(volume_name, FSS_SINGLE_TYPE)
    if (not vid):
        msg = (_('Can    not    find    cinder    volume    -    %s.') % volume_name)
        raise exception.VolumeBackendAPIException(msg)
    (available_initiator, fc_initiators_info) = self._get_fc_client_initiators(connector)
    if (fc_initiators_info is None):
        msg = _('No    FC    initiator    can    be    added    to    host.')
        LOG.error(msg)
        raise exception.VolumeBackendAPIException(data=msg)
    for fc_initiator in fc_initiators_info:
        value = fc_initiator['assigned']
        if (len(value) == 0):
            free_fc_initiator = fc_initiator['wwpn']
    if (free_fc_initiator is None):
        msg = _('No    free    FC    initiator    can    be    assigned    to    host.')
        LOG.error(msg)
        raise exception.VolumeBackendAPIException(data=msg)
    initiator = connector['initiator']
    host_name = (GROUP_PREFIX + ('%s-' % connector['host']))
    initiator_name = initiator.split(':')
    idx = (len(initiator_name) - 1)
    client_host_name = (((host_name + initiator_name[idx]) + '_FC-wwpn-') + free_fc_initiator)
    client_id = self.create_fc_client(client_host_name, free_fc_initiator)
    try:
        self.assign_fc_vdev(client_id, vid)
        time.sleep(3)
    except FSSHTTPError as err:
        with excutils.save_and_reraise_exception() as ctxt:
            if ((err.code == 2415984845) and ('XML_ERROR_CLIENT_EXIST' in err.text)):
                ctxt.reraise = False
            LOG.warning('Assign    volume    failed    with    message:    %(msg)s.', {'msg': err.reason})
    finally:
        lun = self.FSS._get_fc_client_info(client_id, vid)
        fc_target_info['lun'] = lun
        fc_target_info['available_initiator'] = available_initiator
    if (not fc_target_info):
        msg = _('Failed    to    get    iSCSI    target    info    for    the    LUN:    %s.')
        raise exception.VolumeBackendAPIException(data=(msg % volume_name))
    return fc_target_info
