2013-05-06 16:45:17 +04:00
/*
* Copyright ( C ) 2013 Red Hat , Inc .
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2.1 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library . If not , see
* < http : //www.gnu.org/licenses/>.
*
*/
# include <config.h>
2017-01-24 18:49:23 +03:00
# include "virlog.h"
2013-05-16 19:49:59 +04:00
# include "virstring.h"
2017-01-23 20:54:42 +03:00
# include "virvhba.h"
2013-05-06 16:45:17 +04:00
# include "testutils.h"
2013-06-07 19:10:28 +04:00
# define VIR_FROM_THIS VIR_FROM_NONE
2017-01-24 18:49:23 +03:00
VIR_LOG_INIT ( " tests.fchosttest " ) ;
2013-05-16 19:49:59 +04:00
static char * fchost_prefix ;
# define TEST_FC_HOST_PREFIX fchost_prefix
2013-05-06 16:45:17 +04:00
# define TEST_FC_HOST_NUM 5
2017-01-16 16:27:34 +03:00
# define TEST_FC_HOST_NUM_NO_FAB 6
2013-05-06 16:45:17 +04:00
2017-01-24 18:49:23 +03:00
/* virNodeDeviceCreateXML using "<parent>" to find the vport capable HBA */
static const char test7_xml [ ] =
" <device> "
" <parent>scsi_host1</parent> "
" <capability type='scsi_host'> "
" <capability type='fc_host'> "
" </capability> "
" </capability> "
" </device> " ;
2017-01-24 21:45:48 +03:00
/* virNodeDeviceCreateXML without "<parent>" to find the vport capable HBA */
static const char test8_xml [ ] =
" <device> "
" <capability type='scsi_host'> "
" <capability type='fc_host'> "
" </capability> "
" </capability> "
" </device> " ;
2017-01-24 21:49:35 +03:00
/* virNodeDeviceCreateXML using "<parent wwnn='%s' wwpn='%s'/>" to find
* the vport capable HBA */
static const char test9_xml [ ] =
" <device> "
" <parent wwnn='2000000012341234' wwpn='1000000012341234'/> "
" <capability type='scsi_host'> "
" <capability type='fc_host'> "
" </capability> "
" </capability> "
" </device> " ;
2017-01-24 21:53:08 +03:00
/* virNodeDeviceCreateXML using "<parent fabric_wwn='%s'/>" to find the
* vport capable HBA */
static const char test10_xml [ ] =
" <device> "
" <parent fabric_wwn='2000000043214321'/> "
" <capability type='scsi_host'> "
" <capability type='fc_host'> "
" </capability> "
" </capability> "
" </device> " ;
2017-01-29 19:12:48 +03:00
/* virStoragePoolCreateXML using parent='%s' to find the vport capable HBA */
static const char test11_xml [ ] =
" <pool type='scsi'> "
" <name>vhba_pool</name> "
" <source> "
" <adapter type='fc_host' parent='scsi_host1' wwnn='20000000c9831b4b' wwpn='10000000c9831b4b'/> "
" </source> "
" <target> "
" <path>/dev/disk/by-path</path> "
" </target> "
" </pool> " ;
2017-01-23 20:54:42 +03:00
/* Test virIsVHBACapable */
2013-05-06 16:45:17 +04:00
static int
2019-10-14 15:45:03 +03:00
test1 ( const void * data G_GNUC_UNUSED )
2013-05-06 16:45:17 +04:00
{
2017-01-23 20:54:42 +03:00
if ( virVHBAPathExists ( TEST_FC_HOST_PREFIX , TEST_FC_HOST_NUM ) & &
virVHBAPathExists ( TEST_FC_HOST_PREFIX , TEST_FC_HOST_NUM_NO_FAB ) )
2013-05-06 16:45:17 +04:00
return 0 ;
return - 1 ;
}
2017-01-23 20:54:42 +03:00
/* Test virVHBAIsVportCapable */
2013-05-06 16:45:17 +04:00
static int
2019-10-14 15:45:03 +03:00
test2 ( const void * data G_GNUC_UNUSED )
2013-05-06 16:45:17 +04:00
{
2017-01-23 20:54:42 +03:00
if ( virVHBAIsVportCapable ( TEST_FC_HOST_PREFIX , TEST_FC_HOST_NUM ) )
2013-05-06 16:45:17 +04:00
return 0 ;
return - 1 ;
}
2017-01-23 20:54:42 +03:00
/* Test virVHBAGetConfig */
2013-05-06 16:45:17 +04:00
static int
2019-10-14 15:45:03 +03:00
test3 ( const void * data G_GNUC_UNUSED )
2013-05-06 16:45:17 +04:00
{
const char * expect_wwnn = " 2001001b32a9da4e " ;
const char * expect_wwpn = " 2101001b32a9da4e " ;
const char * expect_fabric_wwn = " 2001000dec9877c1 " ;
const char * expect_max_vports = " 127 " ;
const char * expect_vports = " 0 " ;
char * wwnn = NULL ;
char * wwpn = NULL ;
char * fabric_wwn = NULL ;
char * max_vports = NULL ;
char * vports = NULL ;
int ret = - 1 ;
2017-01-23 20:54:42 +03:00
if ( ! ( wwnn = virVHBAGetConfig ( TEST_FC_HOST_PREFIX , TEST_FC_HOST_NUM ,
" node_name " ) ) )
2013-05-06 16:45:17 +04:00
return - 1 ;
2017-01-23 20:54:42 +03:00
if ( ! ( wwpn = virVHBAGetConfig ( TEST_FC_HOST_PREFIX , TEST_FC_HOST_NUM ,
" port_name " ) ) )
2013-05-06 16:45:17 +04:00
goto cleanup ;
2017-01-23 20:54:42 +03:00
if ( ! ( fabric_wwn = virVHBAGetConfig ( TEST_FC_HOST_PREFIX , TEST_FC_HOST_NUM ,
" fabric_name " ) ) )
2013-05-06 16:45:17 +04:00
goto cleanup ;
2017-01-23 20:54:42 +03:00
if ( ! ( max_vports = virVHBAGetConfig ( TEST_FC_HOST_PREFIX , TEST_FC_HOST_NUM ,
" max_npiv_vports " ) ) )
2013-05-06 16:45:17 +04:00
goto cleanup ;
2017-01-23 20:54:42 +03:00
if ( ! ( vports = virVHBAGetConfig ( TEST_FC_HOST_PREFIX , TEST_FC_HOST_NUM ,
" npiv_vports_inuse " ) ) )
2013-05-06 16:45:17 +04:00
goto cleanup ;
if ( STRNEQ ( expect_wwnn , wwnn ) | |
STRNEQ ( expect_wwpn , wwpn ) | |
STRNEQ ( expect_fabric_wwn , fabric_wwn ) | |
STRNEQ ( expect_max_vports , max_vports ) | |
STRNEQ ( expect_vports , vports ) )
goto cleanup ;
ret = 0 ;
2014-03-25 10:53:44 +04:00
cleanup :
2013-05-06 16:45:17 +04:00
VIR_FREE ( wwnn ) ;
VIR_FREE ( wwpn ) ;
VIR_FREE ( fabric_wwn ) ;
VIR_FREE ( max_vports ) ;
VIR_FREE ( vports ) ;
return ret ;
}
2017-01-23 20:54:42 +03:00
/* Test virVHBAGetHostByWWN */
2013-05-06 16:45:17 +04:00
static int
2019-10-14 15:45:03 +03:00
test4 ( const void * data G_GNUC_UNUSED )
2013-05-06 16:45:17 +04:00
{
const char * expect_hostname = " host5 " ;
char * hostname = NULL ;
int ret = - 1 ;
2017-01-23 20:54:42 +03:00
if ( ! ( hostname = virVHBAGetHostByWWN ( TEST_FC_HOST_PREFIX ,
" 2001001b32a9da4e " ,
" 2101001b32a9da4e " ) ) )
2013-05-06 16:45:17 +04:00
return - 1 ;
if ( STRNEQ ( hostname , expect_hostname ) )
goto cleanup ;
ret = 0 ;
2014-03-25 10:53:44 +04:00
cleanup :
2013-05-06 16:45:17 +04:00
VIR_FREE ( hostname ) ;
return ret ;
}
2017-01-23 20:54:42 +03:00
/* Test virVHBAFindVportHost
*
* NB : host4 is not Online , so it should not be found
*/
2013-05-06 16:45:17 +04:00
static int
2019-10-14 15:45:03 +03:00
test5 ( const void * data G_GNUC_UNUSED )
2013-05-06 16:45:17 +04:00
{
const char * expect_hostname = " host5 " ;
char * hostname = NULL ;
int ret = - 1 ;
2017-01-23 20:54:42 +03:00
if ( ! ( hostname = virVHBAFindVportHost ( TEST_FC_HOST_PREFIX ) ) )
2013-05-06 16:45:17 +04:00
return - 1 ;
if ( STRNEQ ( hostname , expect_hostname ) )
goto cleanup ;
ret = 0 ;
2014-03-25 10:53:44 +04:00
cleanup :
2013-05-06 16:45:17 +04:00
VIR_FREE ( hostname ) ;
return ret ;
}
2017-01-23 20:54:42 +03:00
/* Test virVHBAGetConfig fabric name optional */
2017-01-16 16:27:34 +03:00
static int
2019-10-14 15:45:03 +03:00
test6 ( const void * data G_GNUC_UNUSED )
2017-01-16 16:27:34 +03:00
{
const char * expect_wwnn = " 2002001b32a9da4e " ;
const char * expect_wwpn = " 2102001b32a9da4e " ;
char * wwnn = NULL ;
char * wwpn = NULL ;
2017-01-19 14:37:43 +03:00
char * fabric_wwn = NULL ;
2017-01-16 16:27:34 +03:00
int ret = - 1 ;
2017-01-23 20:54:42 +03:00
if ( ! ( wwnn = virVHBAGetConfig ( TEST_FC_HOST_PREFIX , TEST_FC_HOST_NUM_NO_FAB ,
" node_name " ) ) )
2017-01-16 16:27:34 +03:00
return - 1 ;
2017-01-23 20:54:42 +03:00
if ( ! ( wwpn = virVHBAGetConfig ( TEST_FC_HOST_PREFIX , TEST_FC_HOST_NUM_NO_FAB ,
" port_name " ) ) )
2017-01-16 16:27:34 +03:00
goto cleanup ;
2017-01-23 20:54:42 +03:00
if ( ( fabric_wwn = virVHBAGetConfig ( TEST_FC_HOST_PREFIX ,
TEST_FC_HOST_NUM_NO_FAB ,
" fabric_name " ) ) )
2017-01-16 16:27:34 +03:00
goto cleanup ;
if ( STRNEQ ( expect_wwnn , wwnn ) | |
STRNEQ ( expect_wwpn , wwpn ) )
goto cleanup ;
ret = 0 ;
cleanup :
VIR_FREE ( wwnn ) ;
VIR_FREE ( wwpn ) ;
2017-01-19 14:37:43 +03:00
VIR_FREE ( fabric_wwn ) ;
2017-01-16 16:27:34 +03:00
return ret ;
}
2017-01-24 18:49:23 +03:00
/* Test manageVHBAByNodeDevice
* - Test both virNodeDeviceCreateXML and virNodeDeviceDestroy
* - Create a node device vHBA allowing usage of various different
* methods based on the input data / xml argument .
* - Be sure that it ' s possible to destroy the node device as well .
*/
static int
manageVHBAByNodeDevice ( const void * data )
{
const char * expect_hostname = " scsi_host12 " ;
virConnectPtr conn = NULL ;
virNodeDevicePtr dev = NULL ;
int ret = - 1 ;
const char * vhba = data ;
if ( ! ( conn = virConnectOpen ( " test:///default " ) ) )
return - 1 ;
if ( ! ( dev = virNodeDeviceCreateXML ( conn , vhba , 0 ) ) )
goto cleanup ;
if ( virNodeDeviceDestroy ( dev ) < 0 )
goto cleanup ;
if ( STRNEQ ( virNodeDeviceGetName ( dev ) , expect_hostname ) ) {
virReportError ( VIR_ERR_INTERNAL_ERROR ,
" Expected hostname: '%s' got: '%s' " ,
expect_hostname , virNodeDeviceGetName ( dev ) ) ;
goto cleanup ;
}
ret = 0 ;
cleanup :
if ( dev )
virNodeDeviceFree ( dev ) ;
if ( conn )
virConnectClose ( conn ) ;
return ret ;
}
2017-01-29 19:12:48 +03:00
/* Test manageVHBAByStoragePool
* - Test both virStoragePoolCreateXML and virStoragePoolDestroy
* - Create a storage pool vHBA allowing usage of various different
* methods based on the input data / xml argument .
* - Be sure that it ' s possible to destroy the storage pool as well .
*/
static int
manageVHBAByStoragePool ( const void * data )
{
const char * expect_hostname = " scsi_host12 " ;
virConnectPtr conn = NULL ;
virStoragePoolPtr pool = NULL ;
virNodeDevicePtr dev = NULL ;
int ret = - 1 ;
const char * vhba = data ;
if ( ! ( conn = virConnectOpen ( " test:///default " ) ) )
return - 1 ;
if ( ! ( pool = virStoragePoolCreateXML ( conn , vhba , 0 ) ) )
goto cleanup ;
if ( ! ( dev = virNodeDeviceLookupByName ( conn , expect_hostname ) ) ) {
VIR_DEBUG ( " Failed to find expected_hostname '%s' " , expect_hostname ) ;
ignore_value ( virStoragePoolDestroy ( pool ) ) ;
goto cleanup ;
}
2017-04-09 14:28:07 +03:00
virNodeDeviceFree ( dev ) ;
2017-01-29 19:12:48 +03:00
if ( virStoragePoolDestroy ( pool ) < 0 )
goto cleanup ;
if ( ( dev = virNodeDeviceLookupByName ( conn , expect_hostname ) ) ) {
VIR_DEBUG ( " Found expected_hostname '%s' after destroy " ,
expect_hostname ) ;
2017-04-09 14:28:07 +03:00
virNodeDeviceFree ( dev ) ;
2017-01-29 19:12:48 +03:00
goto cleanup ;
}
ret = 0 ;
cleanup :
if ( pool )
virStoragePoolFree ( pool ) ;
if ( conn )
virConnectClose ( conn ) ;
return ret ;
}
2013-05-06 16:45:17 +04:00
static int
mymain ( void )
{
int ret = 0 ;
2019-10-22 16:26:14 +03:00
fchost_prefix = g_strdup_printf ( " %s/%s " , abs_srcdir , " fchostdata/fc_host/ " ) ;
2013-05-16 19:49:59 +04:00
2017-01-23 20:54:42 +03:00
if ( virTestRun ( " virVHBAPathExists " , test1 , NULL ) < 0 )
2013-05-06 16:45:17 +04:00
ret = - 1 ;
2017-01-23 20:54:42 +03:00
if ( virTestRun ( " virVHBAIsVportCapable " , test2 , NULL ) < 0 )
2013-05-06 16:45:17 +04:00
ret = - 1 ;
2017-01-23 20:54:42 +03:00
if ( virTestRun ( " virVHBAGetConfig " , test3 , NULL ) < 0 )
2013-05-06 16:45:17 +04:00
ret = - 1 ;
2017-01-23 20:54:42 +03:00
if ( virTestRun ( " virVHBAGetHostByWWN " , test4 , NULL ) < 0 )
2013-05-06 16:45:17 +04:00
ret = - 1 ;
2017-01-23 20:54:42 +03:00
if ( virTestRun ( " virVHBAFindVportHost " , test5 , NULL ) < 0 )
2013-05-06 16:45:17 +04:00
ret = - 1 ;
2017-01-23 20:54:42 +03:00
if ( virTestRun ( " virVHBAGetConfig-empty-fabric_wwn " , test6 , NULL ) < 0 )
2017-01-16 16:27:34 +03:00
ret = - 1 ;
2017-01-24 18:49:23 +03:00
if ( virTestRun ( " manageVHBAByNodeDevice-by-parent " , manageVHBAByNodeDevice ,
test7_xml ) < 0 )
ret = - 1 ;
2017-01-24 21:45:48 +03:00
if ( virTestRun ( " manageVHBAByNodeDevice-no-parent " , manageVHBAByNodeDevice ,
test8_xml ) < 0 )
ret = - 1 ;
2017-01-24 21:49:35 +03:00
if ( virTestRun ( " manageVHBAByNodeDevice-parent-wwn " , manageVHBAByNodeDevice ,
test9_xml ) < 0 )
ret = - 1 ;
2017-01-24 21:53:08 +03:00
if ( virTestRun ( " manageVHBAByNodeDevice-parent-fabric-wwn " ,
manageVHBAByNodeDevice , test10_xml ) < 0 )
ret = - 1 ;
2017-01-29 19:12:48 +03:00
if ( virTestRun ( " manageVHBAByStoragePool-by-parent " , manageVHBAByStoragePool ,
test11_xml ) < 0 )
ret = - 1 ;
2013-05-06 16:45:17 +04:00
2013-05-16 19:49:59 +04:00
VIR_FREE ( fchost_prefix ) ;
2013-05-06 16:45:17 +04:00
return ret ;
}
2019-08-21 19:13:16 +03:00
VIR_TEST_MAIN_PRELOAD ( mymain , VIR_TEST_MOCK ( " virrandom " ) )