|
 |
fada68 |
From 7e49054aad07a3d04311c183bc89dd159f75e7d8 Mon Sep 17 00:00:00 2001
|
|
 |
fada68 |
From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= <jpokorny@redhat.com>
|
|
 |
fada68 |
Date: Fri, 12 Aug 2016 13:52:15 +0200
|
|
 |
fada68 |
Subject: [PATCH 1/5] Refactor: xml.c: merge two identical branches
|
|
 |
fada68 |
|
|
 |
fada68 |
---
|
|
 |
fada68 |
lib/common/xml.c | 7 +------
|
|
 |
fada68 |
1 file changed, 1 insertion(+), 6 deletions(-)
|
|
 |
fada68 |
|
|
 |
fada68 |
diff --git a/lib/common/xml.c b/lib/common/xml.c
|
|
 |
fada68 |
index a20e73e..ff819a2 100644
|
|
 |
fada68 |
--- a/lib/common/xml.c
|
|
 |
fada68 |
+++ b/lib/common/xml.c
|
|
 |
fada68 |
@@ -5668,16 +5668,11 @@ update_validation(xmlNode ** xml_blob, int *best, int max, gboolean transform, g
|
|
 |
fada68 |
crm_trace("Stopping at %s", known_schemas[lpc].name);
|
|
 |
fada68 |
break;
|
|
 |
fada68 |
|
|
 |
fada68 |
- } else if (max > 0 && lpc == max) {
|
|
 |
fada68 |
+ } else if (max > 0 && (lpc == max || next > max)) {
|
|
 |
fada68 |
crm_trace("Upgrade limit reached at %s (lpc=%d, next=%d, max=%d)",
|
|
 |
fada68 |
known_schemas[lpc].name, lpc, next, max);
|
|
 |
fada68 |
break;
|
|
 |
fada68 |
|
|
 |
fada68 |
- } else if (max > 0 && next > max) {
|
|
 |
fada68 |
- crm_debug("Upgrade limit reached at %s (lpc=%d, next=%d, max=%d)",
|
|
 |
fada68 |
- known_schemas[lpc].name, lpc, next, max);
|
|
 |
fada68 |
- break;
|
|
 |
fada68 |
-
|
|
 |
fada68 |
} else if (known_schemas[lpc].transform == NULL) {
|
|
 |
fada68 |
crm_debug("%s-style configuration is also valid for %s",
|
|
 |
fada68 |
known_schemas[lpc].name, known_schemas[next].name);
|
|
 |
fada68 |
--
|
|
 |
fada68 |
1.8.3.1
|
|
 |
fada68 |
|
|
 |
fada68 |
|
|
 |
fada68 |
From d83ffab1e6acb5049b8634ed20e156573307162a Mon Sep 17 00:00:00 2001
|
|
 |
fada68 |
From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= <jpokorny@redhat.com>
|
|
 |
fada68 |
Date: Fri, 12 Aug 2016 13:53:24 +0200
|
|
 |
fada68 |
Subject: [PATCH 2/5] Med: xml.c: internal self-or-less reference inflicted
|
|
 |
fada68 |
infloop guard
|
|
 |
fada68 |
|
|
 |
fada68 |
---
|
|
 |
fada68 |
lib/common/xml.c | 4 ++--
|
|
 |
fada68 |
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
 |
fada68 |
|
|
 |
fada68 |
diff --git a/lib/common/xml.c b/lib/common/xml.c
|
|
 |
fada68 |
index ff819a2..4e019b5 100644
|
|
 |
fada68 |
--- a/lib/common/xml.c
|
|
 |
fada68 |
+++ b/lib/common/xml.c
|
|
 |
fada68 |
@@ -329,7 +329,7 @@ static void __xml_schema_add(
|
|
 |
fada68 |
known_schemas[last].transform = strdup(transform);
|
|
 |
fada68 |
}
|
|
 |
fada68 |
if(after_transform == 0) {
|
|
 |
fada68 |
- after_transform = xml_schema_max;
|
|
 |
fada68 |
+ after_transform = xml_schema_max; /* upgrade is a one-way */
|
|
 |
fada68 |
}
|
|
 |
fada68 |
known_schemas[last].after_transform = after_transform;
|
|
 |
fada68 |
|
|
 |
fada68 |
@@ -5664,7 +5664,7 @@ update_validation(xmlNode ** xml_blob, int *best, int max, gboolean transform, g
|
|
 |
fada68 |
xmlNode *upgrade = NULL;
|
|
 |
fada68 |
int next = known_schemas[lpc].after_transform;
|
|
 |
fada68 |
|
|
 |
fada68 |
- if (next < 0) {
|
|
 |
fada68 |
+ if (next < 0 || next <= lpc) {
|
|
 |
fada68 |
crm_trace("Stopping at %s", known_schemas[lpc].name);
|
|
 |
fada68 |
break;
|
|
 |
fada68 |
|
|
 |
fada68 |
--
|
|
 |
fada68 |
1.8.3.1
|
|
 |
fada68 |
|
|
 |
fada68 |
|
|
 |
fada68 |
From 35fadfd89ee59edb999ed828b7e39e8449fd99b9 Mon Sep 17 00:00:00 2001
|
|
 |
fada68 |
From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= <jpokorny@redhat.com>
|
|
 |
fada68 |
Date: Fri, 12 Aug 2016 14:13:51 +0200
|
|
 |
fada68 |
Subject: [PATCH 3/5] High: fix infloop when no schema validates on
|
|
 |
fada68 |
update_validation
|
|
 |
fada68 |
|
|
 |
fada68 |
Test case:
|
|
 |
fada68 |
$ ./autogen.sh; ./configure; make # if not already
|
|
 |
fada68 |
$ sed -i.orig 's|"promote"|"infloop"|' \
|
|
 |
fada68 |
pengine/test10/use-after-free-merge.xml
|
|
 |
fada68 |
$ PCMK_schema_directory=$(pwd)/xml \
|
|
 |
fada68 |
tools/crm_simulate -x pengine/test10/use-after-free-merge.xml -S
|
|
 |
fada68 |
|
|
 |
fada68 |
BEFORE:
|
|
 |
fada68 |
Entity: line 54: element rsc_colocation: Relax-NG validity error :
|
|
 |
fada68 |
Invalid attribute then-action for element rsc_order
|
|
 |
fada68 |
Entity: line 49: element rsc_location: Relax-NG validity error : Element
|
|
 |
fada68 |
constraints has extra content: rsc_location
|
|
 |
fada68 |
[...infloop...]
|
|
 |
fada68 |
|
|
 |
fada68 |
AFTER:
|
|
 |
fada68 |
Entity: line 54: element rsc_colocation: Relax-NG validity error :
|
|
 |
fada68 |
Invalid attribute then-action for element rsc_order
|
|
 |
fada68 |
Entity: line 49: element rsc_location: Relax-NG validity error : Element
|
|
 |
fada68 |
constraints has extra content: rsc_location
|
|
 |
fada68 |
[several times]
|
|
 |
fada68 |
<error message>
|
|
 |
fada68 |
---
|
|
 |
fada68 |
lib/common/xml.c | 26 +++++++++++++++++++-------
|
|
 |
fada68 |
1 file changed, 19 insertions(+), 7 deletions(-)
|
|
 |
fada68 |
|
|
 |
fada68 |
diff --git a/lib/common/xml.c b/lib/common/xml.c
|
|
 |
fada68 |
index 4e019b5..26d76f2 100644
|
|
 |
fada68 |
--- a/lib/common/xml.c
|
|
 |
fada68 |
+++ b/lib/common/xml.c
|
|
 |
fada68 |
@@ -5647,20 +5647,27 @@ update_validation(xmlNode ** xml_blob, int *best, int max, gboolean transform, g
|
|
 |
fada68 |
}
|
|
 |
fada68 |
|
|
 |
fada68 |
while(lpc <= max_stable_schemas) {
|
|
 |
fada68 |
- gboolean valid = TRUE;
|
|
 |
fada68 |
-
|
|
 |
fada68 |
crm_debug("Testing '%s' validation (%d of %d)",
|
|
 |
fada68 |
known_schemas[lpc].name ? known_schemas[lpc].name : "<unset>",
|
|
 |
fada68 |
lpc, max_stable_schemas);
|
|
 |
fada68 |
- valid = validate_with(xml, lpc, to_logs);
|
|
 |
fada68 |
|
|
 |
fada68 |
- if (valid) {
|
|
 |
fada68 |
- *best = lpc;
|
|
 |
fada68 |
- } else {
|
|
 |
fada68 |
+ if (validate_with(xml, lpc, to_logs) == FALSE) {
|
|
 |
fada68 |
crm_trace("%s validation failed", known_schemas[lpc].name ? known_schemas[lpc].name : "<unset>");
|
|
 |
fada68 |
+ if (*best) {
|
|
 |
fada68 |
+ /* we've satisfied the validation, no need to check further */
|
|
 |
fada68 |
+ break;
|
|
 |
fada68 |
+ }
|
|
 |
fada68 |
+ rc = -pcmk_err_schema_validation;
|
|
 |
fada68 |
+
|
|
 |
fada68 |
+ } else {
|
|
 |
fada68 |
+ rc = pcmk_ok;
|
|
 |
fada68 |
}
|
|
 |
fada68 |
|
|
 |
fada68 |
- if (valid && transform) {
|
|
 |
fada68 |
+ if (rc == pcmk_ok) {
|
|
 |
fada68 |
+ *best = lpc;
|
|
 |
fada68 |
+ }
|
|
 |
fada68 |
+
|
|
 |
fada68 |
+ if (rc == pcmk_ok && transform) {
|
|
 |
fada68 |
xmlNode *upgrade = NULL;
|
|
 |
fada68 |
int next = known_schemas[lpc].after_transform;
|
|
 |
fada68 |
|
|
 |
fada68 |
@@ -5716,6 +5723,11 @@ update_validation(xmlNode ** xml_blob, int *best, int max, gboolean transform, g
|
|
 |
fada68 |
}
|
|
 |
fada68 |
}
|
|
 |
fada68 |
}
|
|
 |
fada68 |
+
|
|
 |
fada68 |
+ if (transform == FALSE || rc != pcmk_ok) {
|
|
 |
fada68 |
+ /* we need some progress! */
|
|
 |
fada68 |
+ lpc++;
|
|
 |
fada68 |
+ }
|
|
 |
fada68 |
}
|
|
 |
fada68 |
|
|
 |
fada68 |
if (*best > match) {
|
|
 |
fada68 |
--
|
|
 |
fada68 |
1.8.3.1
|
|
 |
fada68 |
|
|
 |
fada68 |
|
|
 |
fada68 |
From e41267c3fd4958d61d6833385d86f354b10264b3 Mon Sep 17 00:00:00 2001
|
|
 |
fada68 |
From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= <jpokorny@redhat.com>
|
|
 |
fada68 |
Date: Fri, 12 Aug 2016 14:35:47 +0200
|
|
 |
fada68 |
Subject: [PATCH 4/5] Refactor: xml.c: avoid repeated validate_with call on
|
|
 |
fada68 |
happy path
|
|
 |
fada68 |
|
|
 |
fada68 |
---
|
|
 |
fada68 |
lib/common/xml.c | 25 ++++++++++++++-----------
|
|
 |
fada68 |
1 file changed, 14 insertions(+), 11 deletions(-)
|
|
 |
fada68 |
|
|
 |
fada68 |
diff --git a/lib/common/xml.c b/lib/common/xml.c
|
|
 |
fada68 |
index 26d76f2..fc1fe7f 100644
|
|
 |
fada68 |
--- a/lib/common/xml.c
|
|
 |
fada68 |
+++ b/lib/common/xml.c
|
|
 |
fada68 |
@@ -5617,6 +5617,7 @@ update_validation(xmlNode ** xml_blob, int *best, int max, gboolean transform, g
|
|
 |
fada68 |
char *value = NULL;
|
|
 |
fada68 |
int max_stable_schemas = xml_latest_schema_index();
|
|
 |
fada68 |
int lpc = 0, match = -1, rc = pcmk_ok;
|
|
 |
fada68 |
+ int next = -1; /* -1 denotes "inactive" value */
|
|
 |
fada68 |
|
|
 |
fada68 |
CRM_CHECK(best != NULL, return -EINVAL);
|
|
 |
fada68 |
CRM_CHECK(xml_blob != NULL, return -EINVAL);
|
|
 |
fada68 |
@@ -5652,7 +5653,12 @@ update_validation(xmlNode ** xml_blob, int *best, int max, gboolean transform, g
|
|
 |
fada68 |
lpc, max_stable_schemas);
|
|
 |
fada68 |
|
|
 |
fada68 |
if (validate_with(xml, lpc, to_logs) == FALSE) {
|
|
 |
fada68 |
- crm_trace("%s validation failed", known_schemas[lpc].name ? known_schemas[lpc].name : "<unset>");
|
|
 |
fada68 |
+ if (next != -1) {
|
|
 |
fada68 |
+ crm_info("Configuration not valid for schema: %s", known_schemas[lpc].name);
|
|
 |
fada68 |
+ next = -1;
|
|
 |
fada68 |
+ } else {
|
|
 |
fada68 |
+ crm_trace("%s validation failed", known_schemas[lpc].name ? known_schemas[lpc].name : "<unset>");
|
|
 |
fada68 |
+ }
|
|
 |
fada68 |
if (*best) {
|
|
 |
fada68 |
/* we've satisfied the validation, no need to check further */
|
|
 |
fada68 |
break;
|
|
 |
fada68 |
@@ -5660,6 +5666,10 @@ update_validation(xmlNode ** xml_blob, int *best, int max, gboolean transform, g
|
|
 |
fada68 |
rc = -pcmk_err_schema_validation;
|
|
 |
fada68 |
|
|
 |
fada68 |
} else {
|
|
 |
fada68 |
+ if (next != -1) {
|
|
 |
fada68 |
+ crm_debug("Configuration valid for schema: %s", known_schemas[next].name);
|
|
 |
fada68 |
+ next = -1;
|
|
 |
fada68 |
+ }
|
|
 |
fada68 |
rc = pcmk_ok;
|
|
 |
fada68 |
}
|
|
 |
fada68 |
|
|
 |
fada68 |
@@ -5669,7 +5679,7 @@ update_validation(xmlNode ** xml_blob, int *best, int max, gboolean transform, g
|
|
 |
fada68 |
|
|
 |
fada68 |
if (rc == pcmk_ok && transform) {
|
|
 |
fada68 |
xmlNode *upgrade = NULL;
|
|
 |
fada68 |
- int next = known_schemas[lpc].after_transform;
|
|
 |
fada68 |
+ next = known_schemas[lpc].after_transform;
|
|
 |
fada68 |
|
|
 |
fada68 |
if (next < 0 || next <= lpc) {
|
|
 |
fada68 |
crm_trace("Stopping at %s", known_schemas[lpc].name);
|
|
 |
fada68 |
@@ -5684,15 +5694,7 @@ update_validation(xmlNode ** xml_blob, int *best, int max, gboolean transform, g
|
|
 |
fada68 |
crm_debug("%s-style configuration is also valid for %s",
|
|
 |
fada68 |
known_schemas[lpc].name, known_schemas[next].name);
|
|
 |
fada68 |
|
|
 |
fada68 |
- if (validate_with(xml, next, to_logs)) {
|
|
 |
fada68 |
- crm_debug("Configuration valid for schema: %s", known_schemas[next].name);
|
|
 |
fada68 |
- lpc = next;
|
|
 |
fada68 |
- *best = next;
|
|
 |
fada68 |
- rc = pcmk_ok;
|
|
 |
fada68 |
-
|
|
 |
fada68 |
- } else {
|
|
 |
fada68 |
- crm_info("Configuration not valid for schema: %s", known_schemas[next].name);
|
|
 |
fada68 |
- }
|
|
 |
fada68 |
+ lpc = next;
|
|
 |
fada68 |
|
|
 |
fada68 |
} else {
|
|
 |
fada68 |
crm_debug("Upgrading %s-style configuration to %s with %s",
|
|
 |
fada68 |
@@ -5721,6 +5723,7 @@ update_validation(xmlNode ** xml_blob, int *best, int max, gboolean transform, g
|
|
 |
fada68 |
free_xml(upgrade);
|
|
 |
fada68 |
rc = -pcmk_err_schema_validation;
|
|
 |
fada68 |
}
|
|
 |
fada68 |
+ next = -1;
|
|
 |
fada68 |
}
|
|
 |
fada68 |
}
|
|
 |
fada68 |
|
|
 |
fada68 |
--
|
|
 |
fada68 |
1.8.3.1
|
|
 |
fada68 |
|
|
 |
fada68 |
|
|
 |
fada68 |
From e4b9f340d54310251576c0f862a99149e846235b Mon Sep 17 00:00:00 2001
|
|
 |
fada68 |
From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= <jpokorny@redhat.com>
|
|
 |
fada68 |
Date: Fri, 12 Aug 2016 14:38:42 +0200
|
|
 |
fada68 |
Subject: [PATCH 5/5] Low: xml.c: better info in cli_config_update on no
|
|
 |
fada68 |
validation success
|
|
 |
fada68 |
|
|
 |
fada68 |
This commit turns [error message] from testcase at 35fadfd commit's
|
|
 |
fada68 |
message from
|
|
 |
fada68 |
|
|
 |
fada68 |
> Your current configuration could only be upgraded to pacemaker-1.0...
|
|
 |
fada68 |
> the minimum requirement is pacemaker-2.0.
|
|
 |
fada68 |
|
|
 |
fada68 |
into
|
|
 |
fada68 |
|
|
 |
fada68 |
> Your current configuration could not validate with any schema in
|
|
 |
fada68 |
> range [pacemaker-1.0, pacemaker-2.6]
|
|
 |
fada68 |
---
|
|
 |
fada68 |
lib/common/xml.c | 15 ++++++++++++++-
|
|
 |
fada68 |
1 file changed, 14 insertions(+), 1 deletion(-)
|
|
 |
fada68 |
|
|
 |
fada68 |
diff --git a/lib/common/xml.c b/lib/common/xml.c
|
|
 |
fada68 |
index fc1fe7f..e4574fb 100644
|
|
 |
fada68 |
--- a/lib/common/xml.c
|
|
 |
fada68 |
+++ b/lib/common/xml.c
|
|
 |
fada68 |
@@ -5752,6 +5752,7 @@ cli_config_update(xmlNode ** xml, int *best_version, gboolean to_logs)
|
|
 |
fada68 |
const char *value = crm_element_value(*xml, XML_ATTR_VALIDATION);
|
|
 |
fada68 |
|
|
 |
fada68 |
int version = get_schema_version(value);
|
|
 |
fada68 |
+ int orig_version = version;
|
|
 |
fada68 |
int min_version = xml_minimum_schema_index();
|
|
 |
fada68 |
|
|
 |
fada68 |
if (version < min_version) {
|
|
 |
fada68 |
@@ -5762,7 +5763,19 @@ cli_config_update(xmlNode ** xml, int *best_version, gboolean to_logs)
|
|
 |
fada68 |
|
|
 |
fada68 |
value = crm_element_value(converted, XML_ATTR_VALIDATION);
|
|
 |
fada68 |
if (version < min_version) {
|
|
 |
fada68 |
- if (to_logs) {
|
|
 |
fada68 |
+ if (version < orig_version) {
|
|
 |
fada68 |
+ if (to_logs) {
|
|
 |
fada68 |
+ crm_config_err("Your current configuration could not validate"
|
|
 |
fada68 |
+ " with any schema in range [%s, %s]\n",
|
|
 |
fada68 |
+ get_schema_name(orig_version),
|
|
 |
fada68 |
+ xml_latest_schema());
|
|
 |
fada68 |
+ } else {
|
|
 |
fada68 |
+ fprintf(stderr, "Your current configuration could not validate"
|
|
 |
fada68 |
+ " with any schema in range [%s, %s]\n",
|
|
 |
fada68 |
+ get_schema_name(orig_version),
|
|
 |
fada68 |
+ xml_latest_schema());
|
|
 |
fada68 |
+ }
|
|
 |
fada68 |
+ } else if (to_logs) {
|
|
 |
fada68 |
crm_config_err("Your current configuration could only be upgraded to %s... "
|
|
 |
fada68 |
"the minimum requirement is %s.\n", crm_str(value),
|
|
 |
fada68 |
get_schema_name(min_version));
|
|
 |
fada68 |
--
|
|
 |
fada68 |
1.8.3.1
|
|
 |
fada68 |
|