
On 04/09/2013 06:40 AM, Wenchao Xia wrote:
Hi, John Sorry to interrupt but still need you to review this patch, which make it work more flex on different version. By the way, I got only 3 fail and they seems small problems in test suit's code, do you think it is ready to release 0.6.2(with this patch pushed)?
I don't have 'lldptool' installed on my system, so I cannot verify the output or the fix. What concerns me though is the reliance on something that could (and does) change between versions. What you have is just "two" versions of differences. What if there's a 3rd version that had/has something different? Is the output different on different archs/OS's? Is there no way to make the vsi_search_string be an array in the configuration file? Rather than two constant strings. I suppose what you have works, but it seems there has to be a better way to do this. I also think the comments in the .conf file could be beefed up so someone would know what to look for. Is that a specific field in the output or is that string what is returned. Essentially how would someone know what to look for in order to add a new/different string. Call this a "luke-warm" ACK. It works, but I think it's a shortcut. John
In RH6.4 lldptool query command and output changed a bit, to make it work on different version, the string used in search and options used in lldptool command should be set in configuration file.
Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com> --- libvirt-cim.conf | 12 ++++++++++++ libxkutil/misc_util.c | 27 +++++++++++++++++++++++++++ libxkutil/misc_util.h | 4 +++- src/Virt_SwitchService.c | 31 ++++++++++++++++++++++++------- 4 files changed, 66 insertions(+), 8 deletions(-)
diff --git a/libvirt-cim.conf b/libvirt-cim.conf index 37d7b0f..40fc94a 100644 --- a/libvirt-cim.conf +++ b/libvirt-cim.conf @@ -30,3 +30,15 @@ # Default value: NULL, that is not set. # # migrate_ssh_temp_key = "/root/vm_migrate_tmp_id_rsa"; + +# lldptool_query_options (string) +# Defines the command used in SwitchService to query VEPA support, will be +# used as "lldptool -i [INTERFACE] [OPTIONS]" +# +# lldptool_query_options = "-t -g ncb -V evbcfg"; + +# vsi_search_string (string) +# Defines the string used in SwitchService to search in lldptool's output +# +# vsi_search_string0 = "supported forwarding mode: (0x40) reflective relay"; +# vsi_search_string1 = "supported capabilities: (0x7) RTE ECP VDP"; diff --git a/libxkutil/misc_util.c b/libxkutil/misc_util.c index 00eb4b1..1a9a1b4 100644 --- a/libxkutil/misc_util.c +++ b/libxkutil/misc_util.c @@ -236,6 +236,33 @@ const char *get_mig_ssh_tmp_key(void) return prop.value_string; }
+const char *get_lldptool_query_options(void) +{ + static LibvirtcimConfigProperty prop = { + "lldptool_query_options", CONFIG_STRING, {0}, 0}; + + libvirt_cim_config_get(&prop); + return prop.value_string; +} + +const char *get_vsi_search_string0(void) +{ + static LibvirtcimConfigProperty prop = { + "vsi_search_string0", CONFIG_STRING, {0}, 0}; + + libvirt_cim_config_get(&prop); + return prop.value_string; +} + +const char *get_vsi_search_string1(void) +{ + static LibvirtcimConfigProperty prop = { + "vsi_search_string1", CONFIG_STRING, {0}, 0}; + + libvirt_cim_config_get(&prop); + return prop.value_string; +} + virConnectPtr connect_by_classname(const CMPIBroker *broker, const char *classname, CMPIStatus *s) diff --git a/libxkutil/misc_util.h b/libxkutil/misc_util.h index 0f52290..06a37cc 100644 --- a/libxkutil/misc_util.h +++ b/libxkutil/misc_util.h @@ -154,7 +154,9 @@ int virt_set_status(const CMPIBroker *broker,
/* get libvirt-cim config */ const char *get_mig_ssh_tmp_key(void); - +const char *get_lldptool_query_options(void); +const char *get_vsi_search_string0(void); +const char *get_vsi_search_string1(void); /* * Local Variables: * mode: C diff --git a/src/Virt_SwitchService.c b/src/Virt_SwitchService.c index 8991426..103f125 100644 --- a/src/Virt_SwitchService.c +++ b/src/Virt_SwitchService.c @@ -46,13 +46,24 @@ static CMPIStatus check_vsi_support(char *command) CMPIStatus s = {CMPI_RC_OK, NULL}; char buff[MAX_LEN]; FILE *stream = NULL; - const char *searchStr[] = {" supported forwarding mode: " - "(0x40) reflective relay", - " supported capabilities: " - "(0x07) RTE ECP VDP", - NULL}; + const char *string0 = get_vsi_search_string0(); + const char *string1 = get_vsi_search_string1(); + const char *searchStr[3]; int matched = 0;
+ if (!string0) { + string0 = " supported forwarding mode: " + "(0x40) reflective relay"; + } + if (!string1) { + string1 = " supported capabilities: " + "(0x7) RTE ECP VDP"; + } + CU_DEBUG("vsi searching for string [%s] [%s]", string0, string1); + searchStr[0] = string0; + searchStr[1] = string1; + searchStr[2] = NULL; + // Run lldptool command to find vsi support. stream = popen(command, "r"); if (stream == NULL) { @@ -214,6 +225,7 @@ static CMPIStatus get_switchservice(const CMPIObjectPath *reference, int i; char **if_list; char cmd[MAX_LEN]; + const char *lldptool_query_options = NULL;
*_inst = NULL; conn = connect_by_classname(broker, CLASSNAME(reference), &s); @@ -257,10 +269,15 @@ static CMPIStatus get_switchservice(const CMPIObjectPath *reference,
CU_DEBUG("Found %d interfaces", count);
+ lldptool_query_options = get_lldptool_query_options(); + if (!lldptool_query_options) { + lldptool_query_options = "-t -g ncb -V evbcfg"; + }
for (i=0; i<count; i++) { - sprintf(cmd, "lldptool -i %s -t -V evbcfg", if_list[i]); - CU_DEBUG("running command %s ...", cmd); + sprintf(cmd, "lldptool -i %s %s", + if_list[i], lldptool_query_options); + CU_DEBUG("running command [%s]", cmd); s = check_vsi_support(cmd); if (s.rc == CMPI_RC_OK) { vsi = true;