Re: [libvirt] [PATCH v5 7/9] domain_conf: Read and Write quorum config

2015-06-04 Thread Matthias Gatto
On Tue, May 12, 2015 at 5:04 PM, Peter Krempa  wrote:
> On Thu, Apr 23, 2015 at 14:41:19 +0200, Matthias Gatto wrote:
>> Add the capabiltty to libvirt to parse and format the quorum syntax
>> as described here:
>> http://www.redhat.com/archives/libvir-list/2014-May/msg00533.html
>>
>> Signed-off-by: Matthias Gatto 
>> ---
>>  src/conf/domain_conf.c | 164 
>> +++--
>>  1 file changed, 119 insertions(+), 45 deletions(-)
>>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index a3a6c13..ec93b6f 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -5952,20 +5952,56 @@ virDomainDiskSourceParse(xmlNodePtr node,
>>  }
>>
>>
>> +static bool
>> +virDomainDiskThresholdParse(virStorageSourcePtr src,
>> +xmlNodePtr node)
>> +{
>> +char *threshold = virXMLPropString(node, "threshold");
>> +int ret;
>> +
>> +if (!threshold) {
>> +virReportError(VIR_ERR_XML_ERROR,
>> +   "%s", _("missing threshold in quorum"));
>> +return false;
>> +}
>> +ret = virStrToLong_ul(threshold, NULL, 10, &src->threshold);
>> +if (ret < 0 || src->threshold < 2) {
>> +virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> +   _("unexpected threshold %s"),
>> +   "threshold must be a decimal number superior to 2 "
>> + "and inferior to the number of children");
>> +VIR_FREE(threshold);
>> +return false;
>> +}
>> +VIR_FREE(threshold);
>> +return true;
>> +}
>> +
>> +
>>  static int
>>  virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt,
>> -   virStorageSourcePtr src)
>> +   virStorageSourcePtr src,
>> +   xmlNodePtr node,
>> +   size_t pos)
>>  {
>>  virStorageSourcePtr backingStore = NULL;
>>  xmlNodePtr save_ctxt = ctxt->node;
>> -xmlNodePtr source;
>> +xmlNodePtr source = NULL;
>>  char *type = NULL;
>>  char *format = NULL;
>>  int ret = -1;
>>
>> -if (!(ctxt->node = virXPathNode("./backingStore[*]", ctxt))) {
>> -ret = 0;
>> -goto cleanup;
>> +if (src->type == VIR_STORAGE_TYPE_QUORUM) {
>> +if (!node) {
>> +ret = 0;
>> +goto cleanup;
>> +}
>> +ctxt->node = node;
>> +} else {
>> +if (!(ctxt->node = virXPathNode("./backingStore[*]", ctxt))) {
>> +ret = 0;
>> +goto cleanup;
>> +}
>>  }
>>
>>  if (VIR_ALLOC(backingStore) < 0)
>> @@ -5997,6 +6033,25 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr 
>> ctxt,
>>  goto cleanup;
>>  }
>>
>> +if (backingStore->type == VIR_STORAGE_TYPE_QUORUM) {
>> +xmlNodePtr cur = NULL;
>> +
>> +if (!virDomainDiskThresholdParse(backingStore, node))
>> +goto cleanup;
>> +
>> +for (cur = node->children; cur != NULL; cur = cur->next) {
>> +if (xmlStrEqual(cur->name, BAD_CAST "backingStore")) {
>> +if ((virDomainDiskBackingStoreParse(ctxt,
>> +backingStore,
>> +cur,
>> +
>> backingStore->nBackingStores) < 0)) {
>> +goto cleanup;
>> +}
>> +}
>> +}
>> +goto exit;
>> +}
>> +
>>  if (!(source = virXPathNode("./source", ctxt))) {
>>  virReportError(VIR_ERR_XML_ERROR, "%s",
>> _("missing disk backing store source"));
>> @@ -6004,10 +6059,11 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr 
>> ctxt,
>>  }
>>
>>  if (virDomainDiskSourceParse(source, ctxt, backingStore) < 0 ||
>> -virDomainDiskBackingStoreParse(ctxt, backingStore) < 0)
>> +virDomainDiskBackingStoreParse(ctxt, backingStore, NULL, 0) < 0)
>>  goto cleanup;
>>
>> -if (!virStorageSourceSetBackingStore(src, backingStore, 0))
>> + exit:
>> +if (!virStorageSourceSetBackingStore(src, backingStore, pos))
>>  goto cleanup;
>>  ret = 0;
>>
>> @@ -6020,7 +6076,6 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt,
>>  return ret;
>>  }
>>
>> -
>>  #define VENDOR_LEN  8
>>  #define PRODUCT_LEN 16
>>
>> @@ -6518,6 +6573,10 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
>>  }
>>  } else if (xmlStrEqual(cur->name, BAD_CAST "boot")) {
>>  /* boot is parsed as part of virDomainDeviceInfoParseXML */
>> +} else if (xmlStrEqual(cur->name, BAD_CAST "backingStore")) {
>> +if (virDomainDiskBackingStoreParse(ctxt, def->src, cur,
>> +   
>> def->src->nBackingStores) < 0)
>> +goto error;
>>  }
>>  

Re: [libvirt] [PATCH v5 7/9] domain_conf: Read and Write quorum config

2015-05-12 Thread Peter Krempa
On Thu, Apr 23, 2015 at 14:41:19 +0200, Matthias Gatto wrote:
> Add the capabiltty to libvirt to parse and format the quorum syntax
> as described here:
> http://www.redhat.com/archives/libvir-list/2014-May/msg00533.html
> 
> Signed-off-by: Matthias Gatto 
> ---
>  src/conf/domain_conf.c | 164 
> +++--
>  1 file changed, 119 insertions(+), 45 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index a3a6c13..ec93b6f 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -5952,20 +5952,56 @@ virDomainDiskSourceParse(xmlNodePtr node,
>  }
>  
>  
> +static bool
> +virDomainDiskThresholdParse(virStorageSourcePtr src,
> +xmlNodePtr node)
> +{
> +char *threshold = virXMLPropString(node, "threshold");
> +int ret;
> +
> +if (!threshold) {
> +virReportError(VIR_ERR_XML_ERROR,
> +   "%s", _("missing threshold in quorum"));
> +return false;
> +}
> +ret = virStrToLong_ul(threshold, NULL, 10, &src->threshold);
> +if (ret < 0 || src->threshold < 2) {
> +virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +   _("unexpected threshold %s"),
> +   "threshold must be a decimal number superior to 2 "
> + "and inferior to the number of children");
> +VIR_FREE(threshold);
> +return false;
> +}
> +VIR_FREE(threshold);
> +return true;
> +}
> +
> +
>  static int
>  virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt,
> -   virStorageSourcePtr src)
> +   virStorageSourcePtr src,
> +   xmlNodePtr node,
> +   size_t pos)
>  {
>  virStorageSourcePtr backingStore = NULL;
>  xmlNodePtr save_ctxt = ctxt->node;
> -xmlNodePtr source;
> +xmlNodePtr source = NULL;
>  char *type = NULL;
>  char *format = NULL;
>  int ret = -1;
>  
> -if (!(ctxt->node = virXPathNode("./backingStore[*]", ctxt))) {
> -ret = 0;
> -goto cleanup;
> +if (src->type == VIR_STORAGE_TYPE_QUORUM) {
> +if (!node) {
> +ret = 0;
> +goto cleanup;
> +}
> +ctxt->node = node;
> +} else {
> +if (!(ctxt->node = virXPathNode("./backingStore[*]", ctxt))) {
> +ret = 0;
> +goto cleanup;
> +}
>  }
>  
>  if (VIR_ALLOC(backingStore) < 0)
> @@ -5997,6 +6033,25 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt,
>  goto cleanup;
>  }
>  
> +if (backingStore->type == VIR_STORAGE_TYPE_QUORUM) {
> +xmlNodePtr cur = NULL;
> +
> +if (!virDomainDiskThresholdParse(backingStore, node))
> +goto cleanup;
> +
> +for (cur = node->children; cur != NULL; cur = cur->next) {
> +if (xmlStrEqual(cur->name, BAD_CAST "backingStore")) {
> +if ((virDomainDiskBackingStoreParse(ctxt,
> +backingStore,
> +cur,
> +
> backingStore->nBackingStores) < 0)) {
> +goto cleanup;
> +}
> +}
> +}
> +goto exit;
> +}
> +
>  if (!(source = virXPathNode("./source", ctxt))) {
>  virReportError(VIR_ERR_XML_ERROR, "%s",
> _("missing disk backing store source"));
> @@ -6004,10 +6059,11 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr 
> ctxt,
>  }
>  
>  if (virDomainDiskSourceParse(source, ctxt, backingStore) < 0 ||
> -virDomainDiskBackingStoreParse(ctxt, backingStore) < 0)
> +virDomainDiskBackingStoreParse(ctxt, backingStore, NULL, 0) < 0)
>  goto cleanup;
>  
> -if (!virStorageSourceSetBackingStore(src, backingStore, 0))
> + exit:
> +if (!virStorageSourceSetBackingStore(src, backingStore, pos))
>  goto cleanup;
>  ret = 0;
>  
> @@ -6020,7 +6076,6 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt,
>  return ret;
>  }
>  
> -
>  #define VENDOR_LEN  8
>  #define PRODUCT_LEN 16
>  
> @@ -6518,6 +6573,10 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
>  }
>  } else if (xmlStrEqual(cur->name, BAD_CAST "boot")) {
>  /* boot is parsed as part of virDomainDeviceInfoParseXML */
> +} else if (xmlStrEqual(cur->name, BAD_CAST "backingStore")) {
> +if (virDomainDiskBackingStoreParse(ctxt, def->src, cur,
> +   def->src->nBackingStores) 
> < 0)
> +goto error;
>  }
>  }
>  cur = cur->next;
> @@ -6541,12 +6600,19 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
>  def->device = VIR_DOMAIN_DISK_DEVICE_DISK;
>  }
>

[libvirt] [PATCH v5 7/9] domain_conf: Read and Write quorum config

2015-04-23 Thread Matthias Gatto
Add the capabiltty to libvirt to parse and format the quorum syntax
as described here:
http://www.redhat.com/archives/libvir-list/2014-May/msg00533.html

Signed-off-by: Matthias Gatto 
---
 src/conf/domain_conf.c | 164 +++--
 1 file changed, 119 insertions(+), 45 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index a3a6c13..ec93b6f 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -5952,20 +5952,56 @@ virDomainDiskSourceParse(xmlNodePtr node,
 }
 
 
+static bool
+virDomainDiskThresholdParse(virStorageSourcePtr src,
+xmlNodePtr node)
+{
+char *threshold = virXMLPropString(node, "threshold");
+int ret;
+
+if (!threshold) {
+virReportError(VIR_ERR_XML_ERROR,
+   "%s", _("missing threshold in quorum"));
+return false;
+}
+ret = virStrToLong_ul(threshold, NULL, 10, &src->threshold);
+if (ret < 0 || src->threshold < 2) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _("unexpected threshold %s"),
+   "threshold must be a decimal number superior to 2 "
+ "and inferior to the number of children");
+VIR_FREE(threshold);
+return false;
+}
+VIR_FREE(threshold);
+return true;
+}
+
+
 static int
 virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt,
-   virStorageSourcePtr src)
+   virStorageSourcePtr src,
+   xmlNodePtr node,
+   size_t pos)
 {
 virStorageSourcePtr backingStore = NULL;
 xmlNodePtr save_ctxt = ctxt->node;
-xmlNodePtr source;
+xmlNodePtr source = NULL;
 char *type = NULL;
 char *format = NULL;
 int ret = -1;
 
-if (!(ctxt->node = virXPathNode("./backingStore[*]", ctxt))) {
-ret = 0;
-goto cleanup;
+if (src->type == VIR_STORAGE_TYPE_QUORUM) {
+if (!node) {
+ret = 0;
+goto cleanup;
+}
+ctxt->node = node;
+} else {
+if (!(ctxt->node = virXPathNode("./backingStore[*]", ctxt))) {
+ret = 0;
+goto cleanup;
+}
 }
 
 if (VIR_ALLOC(backingStore) < 0)
@@ -5997,6 +6033,25 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt,
 goto cleanup;
 }
 
+if (backingStore->type == VIR_STORAGE_TYPE_QUORUM) {
+xmlNodePtr cur = NULL;
+
+if (!virDomainDiskThresholdParse(backingStore, node))
+goto cleanup;
+
+for (cur = node->children; cur != NULL; cur = cur->next) {
+if (xmlStrEqual(cur->name, BAD_CAST "backingStore")) {
+if ((virDomainDiskBackingStoreParse(ctxt,
+backingStore,
+cur,
+
backingStore->nBackingStores) < 0)) {
+goto cleanup;
+}
+}
+}
+goto exit;
+}
+
 if (!(source = virXPathNode("./source", ctxt))) {
 virReportError(VIR_ERR_XML_ERROR, "%s",
_("missing disk backing store source"));
@@ -6004,10 +6059,11 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt,
 }
 
 if (virDomainDiskSourceParse(source, ctxt, backingStore) < 0 ||
-virDomainDiskBackingStoreParse(ctxt, backingStore) < 0)
+virDomainDiskBackingStoreParse(ctxt, backingStore, NULL, 0) < 0)
 goto cleanup;
 
-if (!virStorageSourceSetBackingStore(src, backingStore, 0))
+ exit:
+if (!virStorageSourceSetBackingStore(src, backingStore, pos))
 goto cleanup;
 ret = 0;
 
@@ -6020,7 +6076,6 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt,
 return ret;
 }
 
-
 #define VENDOR_LEN  8
 #define PRODUCT_LEN 16
 
@@ -6518,6 +6573,10 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
 }
 } else if (xmlStrEqual(cur->name, BAD_CAST "boot")) {
 /* boot is parsed as part of virDomainDeviceInfoParseXML */
+} else if (xmlStrEqual(cur->name, BAD_CAST "backingStore")) {
+if (virDomainDiskBackingStoreParse(ctxt, def->src, cur,
+   def->src->nBackingStores) < 
0)
+goto error;
 }
 }
 cur = cur->next;
@@ -6541,12 +6600,19 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
 def->device = VIR_DOMAIN_DISK_DEVICE_DISK;
 }
 
+if (def->src->type == VIR_STORAGE_TYPE_QUORUM &&
+!virDomainDiskThresholdParse(def->src, node))
+goto error;
+
+snapshot = virXMLPropString(node, "snapshot");
+
 /* Only CDROM and Floppy devices are allowed missing source path
  * to indicate no media present. LUN is for raw access CD-ROMs
  * that are not