On 03/11/2017 10:14 PM, Laine Stump wrote:
> On 03/10/2017 04:10 PM, John Ferlan wrote:
>> Rather than have lots of ugly inline code create helpers to try and
>> make things more readable. While creating the helpers realign the code
>> as necessary.
> 
> [same opinionated commentary about this being semi-pointless code churn :-P]
> 
>>
>> Signed-off-by: John Ferlan <[email protected]>
>> ---
>>  src/conf/storage_adapter_conf.c | 239 
>> +++++++++++++++++++++++-----------------
>>  1 file changed, 138 insertions(+), 101 deletions(-)
>>
>> diff --git a/src/conf/storage_adapter_conf.c 
>> b/src/conf/storage_adapter_conf.c
>> index a2d4a3a..a361c34 100644
>> --- a/src/conf/storage_adapter_conf.c
>> +++ b/src/conf/storage_adapter_conf.c
>> @@ -52,12 +52,11 @@ 
>> virStorageAdapterFCHostClear(virStoragePoolSourceAdapterPtr adapter)
>>  void
>>  virStorageAdapterClear(virStoragePoolSourceAdapterPtr adapter)
>>  {
>> -    if (adapter->type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST) {
>> +    if (adapter->type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST)
>>          virStorageAdapterFCHostClear(adapter);
>> -    } else if (adapter->type ==
>> -               VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST) {
>> +
>> +    if (adapter->type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST)
>>          VIR_FREE(adapter->data.scsi_host.name);
> 
> That works fine as long as virStorageAdapterFCHostClear() doesn't modify 
> adapter->type ;-) Yeah, I'm sure it doesn't and that it never will. I just 
> wanted to point out the theoretical danger of changing the logic of code just 
> to make a line shorter so you can eliminate the braces :-P
> 

True... Of course this could become a switch too right?

>> -    }
>>  }
>>  
>>  
>> @@ -95,6 +94,83 @@ virStorageAdapterFCHostParseXML(xmlNodePtr node,
>>  }
>>  
>>  
>> +static int
>> +virStorageAdapterSCSIHostParseXML(xmlNodePtr node,
>> +                                  xmlXPathContextPtr ctxt,
>> +                                  virStoragePoolSourcePtr source)
> 
> This should take a virStoragePoolSourceAdapterPtr (since "scsi" is an 
> anonymous struct inside and anonymous union inside .... [see Path 07/18].
> 

As you found out - that was later.

>> +{
>> +    source->adapter.data.scsi_host.name =
>> +        virXMLPropString(node, "name");
>> +    if (virXPathNode("./parentaddr", ctxt)) {
>> +        xmlNodePtr addrnode = virXPathNode("./parentaddr/address", ctxt);
>> +        virPCIDeviceAddressPtr addr =
>> +            &source->adapter.data.scsi_host.parentaddr;
>> +
>> +        if (!addrnode) {
>> +            virReportError(VIR_ERR_XML_ERROR, "%s",
>> +                           _("Missing scsi_host PCI address element"));
>> +            return -1;
>> +        }
>> +        source->adapter.data.scsi_host.has_parent = true;
>> +        if (virPCIDeviceAddressParseXML(addrnode, addr) < 0)
>> +            return -1;
>> +        if ((virXPathInt("string(./parentaddr/@unique_id)",
>> +                         ctxt,
>> +                         &source->adapter.data.scsi_host.unique_id) < 0) ||
>> +            (source->adapter.data.scsi_host.unique_id < 0)) {
>> +            virReportError(VIR_ERR_XML_ERROR, "%s",
>> +                           _("Missing or invalid scsi adapter "
>> +                             "'unique_id' value"));
>> +            return -1;
>> +        }
>> +    }
>> +
>> +    return 0;
>> +}
>> +
>> +
>> +static int
>> +virStorageAdapterLegacyParseXML(xmlNodePtr node,
> 
> ?Legacy?
> 

Well the "old" format for SCSI parsed only "name" - I had no better idea
other than legacy

>> +                                xmlXPathContextPtr ctxt,
>> +                                virStoragePoolSourcePtr source)
> 
> Same.
> 
>> +{
>> +    char *wwnn = virXMLPropString(node, "wwnn");
>> +    char *wwpn = virXMLPropString(node, "wwpn");
>> +    char *parent = virXMLPropString(node, "parent");
>> +
>> +    /* "type" was not specified in the XML, so we must verify that
>> +     * "wwnn", "wwpn", "parent", or "parentaddr" are also not in the
>> +     * XML. If any are found, then we cannot just use "name" alone".
>> +     */
>> +    if (wwnn || wwpn || parent) {
>> +        VIR_FREE(wwnn);
>> +        VIR_FREE(wwpn);
>> +        VIR_FREE(parent);
>> +        virReportError(VIR_ERR_XML_ERROR, "%s",
>> +                       _("Use of 'wwnn', 'wwpn', and 'parent' attributes "
>> +                         "requires use of the adapter 'type'"));
>> +        return -1;
>> +    }
>> +
>> +    if (virXPathNode("./parentaddr", ctxt)) {
>> +        virReportError(VIR_ERR_XML_ERROR, "%s",
>> +                       _("Use of 'parent' element requires use "
>> +                         "of the adapter 'type'"));
>> +        return -1;
>> +    }
>> +
>> +    /* To keep back-compat, 'type' is not required to specify
>> +     * for scsi_host adapter.
>> +     */
>> +    if ((source->adapter.data.scsi_host.name =
>> +         virXMLPropString(node, "name")))
>> +        source->adapter.type =
>> +            VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST;
>> +
>> +    return 0;
>> +}
>> +
>> +
>>  int
>>  virStorageAdapterParseXML(virStoragePoolSourcePtr source,
>>                            xmlNodePtr node,
>> @@ -121,68 +197,13 @@ virStorageAdapterParseXML(virStoragePoolSourcePtr 
>> source,
>>                  goto cleanup;
>>          } else if (source->adapter.type ==
>>                     VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST) {
>> +            if (virStorageAdapterSCSIHostParseXML(node, ctxt, source) < 0)
>> +                goto cleanup;
>>  
>> -            source->adapter.data.scsi_host.name =
>> -                virXMLPropString(node, "name");
>> -            if (virXPathNode("./parentaddr", ctxt)) {
>> -                xmlNodePtr addrnode = virXPathNode("./parentaddr/address",
>> -                                                   ctxt);
>> -                virPCIDeviceAddressPtr addr =
>> -                    &source->adapter.data.scsi_host.parentaddr;
>> -
>> -                if (!addrnode) {
>> -                    virReportError(VIR_ERR_XML_ERROR, "%s",
>> -                                   _("Missing scsi_host PCI address 
>> element"));
>> -                    goto cleanup;
>> -                }
>> -                source->adapter.data.scsi_host.has_parent = true;
>> -                if (virPCIDeviceAddressParseXML(addrnode, addr) < 0)
>> -                    goto cleanup;
>> -                if ((virXPathInt("string(./parentaddr/@unique_id)",
>> -                                 ctxt,
>> -                                 &source->adapter.data.scsi_host.unique_id) 
>> < 0) ||
>> -                    (source->adapter.data.scsi_host.unique_id < 0)) {
>> -                    virReportError(VIR_ERR_XML_ERROR, "%s",
>> -                                   _("Missing or invalid scsi adapter "
>> -                                     "'unique_id' value"));
>> -                    goto cleanup;
>> -                }
>> -            }
>>          }
>>      } else {
>> -        char *wwnn = virXMLPropString(node, "wwnn");
>> -        char *wwpn = virXMLPropString(node, "wwpn");
>> -        char *parent = virXMLPropString(node, "parent");
>> -
>> -        /* "type" was not specified in the XML, so we must verify that
>> -         * "wwnn", "wwpn", "parent", or "parentaddr" are also not in the
>> -         * XML. If any are found, then we cannot just use "name" alone".
>> -         */
>> -
>> -        if (wwnn || wwpn || parent) {
>> -            VIR_FREE(wwnn);
>> -            VIR_FREE(wwpn);
>> -            VIR_FREE(parent);
>> -            virReportError(VIR_ERR_XML_ERROR, "%s",
>> -                           _("Use of 'wwnn', 'wwpn', and 'parent' 
>> attributes "
>> -                             "requires use of the adapter 'type'"));
>> +        if (virStorageAdapterLegacyParseXML(node, ctxt, source) < 0)
>>              goto cleanup;
>> -        }
>> -
>> -        if (virXPathNode("./parentaddr", ctxt)) {
>> -            virReportError(VIR_ERR_XML_ERROR, "%s",
>> -                           _("Use of 'parent' element requires use "
>> -                             "of the adapter 'type'"));
>> -            goto cleanup;
>> -        }
>> -
>> -        /* To keep back-compat, 'type' is not required to specify
>> -         * for scsi_host adapter.
>> -         */
>> -        if ((source->adapter.data.scsi_host.name =
>> -             virXMLPropString(node, "name")))
>> -            source->adapter.type =
>> -                VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST;
>>      }
>>  
>>      ret = 0;
>> @@ -235,6 +256,29 @@ 
>> virStorageAdapterFCHostParseValidate(virStoragePoolDefPtr ret)
>>  }
>>  
>>  
>> +static int
>> +virStorageAdapterSCSIHostParseValidate(virStoragePoolDefPtr ret)
> 
> Again with the "ParseValidate". I see validation, but I don't see any 
> parsing. (yeah, I know it's just because the calling function is named 
> virBlahParseValidate - that needs to be fixed too)
> 

Similar I'll modify to ValidateParse

John
> 
>> +{
>> +    if (!ret->source.adapter.data.scsi_host.name &&
>> +        !ret->source.adapter.data.scsi_host.has_parent) {
>> +        virReportError(VIR_ERR_XML_ERROR, "%s",
>> +                       _("Either 'name' or 'parent' must be specified "
>> +                         "for the 'scsi_host' adapter"));
>> +        return -1;
>> +    }
>> +
>> +    if (ret->source.adapter.data.scsi_host.name &&
>> +        ret->source.adapter.data.scsi_host.has_parent) {
>> +        virReportError(VIR_ERR_XML_ERROR, "%s",
>> +                       _("Both 'name' and 'parent' cannot be specified "
>> +                         "for the 'scsi_host' adapter"));
>> +        return -1;
>> +    }
>> +
>> +    return 0;
>> +}
>> +
>> +
>>  int
>>  virStorageAdapterParseValidate(virStoragePoolDefPtr ret)
>>  {
>> @@ -245,26 +289,12 @@ virStorageAdapterParseValidate(virStoragePoolDefPtr 
>> ret)
>>      }
>>  
>>      if (ret->source.adapter.type ==
>> -        VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST) {
>> +        VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST)
>>          return virStorageAdapterFCHostParseValidate(ret);
>> -    } else if (ret->source.adapter.type ==
>> -               VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST) {
>> -        if (!ret->source.adapter.data.scsi_host.name &&
>> -            !ret->source.adapter.data.scsi_host.has_parent) {
>> -            virReportError(VIR_ERR_XML_ERROR, "%s",
>> -                           _("Either 'name' or 'parent' must be specified "
>> -                             "for the 'scsi_host' adapter"));
>> -            return -1;
>> -        }
>>  
>> -        if (ret->source.adapter.data.scsi_host.name &&
>> -            ret->source.adapter.data.scsi_host.has_parent) {
>> -            virReportError(VIR_ERR_XML_ERROR, "%s",
>> -                           _("Both 'name' and 'parent' cannot be specified "
>> -                             "for the 'scsi_host' adapter"));
>> -            return -1;
>> -        }
>> -    }
>> +    if (ret->source.adapter.type ==
>> +        VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST)
>> +        return virStorageAdapterSCSIHostParseValidate(ret);
>>  
>>      return 0;
>>  }
>> @@ -292,6 +322,30 @@ virStorageAdapterFCHostFormat(virBufferPtr buf,
>>  }
>>  
>>  
>> +static void
>> +virStorageAdapterSCSIHostFormat(virBufferPtr buf,
>> +                                virStoragePoolSourcePtr src)
> 
> I didn't mention it for a couple of the functions up above, but in general 
> *all* of these need to change their arg to be as specific as possible (which 
> I guess is virStoragePoolSourceAdapterPtr)
> 
>> +{
>> +    if (src->adapter.data.scsi_host.name) {
>> +        virBufferAsprintf(buf, " name='%s'/>\n",
>> +                          src->adapter.data.scsi_host.name);
>> +    } else {
>> +        virPCIDeviceAddress addr;
>> +        virBufferAddLit(buf, ">\n");
>> +        virBufferAdjustIndent(buf, 2);
>> +        virBufferAsprintf(buf, "<parentaddr unique_id='%d'>\n",
>> +                          src->adapter.data.scsi_host.unique_id);
>> +        virBufferAdjustIndent(buf, 2);
>> +        addr = src->adapter.data.scsi_host.parentaddr;
>> +        ignore_value(virPCIDeviceAddressFormat(buf, addr, false));
>> +        virBufferAdjustIndent(buf, -2);
>> +        virBufferAddLit(buf, "</parentaddr>\n");
>> +        virBufferAdjustIndent(buf, -2);
>> +        virBufferAddLit(buf, "</adapter>\n");
>> +    }
>> +}
>> +
>> +
>>  void
>>  virStorageAdapterFormat(virBufferPtr buf,
>>                          virStoragePoolSourcePtr src)
>> @@ -299,26 +353,9 @@ virStorageAdapterFormat(virBufferPtr buf,
>>      virBufferAsprintf(buf, "<adapter type='%s'",
>>                        
>> virStoragePoolSourceAdapterTypeToString(src->adapter.type));
>>  
>> -    if (src->adapter.type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST) {
>> +    if (src->adapter.type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST)
>>          virStorageAdapterFCHostFormat(buf, src);
>> -    } else if (src->adapter.type ==
>> -               VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST) {
>> -        if (src->adapter.data.scsi_host.name) {
>> -            virBufferAsprintf(buf, " name='%s'/>\n",
>> -                              src->adapter.data.scsi_host.name);
>> -        } else {
>> -            virPCIDeviceAddress addr;
>> -            virBufferAddLit(buf, ">\n");
>> -            virBufferAdjustIndent(buf, 2);
>> -            virBufferAsprintf(buf, "<parentaddr unique_id='%d'>\n",
>> -                              src->adapter.data.scsi_host.unique_id);
>> -            virBufferAdjustIndent(buf, 2);
>> -            addr = src->adapter.data.scsi_host.parentaddr;
>> -            ignore_value(virPCIDeviceAddressFormat(buf, addr, false));
>> -            virBufferAdjustIndent(buf, -2);
>> -            virBufferAddLit(buf, "</parentaddr>\n");
>> -            virBufferAdjustIndent(buf, -2);
>> -            virBufferAddLit(buf, "</adapter>\n");
>> -        }
>> -    }
>> +
>> +    if (src->adapter.type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST)
>> +        virStorageAdapterSCSIHostFormat(buf, src);
>>  }
> 
> 
> I think this patch is okay if the args are changed to 
> virStoragePoolSourceAdapterPtr, "Parse" is removed from the Validate 
> function's name, and the use of "Legacy" in the one function is explained in 
> a comment.
> 
> 

--
libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to