import pacemaker-2.1.5-1.el8
This commit is contained in:
		
							parent
							
								
									65904a588c
								
							
						
					
					
						commit
						eb317f11d1
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,2 +1,2 @@ | |||||||
| SOURCES/nagios-agents-metadata-105ab8a.tar.gz | SOURCES/nagios-agents-metadata-105ab8a.tar.gz | ||||||
| SOURCES/pacemaker-dc6eb43.tar.gz | SOURCES/pacemaker-d3699a6.tar.gz | ||||||
|  | |||||||
| @ -1,2 +1,2 @@ | |||||||
| ea6c0a27fd0ae8ce02f84a11f08a0d79377041c3 SOURCES/nagios-agents-metadata-105ab8a.tar.gz | ea6c0a27fd0ae8ce02f84a11f08a0d79377041c3 SOURCES/nagios-agents-metadata-105ab8a.tar.gz | ||||||
| 1dfac4c5f1958ce5f72bfcbb2a34890ab058c84c SOURCES/pacemaker-dc6eb43.tar.gz | ea48024f32e6ceb7295edab66435e463fbf43e3c SOURCES/pacemaker-d3699a6.tar.gz | ||||||
|  | |||||||
| @ -1,127 +0,0 @@ | |||||||
| From 243139b2ec0f6b17877a4e7f651fc3f70f76b11a Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Christine Caulfield <ccaulfie@redhat.com> |  | ||||||
| Date: Fri, 6 May 2022 15:23:43 +0100 |  | ||||||
| Subject: [PATCH 1/2] fenced: Don't ignore CIB updates if stonith-enabled=false |  | ||||||
| 
 |  | ||||||
| Fixes: T378 |  | ||||||
| ---
 |  | ||||||
|  daemons/fenced/pacemaker-fenced.c | 23 +++-------------------- |  | ||||||
|  1 file changed, 3 insertions(+), 20 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/daemons/fenced/pacemaker-fenced.c b/daemons/fenced/pacemaker-fenced.c
 |  | ||||||
| index caab7de83..dadd187b6 100644
 |  | ||||||
| --- a/daemons/fenced/pacemaker-fenced.c
 |  | ||||||
| +++ b/daemons/fenced/pacemaker-fenced.c
 |  | ||||||
| @@ -1136,11 +1136,8 @@ static void
 |  | ||||||
|  update_cib_cache_cb(const char *event, xmlNode * msg) |  | ||||||
|  { |  | ||||||
|      int rc = pcmk_ok; |  | ||||||
| -    xmlNode *stonith_enabled_xml = NULL;
 |  | ||||||
| -    static gboolean stonith_enabled_saved = TRUE;
 |  | ||||||
|      long timeout_ms_saved = stonith_watchdog_timeout_ms; |  | ||||||
|      gboolean need_full_refresh = FALSE; |  | ||||||
| -    bool value = false;
 |  | ||||||
|   |  | ||||||
|      if(!have_cib_devices) { |  | ||||||
|          crm_trace("Skipping updates until we get a full dump"); |  | ||||||
| @@ -1191,32 +1188,18 @@ update_cib_cache_cb(const char *event, xmlNode * msg)
 |  | ||||||
|              return; |  | ||||||
|          } |  | ||||||
|          CRM_ASSERT(local_cib != NULL); |  | ||||||
| -        stonith_enabled_saved = FALSE; /* Trigger a full refresh below */
 |  | ||||||
| +        need_full_refresh = TRUE;
 |  | ||||||
|      } |  | ||||||
|   |  | ||||||
|      pcmk__refresh_node_caches_from_cib(local_cib); |  | ||||||
|      update_stonith_watchdog_timeout_ms(local_cib); |  | ||||||
|   |  | ||||||
| -    stonith_enabled_xml = get_xpath_object("//nvpair[@name='stonith-enabled']",
 |  | ||||||
| -                                           local_cib, LOG_NEVER);
 |  | ||||||
| -    if (pcmk__xe_get_bool_attr(stonith_enabled_xml, XML_NVPAIR_ATTR_VALUE, &value) == pcmk_rc_ok && !value) {
 |  | ||||||
| -        crm_trace("Ignoring CIB updates while fencing is disabled");
 |  | ||||||
| -        stonith_enabled_saved = FALSE;
 |  | ||||||
| -
 |  | ||||||
| -    } else if (stonith_enabled_saved == FALSE) {
 |  | ||||||
| -        crm_info("Updating fencing device and topology lists "
 |  | ||||||
| -                 "now that fencing is enabled");
 |  | ||||||
| -        stonith_enabled_saved = TRUE;
 |  | ||||||
| -        need_full_refresh = TRUE;
 |  | ||||||
| -
 |  | ||||||
| -    } else {
 |  | ||||||
| -        if (timeout_ms_saved != stonith_watchdog_timeout_ms) {
 |  | ||||||
| +    if (timeout_ms_saved != stonith_watchdog_timeout_ms) {
 |  | ||||||
|              need_full_refresh = TRUE; |  | ||||||
| -        } else {
 |  | ||||||
| +    } else {
 |  | ||||||
|              update_fencing_topology(event, msg); |  | ||||||
|              update_cib_stonith_devices(event, msg); |  | ||||||
|              watchdog_device_update(); |  | ||||||
| -        }
 |  | ||||||
|      } |  | ||||||
|   |  | ||||||
|      if (need_full_refresh) { |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| From c600ef49022e7473acbe121fae50a0c1aa2d7c03 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Christine Caulfield <ccaulfie@redhat.com> |  | ||||||
| Date: Thu, 9 Jun 2022 11:08:43 +0100 |  | ||||||
| Subject: [PATCH 2/2] Also don't check for stonith-disabled in |  | ||||||
|  update_stonith_watchdog_timeout_ms |  | ||||||
| 
 |  | ||||||
| ---
 |  | ||||||
|  daemons/fenced/pacemaker-fenced.c | 34 +++++++++++-------------------- |  | ||||||
|  1 file changed, 12 insertions(+), 22 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/daemons/fenced/pacemaker-fenced.c b/daemons/fenced/pacemaker-fenced.c
 |  | ||||||
| index dadd187b6..ec42d5bc2 100644
 |  | ||||||
| --- a/daemons/fenced/pacemaker-fenced.c
 |  | ||||||
| +++ b/daemons/fenced/pacemaker-fenced.c
 |  | ||||||
| @@ -643,31 +643,21 @@ watchdog_device_update(void)
 |  | ||||||
|  static void |  | ||||||
|  update_stonith_watchdog_timeout_ms(xmlNode *cib) |  | ||||||
|  { |  | ||||||
| -    xmlNode *stonith_enabled_xml = NULL;
 |  | ||||||
| -    bool stonith_enabled = false;
 |  | ||||||
| -    int rc = pcmk_rc_ok;
 |  | ||||||
|      long timeout_ms = 0; |  | ||||||
| +    xmlNode *stonith_watchdog_xml = NULL;
 |  | ||||||
| +    const char *value = NULL;
 |  | ||||||
|   |  | ||||||
| -    stonith_enabled_xml = get_xpath_object("//nvpair[@name='stonith-enabled']",
 |  | ||||||
| -                                           cib, LOG_NEVER);
 |  | ||||||
| -    rc = pcmk__xe_get_bool_attr(stonith_enabled_xml, XML_NVPAIR_ATTR_VALUE, &stonith_enabled);
 |  | ||||||
| -
 |  | ||||||
| -    if (rc != pcmk_rc_ok || stonith_enabled) {
 |  | ||||||
| -        xmlNode *stonith_watchdog_xml = NULL;
 |  | ||||||
| -        const char *value = NULL;
 |  | ||||||
| -
 |  | ||||||
| -        stonith_watchdog_xml = get_xpath_object("//nvpair[@name='stonith-watchdog-timeout']",
 |  | ||||||
| -                                                cib, LOG_NEVER);
 |  | ||||||
| -        if (stonith_watchdog_xml) {
 |  | ||||||
| -            value = crm_element_value(stonith_watchdog_xml, XML_NVPAIR_ATTR_VALUE);
 |  | ||||||
| -        }
 |  | ||||||
| -        if (value) {
 |  | ||||||
| -            timeout_ms = crm_get_msec(value);
 |  | ||||||
| -        }
 |  | ||||||
| +    stonith_watchdog_xml = get_xpath_object("//nvpair[@name='stonith-watchdog-timeout']",
 |  | ||||||
| +					    cib, LOG_NEVER);
 |  | ||||||
| +    if (stonith_watchdog_xml) {
 |  | ||||||
| +        value = crm_element_value(stonith_watchdog_xml, XML_NVPAIR_ATTR_VALUE);
 |  | ||||||
| +    }
 |  | ||||||
| +    if (value) {
 |  | ||||||
| +        timeout_ms = crm_get_msec(value);
 |  | ||||||
| +    }
 |  | ||||||
|   |  | ||||||
| -        if (timeout_ms < 0) {
 |  | ||||||
| -            timeout_ms = pcmk__auto_watchdog_timeout();
 |  | ||||||
| -        }
 |  | ||||||
| +    if (timeout_ms < 0) {
 |  | ||||||
| +        timeout_ms = pcmk__auto_watchdog_timeout();
 |  | ||||||
|      } |  | ||||||
|   |  | ||||||
|      stonith_watchdog_timeout_ms = timeout_ms; |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| @ -1,425 +0,0 @@ | |||||||
| From 80c64be80f2bffdcf5d2432e1e59d633fd68d516 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Grace Chin <gchin@redhat.com> |  | ||||||
| Date: Mon, 13 Jun 2022 09:02:32 -0400 |  | ||||||
| Subject: [PATCH 1/4] Add pcmk__is_user_in_group() |  | ||||||
| 
 |  | ||||||
| ---
 |  | ||||||
|  lib/common/crmcommon_private.h |  3 +++ |  | ||||||
|  lib/common/utils.c             | 33 +++++++++++++++++++++++++++++++++ |  | ||||||
|  2 files changed, 36 insertions(+) |  | ||||||
| 
 |  | ||||||
| diff --git a/lib/common/crmcommon_private.h b/lib/common/crmcommon_private.h
 |  | ||||||
| index 6b7be9c68..c2fcb0adf 100644
 |  | ||||||
| --- a/lib/common/crmcommon_private.h
 |  | ||||||
| +++ b/lib/common/crmcommon_private.h
 |  | ||||||
| @@ -96,6 +96,9 @@ void pcmk__free_acls(GList *acls);
 |  | ||||||
|  G_GNUC_INTERNAL |  | ||||||
|  void pcmk__unpack_acl(xmlNode *source, xmlNode *target, const char *user); |  | ||||||
|   |  | ||||||
| +G_GNUC_INTERNAL
 |  | ||||||
| +bool pcmk__is_user_in_group(const char *user, const char *group);
 |  | ||||||
| +
 |  | ||||||
|  G_GNUC_INTERNAL |  | ||||||
|  void pcmk__apply_acl(xmlNode *xml); |  | ||||||
|   |  | ||||||
| diff --git a/lib/common/utils.c b/lib/common/utils.c
 |  | ||||||
| index 2dfbef278..f23583acb 100644
 |  | ||||||
| --- a/lib/common/utils.c
 |  | ||||||
| +++ b/lib/common/utils.c
 |  | ||||||
| @@ -27,6 +27,7 @@
 |  | ||||||
|  #include <time.h> |  | ||||||
|  #include <libgen.h> |  | ||||||
|  #include <signal.h> |  | ||||||
| +#include <grp.h>
 |  | ||||||
|   |  | ||||||
|  #include <qb/qbdefs.h> |  | ||||||
|   |  | ||||||
| @@ -53,6 +54,38 @@ gboolean crm_config_error = FALSE;
 |  | ||||||
|  gboolean crm_config_warning = FALSE; |  | ||||||
|  char *crm_system_name = NULL; |  | ||||||
|   |  | ||||||
| +bool
 |  | ||||||
| +pcmk__is_user_in_group(const char *user, const char *group)
 |  | ||||||
| +{
 |  | ||||||
| +    struct group *grent;
 |  | ||||||
| +    char **gr_mem;
 |  | ||||||
| +
 |  | ||||||
| +    if (user == NULL || group == NULL) {
 |  | ||||||
| +        return false;
 |  | ||||||
| +    }
 |  | ||||||
| +    
 |  | ||||||
| +    setgrent();
 |  | ||||||
| +    while ((grent = getgrent()) != NULL) {
 |  | ||||||
| +        if (grent->gr_mem == NULL) {
 |  | ||||||
| +            continue;
 |  | ||||||
| +        }
 |  | ||||||
| +
 |  | ||||||
| +        if(strcmp(group, grent->gr_name) != 0) {
 |  | ||||||
| +            continue;
 |  | ||||||
| +        }
 |  | ||||||
| +
 |  | ||||||
| +        gr_mem = grent->gr_mem;
 |  | ||||||
| +        while (*gr_mem != NULL) {
 |  | ||||||
| +            if (!strcmp(user, *gr_mem++)) {
 |  | ||||||
| +                endgrent();
 |  | ||||||
| +                return true;
 |  | ||||||
| +            }
 |  | ||||||
| +        }
 |  | ||||||
| +    }
 |  | ||||||
| +    endgrent();
 |  | ||||||
| +    return false;
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
|  int |  | ||||||
|  crm_user_lookup(const char *name, uid_t * uid, gid_t * gid) |  | ||||||
|  { |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| From 5fbe5c310de00390fb36d866823a7745ba4812e3 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Grace Chin <gchin@redhat.com> |  | ||||||
| Date: Mon, 13 Jun 2022 09:04:57 -0400 |  | ||||||
| Subject: [PATCH 2/4] Add unit test for pcmk__is_user_in_group() |  | ||||||
| 
 |  | ||||||
| ---
 |  | ||||||
|  lib/common/Makefile.am                        |  2 +- |  | ||||||
|  lib/common/mock.c                             | 31 +++++-- |  | ||||||
|  lib/common/mock_private.h                     | 11 +++ |  | ||||||
|  lib/common/tests/acl/Makefile.am              | 11 ++- |  | ||||||
|  .../tests/acl/pcmk__is_user_in_group_test.c   | 92 +++++++++++++++++++ |  | ||||||
|  5 files changed, 137 insertions(+), 10 deletions(-) |  | ||||||
|  create mode 100644 lib/common/tests/acl/pcmk__is_user_in_group_test.c |  | ||||||
| 
 |  | ||||||
| diff --git a/lib/common/Makefile.am b/lib/common/Makefile.am
 |  | ||||||
| index d7aae53bf..04d56dc3c 100644
 |  | ||||||
| --- a/lib/common/Makefile.am
 |  | ||||||
| +++ b/lib/common/Makefile.am
 |  | ||||||
| @@ -94,7 +94,7 @@ libcrmcommon_la_SOURCES	+= watchdog.c
 |  | ||||||
|  libcrmcommon_la_SOURCES	+= xml.c |  | ||||||
|  libcrmcommon_la_SOURCES	+= xpath.c |  | ||||||
|   |  | ||||||
| -WRAPPED = calloc getenv getpwnam_r uname
 |  | ||||||
| +WRAPPED = calloc getenv getpwnam_r uname setgrent getgrent endgrent
 |  | ||||||
|  WRAPPED_FLAGS = $(foreach fn,$(WRAPPED),-Wl,--wrap=$(fn)) |  | ||||||
|   |  | ||||||
|  libcrmcommon_test_la_SOURCES	= $(libcrmcommon_la_SOURCES) |  | ||||||
| diff --git a/lib/common/mock.c b/lib/common/mock.c
 |  | ||||||
| index 55812ddbc..fa9431e6d 100644
 |  | ||||||
| --- a/lib/common/mock.c
 |  | ||||||
| +++ b/lib/common/mock.c
 |  | ||||||
| @@ -11,6 +11,7 @@
 |  | ||||||
|  #include <stdlib.h> |  | ||||||
|  #include <sys/types.h> |  | ||||||
|  #include <sys/utsname.h> |  | ||||||
| +#include <grp.h>
 |  | ||||||
|   |  | ||||||
|  #include "mock_private.h" |  | ||||||
|   |  | ||||||
| @@ -18,13 +19,13 @@
 |  | ||||||
|   * libcrmcommon_test.a, not into libcrmcommon.so.  It is used to support |  | ||||||
|   * constructing mock versions of library functions for unit testing. |  | ||||||
|   * |  | ||||||
| - * Each unit test will only ever want to use a mocked version of one or two
 |  | ||||||
| - * library functions.  However, we need to mark all the mocked functions as
 |  | ||||||
| - * wrapped (with -Wl,--wrap= in the LDFLAGS) in libcrmcommon_test.a so that
 |  | ||||||
| - * all those unit tests can share the same special test library.  The unit
 |  | ||||||
| - * test then defines its own wrapped function.  Because a unit test won't
 |  | ||||||
| - * define every single wrapped function, there will be undefined references
 |  | ||||||
| - * at link time.
 |  | ||||||
| + * Each unit test will only ever want to use a mocked version of a few
 |  | ||||||
| + * library functions (i.e. not all of them). However, we need to mark all
 |  | ||||||
| + * the mocked functions as wrapped (with -Wl,--wrap= in the LDFLAGS) in
 |  | ||||||
| + * libcrmcommon_test.a so that all those unit tests can share the same
 |  | ||||||
| + * special test library.  The unit test then defines its own wrapped
 |  | ||||||
| + * function. Because a unit test won't define every single wrapped
 |  | ||||||
| + * function, there will be undefined references at link time.
 |  | ||||||
|   * |  | ||||||
|   * This file takes care of those undefined references.  It defines a |  | ||||||
|   * wrapped version of every function that simply calls the real libc |  | ||||||
| @@ -74,3 +75,19 @@ int __attribute__((weak))
 |  | ||||||
|  __wrap_uname(struct utsname *buf) { |  | ||||||
|      return __real_uname(buf); |  | ||||||
|  } |  | ||||||
| +
 |  | ||||||
| +void __attribute__((weak))
 |  | ||||||
| +__wrap_setgrent(void) {
 |  | ||||||
| +    __real_setgrent();
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +struct group * __attribute__((weak))
 |  | ||||||
| +__wrap_getgrent(void) {
 |  | ||||||
| +    return __real_getgrent();
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +void __attribute__((weak))
 |  | ||||||
| +__wrap_endgrent(void) {
 |  | ||||||
| +    __real_endgrent();
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| diff --git a/lib/common/mock_private.h b/lib/common/mock_private.h
 |  | ||||||
| index 3df7c9839..0c1134cc3 100644
 |  | ||||||
| --- a/lib/common/mock_private.h
 |  | ||||||
| +++ b/lib/common/mock_private.h
 |  | ||||||
| @@ -14,6 +14,7 @@
 |  | ||||||
|  #include <stdlib.h> |  | ||||||
|  #include <sys/types.h> |  | ||||||
|  #include <sys/utsname.h> |  | ||||||
| +#include <grp.h>
 |  | ||||||
|   |  | ||||||
|  /* This header is for the sole use of libcrmcommon_test. */ |  | ||||||
|   |  | ||||||
| @@ -31,4 +32,14 @@ int __wrap_getpwnam_r(const char *name, struct passwd *pwd,
 |  | ||||||
|  int __real_uname(struct utsname *buf); |  | ||||||
|  int __wrap_uname(struct utsname *buf); |  | ||||||
|   |  | ||||||
| +void __real_setgrent(void);
 |  | ||||||
| +void __wrap_setgrent(void);
 |  | ||||||
| +
 |  | ||||||
| +struct group *__real_getgrent(void);
 |  | ||||||
| +struct group *__wrap_getgrent(void);
 |  | ||||||
| +
 |  | ||||||
| +void __real_endgrent(void);
 |  | ||||||
| +void __wrap_endgrent(void);
 |  | ||||||
| +
 |  | ||||||
| +
 |  | ||||||
|  #endif  // MOCK_PRIVATE__H |  | ||||||
| diff --git a/lib/common/tests/acl/Makefile.am b/lib/common/tests/acl/Makefile.am
 |  | ||||||
| index 679c9cb8e..a73fc354c 100644
 |  | ||||||
| --- a/lib/common/tests/acl/Makefile.am
 |  | ||||||
| +++ b/lib/common/tests/acl/Makefile.am
 |  | ||||||
| @@ -1,19 +1,26 @@
 |  | ||||||
|  # |  | ||||||
| -# Copyright 2021 the Pacemaker project contributors
 |  | ||||||
| +# Copyright 2021-2022 the Pacemaker project contributors
 |  | ||||||
|  # |  | ||||||
|  # The version control history for this file may have further details. |  | ||||||
|  # |  | ||||||
|  # This source code is licensed under the GNU General Public License version 2 |  | ||||||
|  # or later (GPLv2+) WITHOUT ANY WARRANTY. |  | ||||||
|  # |  | ||||||
| -AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include
 |  | ||||||
| +AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_srcdir)/lib/common
 |  | ||||||
|  LDADD = $(top_builddir)/lib/common/libcrmcommon.la -lcmocka |  | ||||||
|   |  | ||||||
| +pcmk__is_user_in_group_test_LDADD = $(top_builddir)/lib/common/libcrmcommon_test.la -lcmocka
 |  | ||||||
| +pcmk__is_user_in_group_test_LDFLAGS = \
 |  | ||||||
| +    -Wl,--wrap=setgrent \
 |  | ||||||
| +    -Wl,--wrap=getgrent \
 |  | ||||||
| +    -Wl,--wrap=endgrent
 |  | ||||||
| +
 |  | ||||||
|  include $(top_srcdir)/mk/tap.mk |  | ||||||
|   |  | ||||||
|  # Add "_test" to the end of all test program names to simplify .gitignore. |  | ||||||
|   |  | ||||||
|  check_PROGRAMS = \ |  | ||||||
| +    pcmk__is_user_in_group_test \
 |  | ||||||
|  	pcmk_acl_required_test \ |  | ||||||
|      xml_acl_denied_test \ |  | ||||||
|      xml_acl_enabled_test |  | ||||||
| diff --git a/lib/common/tests/acl/pcmk__is_user_in_group_test.c b/lib/common/tests/acl/pcmk__is_user_in_group_test.c
 |  | ||||||
| new file mode 100644 |  | ||||||
| index 000000000..67b8c2c7c
 |  | ||||||
| --- /dev/null
 |  | ||||||
| +++ b/lib/common/tests/acl/pcmk__is_user_in_group_test.c
 |  | ||||||
| @@ -0,0 +1,92 @@
 |  | ||||||
| +/*
 |  | ||||||
| + * Copyright 2020-2022 the Pacemaker project contributors
 |  | ||||||
| + *
 |  | ||||||
| + * The version control history for this file may have further details.
 |  | ||||||
| + *
 |  | ||||||
| + * This source code is licensed under the GNU Lesser General Public License
 |  | ||||||
| + * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
 |  | ||||||
| + */
 |  | ||||||
| +
 |  | ||||||
| +#include <crm_internal.h>
 |  | ||||||
| +#include <crm/common/acl.h>
 |  | ||||||
| +#include "../../crmcommon_private.h"
 |  | ||||||
| +
 |  | ||||||
| +#include "mock_private.h"
 |  | ||||||
| +
 |  | ||||||
| +#include <stdarg.h>
 |  | ||||||
| +#include <stddef.h>
 |  | ||||||
| +#include <stdint.h>
 |  | ||||||
| +#include <setjmp.h>
 |  | ||||||
| +#include <cmocka.h>
 |  | ||||||
| +
 |  | ||||||
| +// THe index of the group that is going to be returned next from "get group entry" (getgrent)
 |  | ||||||
| +static int group_idx = 0;
 |  | ||||||
| +
 |  | ||||||
| +// Data used for testing
 |  | ||||||
| +static const char* grp0_members[] = {
 |  | ||||||
| +    "user0", "user1", NULL
 |  | ||||||
| +};
 |  | ||||||
| +
 |  | ||||||
| +static const char* grp1_members[] = {
 |  | ||||||
| +    "user1", NULL
 |  | ||||||
| +};
 |  | ||||||
| +
 |  | ||||||
| +static const char* grp2_members[] = {
 |  | ||||||
| +    "user2", "user1", NULL
 |  | ||||||
| +};
 |  | ||||||
| +
 |  | ||||||
| +// an array of "groups" (a struct from grp.h), the members of the groups are initalized here to some testing data.
 |  | ||||||
| +// Casting away the consts to make the compiler happy and simplify initialization. 
 |  | ||||||
| +// We never actually change these variables during the test!
 |  | ||||||
| +// string literal = const char* (cannot be changed b/c ? ) vs. char* (its getting casted to this)
 |  | ||||||
| +static const int NUM_GROUPS = 3;
 |  | ||||||
| +static struct group groups[] = {
 |  | ||||||
| +    {(char*)"grp0", (char*)"", 0, (char**)grp0_members},
 |  | ||||||
| +    {(char*)"grp1", (char*)"", 1, (char**)grp1_members},
 |  | ||||||
| +    {(char*)"grp2", (char*)"", 2, (char**)grp2_members},
 |  | ||||||
| +};
 |  | ||||||
| +
 |  | ||||||
| +// This function resets the group_idx to 0.
 |  | ||||||
| +void
 |  | ||||||
| +__wrap_setgrent(void) {
 |  | ||||||
| +    group_idx = 0;
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +// This function returns the next group entry in the list of groups, or
 |  | ||||||
| +// NULL if there aren't any left.
 |  | ||||||
| +// group_idx is a global variable which keeps track of where you are in the list
 |  | ||||||
| +struct group *
 |  | ||||||
| +__wrap_getgrent(void) {
 |  | ||||||
| +    if(group_idx >= NUM_GROUPS) return NULL;
 |  | ||||||
| +    return &groups[group_idx++];
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +void
 |  | ||||||
| +__wrap_endgrent(void) {
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +static void
 |  | ||||||
| +is_pcmk__is_user_in_group(void **state)
 |  | ||||||
| +{
 |  | ||||||
| +    // null user
 |  | ||||||
| +    assert_false(pcmk__is_user_in_group(NULL, "grp0"));
 |  | ||||||
| +    // null group
 |  | ||||||
| +    assert_false(pcmk__is_user_in_group("user0", NULL));
 |  | ||||||
| +    // nonexistent group
 |  | ||||||
| +    assert_false(pcmk__is_user_in_group("user0", "nonexistent_group"));
 |  | ||||||
| +    // user is in group
 |  | ||||||
| +    assert_true(pcmk__is_user_in_group("user0", "grp0"));
 |  | ||||||
| +    // user is not in group
 |  | ||||||
| +    assert_false(pcmk__is_user_in_group("user2", "grp0"));
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +int
 |  | ||||||
| +main(int argc, char **argv)
 |  | ||||||
| +{
 |  | ||||||
| +    const struct CMUnitTest tests[] = {
 |  | ||||||
| +        cmocka_unit_test(is_pcmk__is_user_in_group)
 |  | ||||||
| +    };
 |  | ||||||
| +
 |  | ||||||
| +    cmocka_set_message_output(CM_OUTPUT_TAP);
 |  | ||||||
| +    return cmocka_run_group_tests(tests, NULL, NULL);
 |  | ||||||
| +}
 |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| From 1bb7fda60f5b8547d7457f20543b7e50089cf06b Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Grace Chin <gchin@redhat.com> |  | ||||||
| Date: Mon, 13 Jun 2022 09:17:36 -0400 |  | ||||||
| Subject: [PATCH 3/4] Add ACL group support |  | ||||||
| 
 |  | ||||||
| closes T61 |  | ||||||
| ---
 |  | ||||||
|  lib/common/acl.c | 7 +++++++ |  | ||||||
|  1 file changed, 7 insertions(+) |  | ||||||
| 
 |  | ||||||
| diff --git a/lib/common/acl.c b/lib/common/acl.c
 |  | ||||||
| index f68069bbd..d7f8469b1 100644
 |  | ||||||
| --- a/lib/common/acl.c
 |  | ||||||
| +++ b/lib/common/acl.c
 |  | ||||||
| @@ -320,6 +320,13 @@ pcmk__unpack_acl(xmlNode *source, xmlNode *target, const char *user)
 |  | ||||||
|                          crm_debug("Unpacking ACLs for user '%s'", id); |  | ||||||
|                          p->acls = parse_acl_entry(acls, child, p->acls); |  | ||||||
|                      } |  | ||||||
| +                } else if (!strcmp(tag, XML_ACL_TAG_GROUP)) {
 |  | ||||||
| +                    const char *id = crm_element_value(child, XML_ATTR_ID);
 |  | ||||||
| +
 |  | ||||||
| +                    if (id && pcmk__is_user_in_group(user,id)) {
 |  | ||||||
| +                        crm_debug("Unpacking ACLs for group '%s'", id);
 |  | ||||||
| +                        p->acls = parse_acl_entry(acls, child, p->acls);
 |  | ||||||
| +                    }
 |  | ||||||
|                  } |  | ||||||
|              } |  | ||||||
|          } |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| From f4efd55d9424d34908ba3e2bcffe16c00b2cf660 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Grace Chin <gchin@redhat.com> |  | ||||||
| Date: Mon, 13 Jun 2022 09:20:36 -0400 |  | ||||||
| Subject: [PATCH 4/4] Allow acl_target and acl_group elements to take a 'name' |  | ||||||
|  attribute to use a name different from 'id' |  | ||||||
| 
 |  | ||||||
| closes T60 |  | ||||||
| ---
 |  | ||||||
|  include/crm/msg_xml.h |  1 + |  | ||||||
|  lib/common/acl.c      | 21 +++++++++++++++++---- |  | ||||||
|  2 files changed, 18 insertions(+), 4 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/include/crm/msg_xml.h b/include/crm/msg_xml.h
 |  | ||||||
| index b36dcf060..6470520b1 100644
 |  | ||||||
| --- a/include/crm/msg_xml.h
 |  | ||||||
| +++ b/include/crm/msg_xml.h
 |  | ||||||
| @@ -133,6 +133,7 @@ extern "C" {
 |  | ||||||
|  #  define XML_ATTR_VERSION		"version" |  | ||||||
|  #  define XML_ATTR_DESC			"description" |  | ||||||
|  #  define XML_ATTR_ID			"id" |  | ||||||
| +#  define XML_ATTR_NAME			"name"
 |  | ||||||
|  #  define XML_ATTR_IDREF			"id-ref" |  | ||||||
|  #  define XML_ATTR_ID_LONG		"long-id" |  | ||||||
|  #  define XML_ATTR_TYPE			"type" |  | ||||||
| diff --git a/lib/common/acl.c b/lib/common/acl.c
 |  | ||||||
| index d7f8469b1..b9f7472ee 100644
 |  | ||||||
| --- a/lib/common/acl.c
 |  | ||||||
| +++ b/lib/common/acl.c
 |  | ||||||
| @@ -278,8 +278,13 @@ pcmk__apply_acl(xmlNode *xml)
 |  | ||||||
|   |  | ||||||
|  /*! |  | ||||||
|   * \internal |  | ||||||
| - * \brief Unpack ACLs for a given user
 |  | ||||||
| - *
 |  | ||||||
| + * \brief Unpack ACLs for a given user into the
 |  | ||||||
| + * metadata of the target XML tree
 |  | ||||||
| + * 
 |  | ||||||
| + * Taking the description of ACLs from the source XML tree and 
 |  | ||||||
| + * marking up the target XML tree with access information for the
 |  | ||||||
| + * given user by tacking it onto the relevant nodes
 |  | ||||||
| + * 
 |  | ||||||
|   * \param[in]     source  XML with ACL definitions |  | ||||||
|   * \param[in,out] target  XML that ACLs will be applied to |  | ||||||
|   * \param[in]     user    Username whose ACLs need to be unpacked |  | ||||||
| @@ -314,14 +319,22 @@ pcmk__unpack_acl(xmlNode *source, xmlNode *target, const char *user)
 |  | ||||||
|   |  | ||||||
|                  if (!strcmp(tag, XML_ACL_TAG_USER) |  | ||||||
|                      || !strcmp(tag, XML_ACL_TAG_USERv1)) { |  | ||||||
| -                    const char *id = crm_element_value(child, XML_ATTR_ID);
 |  | ||||||
| +                    const char *id = crm_element_value(child, XML_ATTR_NAME);
 |  | ||||||
| +
 |  | ||||||
| +                    if (id == NULL) {
 |  | ||||||
| +                        id = crm_element_value(child, XML_ATTR_ID);
 |  | ||||||
| +                    }
 |  | ||||||
|   |  | ||||||
|                      if (id && strcmp(id, user) == 0) { |  | ||||||
|                          crm_debug("Unpacking ACLs for user '%s'", id); |  | ||||||
|                          p->acls = parse_acl_entry(acls, child, p->acls); |  | ||||||
|                      } |  | ||||||
|                  } else if (!strcmp(tag, XML_ACL_TAG_GROUP)) { |  | ||||||
| -                    const char *id = crm_element_value(child, XML_ATTR_ID);
 |  | ||||||
| +                    const char *id = crm_element_value(child, XML_ATTR_NAME);
 |  | ||||||
| +
 |  | ||||||
| +                    if (id == NULL) {
 |  | ||||||
| +                        id = crm_element_value(child, XML_ATTR_ID);
 |  | ||||||
| +                    }
 |  | ||||||
|   |  | ||||||
|                      if (id && pcmk__is_user_in_group(user,id)) { |  | ||||||
|                          crm_debug("Unpacking ACLs for group '%s'", id); |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| @ -1,88 +0,0 @@ | |||||||
| From 9853f4d05a376062d60f2e4c90938e587992237b Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Chris Lumens <clumens@redhat.com> |  | ||||||
| Date: Mon, 27 Jun 2022 12:06:24 -0400 |  | ||||||
| Subject: [PATCH 1/2] Fix: tools: Don't output "(null)" in crm_attribute's |  | ||||||
|  quiet mode. |  | ||||||
| 
 |  | ||||||
| If the attribute queried for has no value, simply do not output |  | ||||||
| anything. |  | ||||||
| 
 |  | ||||||
| Regression in 2.1.3 introduced by 8c03553bbf |  | ||||||
| 
 |  | ||||||
| Fixes T502 |  | ||||||
| See: rhbz#2099331 |  | ||||||
| ---
 |  | ||||||
|  tools/crm_attribute.c | 4 +++- |  | ||||||
|  1 file changed, 3 insertions(+), 1 deletion(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/tools/crm_attribute.c b/tools/crm_attribute.c
 |  | ||||||
| index 0bd9dee81..b1463f906 100644
 |  | ||||||
| --- a/tools/crm_attribute.c
 |  | ||||||
| +++ b/tools/crm_attribute.c
 |  | ||||||
| @@ -56,7 +56,9 @@ attribute_text(pcmk__output_t *out, va_list args)
 |  | ||||||
|      char *host G_GNUC_UNUSED = va_arg(args, char *); |  | ||||||
|   |  | ||||||
|      if (out->quiet) { |  | ||||||
| -        pcmk__formatted_printf(out, "%s\n", value);
 |  | ||||||
| +        if (value != NULL) {
 |  | ||||||
| +            pcmk__formatted_printf(out, "%s\n", value);
 |  | ||||||
| +        }
 |  | ||||||
|      } else { |  | ||||||
|          out->info(out, "%s%s %s%s %s%s value=%s", |  | ||||||
|                    scope ? "scope=" : "", scope ? scope : "", |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| From 16d00a9b3ef27afd09f5c046ea1be50fc664ed84 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Chris Lumens <clumens@redhat.com> |  | ||||||
| Date: Mon, 27 Jun 2022 12:18:06 -0400 |  | ||||||
| Subject: [PATCH 2/2] Test: cts: Add a test for querying an attribute that does |  | ||||||
|  not exist. |  | ||||||
| 
 |  | ||||||
| ---
 |  | ||||||
|  cts/cli/regression.tools.exp | 4 ++++ |  | ||||||
|  cts/cts-cli.in               | 5 +++++ |  | ||||||
|  2 files changed, 9 insertions(+) |  | ||||||
| 
 |  | ||||||
| diff --git a/cts/cli/regression.tools.exp b/cts/cli/regression.tools.exp
 |  | ||||||
| index 0d1cfa2ab..464472d42 100644
 |  | ||||||
| --- a/cts/cli/regression.tools.exp
 |  | ||||||
| +++ b/cts/cli/regression.tools.exp
 |  | ||||||
| @@ -24,6 +24,10 @@ A new shadow instance was created.  To begin using it paste the following into y
 |  | ||||||
|  </cib> |  | ||||||
|  =#=#=#= End test: Validate CIB - OK (0) =#=#=#= |  | ||||||
|  * Passed: cibadmin       - Validate CIB |  | ||||||
| +=#=#=#= Begin test: Query the value of an attribute that does not exist =#=#=#=
 |  | ||||||
| +crm_attribute: Error performing operation: No such device or address
 |  | ||||||
| +=#=#=#= End test: Query the value of an attribute that does not exist - No such object (105) =#=#=#=
 |  | ||||||
| +* Passed: crm_attribute  - Query the value of an attribute that does not exist
 |  | ||||||
|  =#=#=#= Begin test: Configure something before erasing =#=#=#= |  | ||||||
|  =#=#=#= Current cib after: Configure something before erasing =#=#=#= |  | ||||||
|  <cib epoch="2" num_updates="0" admin_epoch="0"> |  | ||||||
| diff --git a/cts/cts-cli.in b/cts/cts-cli.in
 |  | ||||||
| index 8565c485a..b895d36ec 100755
 |  | ||||||
| --- a/cts/cts-cli.in
 |  | ||||||
| +++ b/cts/cts-cli.in
 |  | ||||||
| @@ -511,6 +511,10 @@ function test_tools() {
 |  | ||||||
|      cmd="cibadmin -Q" |  | ||||||
|      test_assert $CRM_EX_OK |  | ||||||
|   |  | ||||||
| +    desc="Query the value of an attribute that does not exist"
 |  | ||||||
| +    cmd="crm_attribute -n ABCD --query --quiet"
 |  | ||||||
| +    test_assert $CRM_EX_NOSUCH 0
 |  | ||||||
| +
 |  | ||||||
|      desc="Configure something before erasing" |  | ||||||
|      cmd="crm_attribute -n cluster-delay -v 60s" |  | ||||||
|      test_assert $CRM_EX_OK |  | ||||||
| @@ -1980,6 +1984,7 @@ for t in $tests; do
 |  | ||||||
|          -e 's/ end=\"[0-9][-+: 0-9]*Z*\"/ end=\"\"/' \ |  | ||||||
|          -e 's/ start=\"[0-9][-+: 0-9]*Z*\"/ start=\"\"/' \ |  | ||||||
|          -e 's/^Error checking rule: Device not configured/Error checking rule: No such device or address/' \ |  | ||||||
| +        -e 's/Error performing operation: Device not configured/Error performing operation: No such device or address/' \
 |  | ||||||
|          -e 's/\(Injecting attribute last-failure-ping#monitor_10000=\)[0-9]*/\1/' \ |  | ||||||
|          -e 's/^lt-//' \ |  | ||||||
|          -e 's/ocf::/ocf:/' \ |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| @ -1,624 +0,0 @@ | |||||||
| From e8f96dec79bb33c11d39c9037ac623f18a67b539 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Petr Pavlu <petr.pavlu@suse.com> |  | ||||||
| Date: Tue, 24 May 2022 18:08:57 +0200 |  | ||||||
| Subject: [PATCH] Low: schemas: copy API schemas in preparation for changes |  | ||||||
| 
 |  | ||||||
| Copy crm_mon, crm_simulate and nodes API schemas in preparation for |  | ||||||
| changes and bump the external reference version in crm_mon and |  | ||||||
| crm_simulate to point to the new nodes schema. |  | ||||||
| ---
 |  | ||||||
|  include/crm/common/output_internal.h |   2 +- |  | ||||||
|  xml/api/crm_mon-2.21.rng             | 183 +++++++++++++++ |  | ||||||
|  xml/api/crm_simulate-2.21.rng        | 338 +++++++++++++++++++++++++++ |  | ||||||
|  xml/api/nodes-2.21.rng               |  51 ++++ |  | ||||||
|  4 files changed, 573 insertions(+), 1 deletion(-) |  | ||||||
|  create mode 100644 xml/api/crm_mon-2.21.rng |  | ||||||
|  create mode 100644 xml/api/crm_simulate-2.21.rng |  | ||||||
|  create mode 100644 xml/api/nodes-2.21.rng |  | ||||||
| 
 |  | ||||||
| diff --git a/include/crm/common/output_internal.h b/include/crm/common/output_internal.h
 |  | ||||||
| index 577fd5247..74ee833c1 100644
 |  | ||||||
| --- a/include/crm/common/output_internal.h
 |  | ||||||
| +++ b/include/crm/common/output_internal.h
 |  | ||||||
| @@ -28,7 +28,7 @@ extern "C" {
 |  | ||||||
|   */ |  | ||||||
|   |  | ||||||
|   |  | ||||||
| -#  define PCMK__API_VERSION "2.20"
 |  | ||||||
| +#  define PCMK__API_VERSION "2.21"
 |  | ||||||
|   |  | ||||||
|  #if defined(PCMK__WITH_ATTRIBUTE_OUTPUT_ARGS) |  | ||||||
|  #  define PCMK__OUTPUT_ARGS(ARGS...) __attribute__((output_args(ARGS))) |  | ||||||
| diff --git a/xml/api/crm_mon-2.21.rng b/xml/api/crm_mon-2.21.rng
 |  | ||||||
| new file mode 100644 |  | ||||||
| index 000000000..37036d665
 |  | ||||||
| --- /dev/null
 |  | ||||||
| +++ b/xml/api/crm_mon-2.21.rng
 |  | ||||||
| @@ -0,0 +1,183 @@
 |  | ||||||
| +<?xml version="1.0" encoding="UTF-8"?>
 |  | ||||||
| +<grammar xmlns="http://relaxng.org/ns/structure/1.0"
 |  | ||||||
| +         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
 |  | ||||||
| +
 |  | ||||||
| +    <start>
 |  | ||||||
| +        <ref name="element-crm-mon"/>
 |  | ||||||
| +    </start>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-crm-mon">
 |  | ||||||
| +        <optional>
 |  | ||||||
| +            <ref name="element-summary" />
 |  | ||||||
| +        </optional>
 |  | ||||||
| +        <optional>
 |  | ||||||
| +            <ref name="nodes-list" />
 |  | ||||||
| +        </optional>
 |  | ||||||
| +        <optional>
 |  | ||||||
| +            <ref name="resources-list" />
 |  | ||||||
| +        </optional>
 |  | ||||||
| +        <optional>
 |  | ||||||
| +            <ref name="node-attributes-list" />
 |  | ||||||
| +        </optional>
 |  | ||||||
| +        <optional>
 |  | ||||||
| +            <externalRef href="node-history-2.12.rng"/>
 |  | ||||||
| +        </optional>
 |  | ||||||
| +        <optional>
 |  | ||||||
| +            <ref name="failures-list" />
 |  | ||||||
| +        </optional>
 |  | ||||||
| +        <optional>
 |  | ||||||
| +            <ref name="fence-event-list" />
 |  | ||||||
| +        </optional>
 |  | ||||||
| +        <optional>
 |  | ||||||
| +            <ref name="tickets-list" />
 |  | ||||||
| +        </optional>
 |  | ||||||
| +        <optional>
 |  | ||||||
| +            <ref name="bans-list" />
 |  | ||||||
| +        </optional>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-summary">
 |  | ||||||
| +        <element name="summary">
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <element name="stack">
 |  | ||||||
| +                    <attribute name="type"> <text /> </attribute>
 |  | ||||||
| +                </element>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <element name="current_dc">
 |  | ||||||
| +                    <attribute name="present"> <data type="boolean" /> </attribute>
 |  | ||||||
| +                    <optional>
 |  | ||||||
| +                        <group>
 |  | ||||||
| +                            <attribute name="version"> <text /> </attribute>
 |  | ||||||
| +                            <attribute name="name"> <text /> </attribute>
 |  | ||||||
| +                            <attribute name="id"> <text /> </attribute>
 |  | ||||||
| +                            <attribute name="with_quorum"> <data type="boolean" /> </attribute>
 |  | ||||||
| +                        </group>
 |  | ||||||
| +                    </optional>
 |  | ||||||
| +                </element>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <element name="last_update">
 |  | ||||||
| +                    <attribute name="time"> <text /> </attribute>
 |  | ||||||
| +                </element>
 |  | ||||||
| +                <element name="last_change">
 |  | ||||||
| +                    <attribute name="time"> <text /> </attribute>
 |  | ||||||
| +                    <attribute name="user"> <text /> </attribute>
 |  | ||||||
| +                    <attribute name="client"> <text /> </attribute>
 |  | ||||||
| +                    <attribute name="origin"> <text /> </attribute>
 |  | ||||||
| +                </element>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <element name="nodes_configured">
 |  | ||||||
| +                    <attribute name="number"> <data type="nonNegativeInteger" /> </attribute>
 |  | ||||||
| +                </element>
 |  | ||||||
| +                <element name="resources_configured">
 |  | ||||||
| +                    <attribute name="number"> <data type="nonNegativeInteger" /> </attribute>
 |  | ||||||
| +                    <attribute name="disabled"> <data type="nonNegativeInteger" /> </attribute>
 |  | ||||||
| +                    <attribute name="blocked"> <data type="nonNegativeInteger" /> </attribute>
 |  | ||||||
| +                </element>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <element name="cluster_options">
 |  | ||||||
| +                    <attribute name="stonith-enabled"> <data type="boolean" /> </attribute>
 |  | ||||||
| +                    <attribute name="symmetric-cluster"> <data type="boolean" /> </attribute>
 |  | ||||||
| +                    <attribute name="no-quorum-policy"> <text /> </attribute>
 |  | ||||||
| +                    <attribute name="maintenance-mode"> <data type="boolean" /> </attribute>
 |  | ||||||
| +                    <attribute name="stop-all-resources"> <data type="boolean" /> </attribute>
 |  | ||||||
| +                    <attribute name="stonith-timeout-ms"> <data type="integer" /> </attribute>
 |  | ||||||
| +                    <attribute name="priority-fencing-delay-ms"> <data type="integer" /> </attribute>
 |  | ||||||
| +                </element>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="resources-list">
 |  | ||||||
| +        <element name="resources">
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <externalRef href="resources-2.4.rng" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="nodes-list">
 |  | ||||||
| +        <element name="nodes">
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <externalRef href="nodes-2.21.rng" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="node-attributes-list">
 |  | ||||||
| +        <element name="node_attributes">
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <externalRef href="node-attrs-2.8.rng" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="failures-list">
 |  | ||||||
| +        <element name="failures">
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <externalRef href="failure-2.8.rng" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="fence-event-list">
 |  | ||||||
| +        <element name="fence_history">
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="status"> <data type="integer" /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <externalRef href="fence-event-2.15.rng" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="tickets-list">
 |  | ||||||
| +        <element name="tickets">
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <ref name="element-ticket" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="bans-list">
 |  | ||||||
| +        <element name="bans">
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <ref name="element-ban" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-ticket">
 |  | ||||||
| +        <element name="ticket">
 |  | ||||||
| +            <attribute name="id"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="status">
 |  | ||||||
| +                <choice>
 |  | ||||||
| +                    <value>granted</value>
 |  | ||||||
| +                    <value>revoked</value>
 |  | ||||||
| +                </choice>
 |  | ||||||
| +            </attribute>
 |  | ||||||
| +            <attribute name="standby"> <data type="boolean" /> </attribute>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="last-granted"> <text /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-ban">
 |  | ||||||
| +        <element name="ban">
 |  | ||||||
| +            <attribute name="id"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="resource"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="node"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="weight"> <data type="integer" /> </attribute>
 |  | ||||||
| +            <attribute name="promoted-only"> <data type="boolean" /> </attribute>
 |  | ||||||
| +            <!-- DEPRECATED: master_only is a duplicate of promoted-only that is
 |  | ||||||
| +                 provided solely for API backward compatibility. It will be
 |  | ||||||
| +                 removed in a future release. Check promoted-only instead.
 |  | ||||||
| +              -->
 |  | ||||||
| +            <attribute name="master_only"> <data type="boolean" /> </attribute>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +</grammar>
 |  | ||||||
| diff --git a/xml/api/crm_simulate-2.21.rng b/xml/api/crm_simulate-2.21.rng
 |  | ||||||
| new file mode 100644 |  | ||||||
| index 000000000..75a9b399b
 |  | ||||||
| --- /dev/null
 |  | ||||||
| +++ b/xml/api/crm_simulate-2.21.rng
 |  | ||||||
| @@ -0,0 +1,338 @@
 |  | ||||||
| +<?xml version="1.0" encoding="UTF-8"?>
 |  | ||||||
| +<grammar xmlns="http://relaxng.org/ns/structure/1.0"
 |  | ||||||
| +         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
 |  | ||||||
| +
 |  | ||||||
| +    <start>
 |  | ||||||
| +        <ref name="element-crm-simulate"/>
 |  | ||||||
| +    </start>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-crm-simulate">
 |  | ||||||
| +        <choice>
 |  | ||||||
| +            <ref name="timings-list" />
 |  | ||||||
| +            <group>
 |  | ||||||
| +                <ref name="cluster-status" />
 |  | ||||||
| +                <optional>
 |  | ||||||
| +                    <ref name="modifications-list" />
 |  | ||||||
| +                </optional>
 |  | ||||||
| +                <optional>
 |  | ||||||
| +                    <ref name="allocations-utilizations-list" />
 |  | ||||||
| +                </optional>
 |  | ||||||
| +                <optional>
 |  | ||||||
| +                    <ref name="action-list" />
 |  | ||||||
| +                </optional>
 |  | ||||||
| +                <optional>
 |  | ||||||
| +                    <ref name="cluster-injected-actions-list" />
 |  | ||||||
| +                    <ref name="revised-cluster-status" />
 |  | ||||||
| +                </optional>
 |  | ||||||
| +            </group>
 |  | ||||||
| +        </choice>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="allocations-utilizations-list">
 |  | ||||||
| +        <choice>
 |  | ||||||
| +            <element name="allocations">
 |  | ||||||
| +                <zeroOrMore>
 |  | ||||||
| +                    <choice>
 |  | ||||||
| +                        <ref name="element-allocation" />
 |  | ||||||
| +                        <ref name="element-promotion" />
 |  | ||||||
| +                    </choice>
 |  | ||||||
| +                </zeroOrMore>
 |  | ||||||
| +            </element>
 |  | ||||||
| +            <element name="utilizations">
 |  | ||||||
| +                <zeroOrMore>
 |  | ||||||
| +                    <choice>
 |  | ||||||
| +                        <ref name="element-capacity" />
 |  | ||||||
| +                        <ref name="element-utilization" />
 |  | ||||||
| +                    </choice>
 |  | ||||||
| +                </zeroOrMore>
 |  | ||||||
| +            </element>
 |  | ||||||
| +            <element name="allocations_utilizations">
 |  | ||||||
| +                <zeroOrMore>
 |  | ||||||
| +                    <choice>
 |  | ||||||
| +                        <ref name="element-allocation" />
 |  | ||||||
| +                        <ref name="element-promotion" />
 |  | ||||||
| +                        <ref name="element-capacity" />
 |  | ||||||
| +                        <ref name="element-utilization" />
 |  | ||||||
| +                    </choice>
 |  | ||||||
| +                </zeroOrMore>
 |  | ||||||
| +            </element>
 |  | ||||||
| +        </choice>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="cluster-status">
 |  | ||||||
| +        <element name="cluster_status">
 |  | ||||||
| +            <ref name="nodes-list" />
 |  | ||||||
| +            <ref name="resources-list" />
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <ref name="node-attributes-list" />
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <externalRef href="node-history-2.12.rng" />
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <ref name="failures-list" />
 |  | ||||||
| +            </optional>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="modifications-list">
 |  | ||||||
| +        <element name="modifications">
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="quorum"> <text /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="watchdog"> <text /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <ref name="element-inject-modify-node" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <ref name="element-inject-modify-ticket" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <ref name="element-inject-spec" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <ref name="element-inject-attr" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="revised-cluster-status">
 |  | ||||||
| +        <element name="revised_cluster_status">
 |  | ||||||
| +            <ref name="nodes-list" />
 |  | ||||||
| +            <ref name="resources-list" />
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <ref name="node-attributes-list" />
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <ref name="failures-list" />
 |  | ||||||
| +            </optional>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-inject-attr">
 |  | ||||||
| +        <element name="inject_attr">
 |  | ||||||
| +            <attribute name="cib_node"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="name"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="node_path"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="value"> <text /> </attribute>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-inject-modify-node">
 |  | ||||||
| +        <element name="modify_node">
 |  | ||||||
| +            <attribute name="action"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="node"> <text /> </attribute>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-inject-spec">
 |  | ||||||
| +        <element name="inject_spec">
 |  | ||||||
| +            <attribute name="spec"> <text /> </attribute>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-inject-modify-ticket">
 |  | ||||||
| +        <element name="modify_ticket">
 |  | ||||||
| +            <attribute name="action"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="ticket"> <text /> </attribute>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="cluster-injected-actions-list">
 |  | ||||||
| +        <element name="transition">
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <ref name="element-injected-actions" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="node-attributes-list">
 |  | ||||||
| +        <element name="node_attributes">
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <externalRef href="node-attrs-2.8.rng" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="failures-list">
 |  | ||||||
| +        <element name="failures">
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <externalRef href="failure-2.8.rng" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="nodes-list">
 |  | ||||||
| +        <element name="nodes">
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <externalRef href="nodes-2.21.rng" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="resources-list">
 |  | ||||||
| +        <element name="resources">
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <externalRef href="resources-2.4.rng" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="timings-list">
 |  | ||||||
| +        <element name="timings">
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <ref name="element-timing" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="action-list">
 |  | ||||||
| +        <element name="actions">
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <ref name="element-node-action" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <ref name="element-rsc-action" />
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-allocation">
 |  | ||||||
| +        <element name="node_weight">
 |  | ||||||
| +            <attribute name="function"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="node"> <text /> </attribute>
 |  | ||||||
| +            <externalRef href="../score.rng" />
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="id"> <text /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-capacity">
 |  | ||||||
| +        <element name="capacity">
 |  | ||||||
| +            <attribute name="comment"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="node"> <text /> </attribute>
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <element>
 |  | ||||||
| +                    <anyName />
 |  | ||||||
| +                    <text />
 |  | ||||||
| +                </element>
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-inject-cluster-action">
 |  | ||||||
| +        <element name="cluster_action">
 |  | ||||||
| +            <attribute name="node"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="task"> <text /> </attribute>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="id"> <text /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-injected-actions">
 |  | ||||||
| +        <choice>
 |  | ||||||
| +            <ref name="element-inject-cluster-action" />
 |  | ||||||
| +            <ref name="element-inject-fencing-action" />
 |  | ||||||
| +            <ref name="element-inject-pseudo-action" />
 |  | ||||||
| +            <ref name="element-inject-rsc-action" />
 |  | ||||||
| +        </choice>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-inject-fencing-action">
 |  | ||||||
| +        <element name="fencing_action">
 |  | ||||||
| +            <attribute name="op"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="target"> <text /> </attribute>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-node-action">
 |  | ||||||
| +        <element name="node_action">
 |  | ||||||
| +            <attribute name="node"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="reason"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="task"> <text /> </attribute>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-promotion">
 |  | ||||||
| +        <element name="promotion_score">
 |  | ||||||
| +            <attribute name="id"> <text /> </attribute>
 |  | ||||||
| +            <externalRef href="../score.rng" />
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="node"> <text /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-inject-pseudo-action">
 |  | ||||||
| +        <element name="pseudo_action">
 |  | ||||||
| +            <attribute name="task"> <text /> </attribute>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="node"> <text /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-inject-rsc-action">
 |  | ||||||
| +        <element name="rsc_action">
 |  | ||||||
| +            <attribute name="node"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="op"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="resource"> <text /> </attribute>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="interval"> <data type="integer" /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-timing">
 |  | ||||||
| +        <element name="timing">
 |  | ||||||
| +            <attribute name="file"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="duration"> <data type="double" /> </attribute>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-rsc-action">
 |  | ||||||
| +        <element name="rsc_action">
 |  | ||||||
| +            <attribute name="action"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="resource"> <text /> </attribute>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="blocked"> <data type="boolean" /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="dest"> <text /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="next-role"> <text /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="node"> <text /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="reason"> <text /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="role"> <text /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="source"> <text /> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-utilization">
 |  | ||||||
| +        <element name="utilization">
 |  | ||||||
| +            <attribute name="function"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="node"> <text /> </attribute>
 |  | ||||||
| +            <attribute name="resource"> <text /> </attribute>
 |  | ||||||
| +            <zeroOrMore>
 |  | ||||||
| +                <element>
 |  | ||||||
| +                    <anyName />
 |  | ||||||
| +                    <text />
 |  | ||||||
| +                </element>
 |  | ||||||
| +            </zeroOrMore>
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +</grammar>
 |  | ||||||
| diff --git a/xml/api/nodes-2.21.rng b/xml/api/nodes-2.21.rng
 |  | ||||||
| new file mode 100644 |  | ||||||
| index 000000000..df4c77f37
 |  | ||||||
| --- /dev/null
 |  | ||||||
| +++ b/xml/api/nodes-2.21.rng
 |  | ||||||
| @@ -0,0 +1,51 @@
 |  | ||||||
| +<?xml version="1.0" encoding="UTF-8"?>
 |  | ||||||
| +<grammar xmlns="http://relaxng.org/ns/structure/1.0"
 |  | ||||||
| +         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
 |  | ||||||
| +
 |  | ||||||
| +    <start>
 |  | ||||||
| +        <ref name="element-full-node"/>
 |  | ||||||
| +    </start>
 |  | ||||||
| +
 |  | ||||||
| +    <define name="element-full-node">
 |  | ||||||
| +        <element name="node">
 |  | ||||||
| +            <attribute name="name"> <text/> </attribute>
 |  | ||||||
| +            <attribute name="id"> <text/> </attribute>
 |  | ||||||
| +            <attribute name="online"> <data type="boolean" /> </attribute>
 |  | ||||||
| +            <attribute name="standby"> <data type="boolean" /> </attribute>
 |  | ||||||
| +            <attribute name="standby_onfail"> <data type="boolean" /> </attribute>
 |  | ||||||
| +            <attribute name="maintenance"> <data type="boolean" /> </attribute>
 |  | ||||||
| +            <attribute name="pending"> <data type="boolean" /> </attribute>
 |  | ||||||
| +            <attribute name="unclean"> <data type="boolean" /> </attribute>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="health">
 |  | ||||||
| +                    <choice>
 |  | ||||||
| +                        <value>red</value>
 |  | ||||||
| +                        <value>yellow</value>
 |  | ||||||
| +                        <value>green</value>
 |  | ||||||
| +                    </choice>
 |  | ||||||
| +                </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <attribute name="shutdown"> <data type="boolean" /> </attribute>
 |  | ||||||
| +            <attribute name="expected_up"> <data type="boolean" /> </attribute>
 |  | ||||||
| +            <attribute name="is_dc"> <data type="boolean" /> </attribute>
 |  | ||||||
| +            <attribute name="resources_running"> <data type="nonNegativeInteger" /> </attribute>
 |  | ||||||
| +            <attribute name="type">
 |  | ||||||
| +                <choice>
 |  | ||||||
| +                    <value>unknown</value>
 |  | ||||||
| +                    <value>member</value>
 |  | ||||||
| +                    <value>remote</value>
 |  | ||||||
| +                    <value>ping</value>
 |  | ||||||
| +                </choice>
 |  | ||||||
| +            </attribute>
 |  | ||||||
| +            <optional>
 |  | ||||||
| +                <!-- for virtualized pacemaker_remote nodes, crm_mon 1.1.13 uses
 |  | ||||||
| +                     "container_id" while later versions use "id_as_resource" -->
 |  | ||||||
| +                <choice>
 |  | ||||||
| +                    <attribute name="container_id"> <text/> </attribute>
 |  | ||||||
| +                    <attribute name="id_as_resource"> <text/> </attribute>
 |  | ||||||
| +                </choice>
 |  | ||||||
| +            </optional>
 |  | ||||||
| +            <externalRef href="resources-2.4.rng" />
 |  | ||||||
| +        </element>
 |  | ||||||
| +    </define>
 |  | ||||||
| +</grammar>
 |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| @ -1,46 +0,0 @@ | |||||||
| From 5b6280ac1a213e176aee6d61945b3283ea060a88 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Petr Pavlu <petr.pavlu@suse.com> |  | ||||||
| Date: Tue, 24 May 2022 18:02:31 +0200 |  | ||||||
| Subject: [PATCH] Feature: tools: report CRM feature set of nodes by crm_mon |  | ||||||
| 
 |  | ||||||
| Enable crm_mon to report when CRM feature set is not consistent among |  | ||||||
| online nodes and output a version of each node if --show-detail is |  | ||||||
| specified. |  | ||||||
| ---
 |  | ||||||
|  xml/api/crm_mon-2.21.rng           |   3 + |  | ||||||
|  xml/api/nodes-2.21.rng             |   3 + |  | ||||||
|  9 files changed, 508 insertions(+), 125 deletions(-) |  | ||||||
|  create mode 100644 cts/cli/crm_mon-feature_set.xml |  | ||||||
|  create mode 100644 cts/cli/regression.feature_set.exp |  | ||||||
| 
 |  | ||||||
| diff --git a/xml/api/crm_mon-2.21.rng b/xml/api/crm_mon-2.21.rng
 |  | ||||||
| index 37036d665..e99bcc3d7 100644
 |  | ||||||
| --- a/xml/api/crm_mon-2.21.rng
 |  | ||||||
| +++ b/xml/api/crm_mon-2.21.rng
 |  | ||||||
| @@ -54,6 +54,9 @@
 |  | ||||||
|                              <attribute name="with_quorum"> <data type="boolean" /> </attribute> |  | ||||||
|                          </group> |  | ||||||
|                      </optional> |  | ||||||
| +                    <optional>
 |  | ||||||
| +                        <attribute name="mixed_version"> <data type="boolean" /> </attribute>
 |  | ||||||
| +                    </optional>
 |  | ||||||
|                  </element> |  | ||||||
|              </optional> |  | ||||||
|              <optional> |  | ||||||
| diff --git a/xml/api/nodes-2.21.rng b/xml/api/nodes-2.21.rng
 |  | ||||||
| index df4c77f37..7e236ba63 100644
 |  | ||||||
| --- a/xml/api/nodes-2.21.rng
 |  | ||||||
| +++ b/xml/api/nodes-2.21.rng
 |  | ||||||
| @@ -25,6 +25,9 @@
 |  | ||||||
|                      </choice> |  | ||||||
|                  </attribute> |  | ||||||
|              </optional> |  | ||||||
| +            <optional>
 |  | ||||||
| +                <attribute name="feature_set"> <text/> </attribute>
 |  | ||||||
| +            </optional>
 |  | ||||||
|              <attribute name="shutdown"> <data type="boolean" /> </attribute> |  | ||||||
|              <attribute name="expected_up"> <data type="boolean" /> </attribute> |  | ||||||
|              <attribute name="is_dc"> <data type="boolean" /> </attribute> |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,108 +0,0 @@ | |||||||
| From d6294dd28b6d95ad3844824996717f9959d97ac6 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Reid Wahl <nrwahl@protonmail.com> |  | ||||||
| Date: Thu, 30 Jun 2022 11:07:32 -0700 |  | ||||||
| Subject: [PATCH 1/2] Fix: Use correct boolean in stonith__validate_agent_xml |  | ||||||
| 
 |  | ||||||
| This fixes a regression introduced by 91a2b2e that flips the boolean |  | ||||||
| values for "valid" in the XML output. |  | ||||||
| 
 |  | ||||||
| Resolves: RHBZ#2102292 (partial) |  | ||||||
| 
 |  | ||||||
| Signed-off-by: Reid Wahl <nrwahl@protonmail.com> |  | ||||||
| ---
 |  | ||||||
|  lib/fencing/st_output.c | 7 +++---- |  | ||||||
|  1 file changed, 3 insertions(+), 4 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/lib/fencing/st_output.c b/lib/fencing/st_output.c
 |  | ||||||
| index e0ff848c2..eb10ad0c5 100644
 |  | ||||||
| --- a/lib/fencing/st_output.c
 |  | ||||||
| +++ b/lib/fencing/st_output.c
 |  | ||||||
| @@ -528,10 +528,9 @@ validate_agent_xml(pcmk__output_t *out, va_list args) {
 |  | ||||||
|      char *error_output = va_arg(args, char *); |  | ||||||
|      int rc = va_arg(args, int); |  | ||||||
|   |  | ||||||
| -    xmlNodePtr node = pcmk__output_create_xml_node(out, "validate",
 |  | ||||||
| -                                                   "agent", agent,
 |  | ||||||
| -                                                   "valid", pcmk__btoa(rc),
 |  | ||||||
| -                                                   NULL);
 |  | ||||||
| +    xmlNodePtr node = pcmk__output_create_xml_node(
 |  | ||||||
| +        out, "validate", "agent", agent, "valid", pcmk__btoa(rc == pcmk_ok),
 |  | ||||||
| +        NULL);
 |  | ||||||
|   |  | ||||||
|      if (device != NULL) { |  | ||||||
|          crm_xml_add(node, "device", device); |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| From 81e83683e69b4f147f40f5353f8e68032758a104 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Reid Wahl <nrwahl@protonmail.com> |  | ||||||
| Date: Wed, 29 Jun 2022 18:15:33 -0700 |  | ||||||
| Subject: [PATCH 2/2] Fix: Use failed action result in rhcs_validate and |  | ||||||
|  _get_metadata |  | ||||||
| 
 |  | ||||||
| If an action failed but has a non-NULL result, get the rc and other |  | ||||||
| attributes from that result. |  | ||||||
| 
 |  | ||||||
| This fixes a regression introduced by b441925, in which failure XML |  | ||||||
| output now contains a CRM_EX_CONNECTED rc instead of the correct one and |  | ||||||
| does not contain stdout/stderr. That commit caused |  | ||||||
| services__execute_file() to return a proper rc instead of TRUE. A |  | ||||||
| non-pcmk_ok bubbled up the call chain causing |  | ||||||
| internal_stonith_action_execute() to return -ECONNABORTED. Then |  | ||||||
| rhcs_validate() and _get_metadata() would use this rc instead of the one |  | ||||||
| attached to the result. |  | ||||||
| 
 |  | ||||||
| Resolves: RHBZ#2102292 |  | ||||||
| 
 |  | ||||||
| Signed-off-by: Reid Wahl <nrwahl@protonmail.com> |  | ||||||
| ---
 |  | ||||||
|  lib/fencing/st_rhcs.c | 10 +++++----- |  | ||||||
|  1 file changed, 5 insertions(+), 5 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/lib/fencing/st_rhcs.c b/lib/fencing/st_rhcs.c
 |  | ||||||
| index 39485013e..029c97eea 100644
 |  | ||||||
| --- a/lib/fencing/st_rhcs.c
 |  | ||||||
| +++ b/lib/fencing/st_rhcs.c
 |  | ||||||
| @@ -130,16 +130,15 @@ stonith__rhcs_get_metadata(const char *agent, int timeout, xmlNode **metadata)
 |  | ||||||
|      stonith_action_t *action = stonith_action_create(agent, "metadata", NULL, 0, |  | ||||||
|                                                       5, NULL, NULL, NULL); |  | ||||||
|      int rc = stonith__execute(action); |  | ||||||
| +    result = stonith__action_result(action);
 |  | ||||||
|   |  | ||||||
| -    if (rc < 0) {
 |  | ||||||
| +    if (rc < 0 && result == NULL) {
 |  | ||||||
|          crm_warn("Could not execute metadata action for %s: %s " |  | ||||||
|                   CRM_XS " rc=%d", agent, pcmk_strerror(rc), rc); |  | ||||||
|          stonith__destroy_action(action); |  | ||||||
|          return rc; |  | ||||||
|      } |  | ||||||
|   |  | ||||||
| -    result = stonith__action_result(action);
 |  | ||||||
| -
 |  | ||||||
|      if (result->execution_status != PCMK_EXEC_DONE) { |  | ||||||
|          crm_warn("Could not execute metadata action for %s: %s", |  | ||||||
|                   agent, pcmk_exec_status_str(result->execution_status)); |  | ||||||
| @@ -262,6 +261,7 @@ stonith__rhcs_validate(stonith_t *st, int call_options, const char *target,
 |  | ||||||
|      int remaining_timeout = timeout; |  | ||||||
|      xmlNode *metadata = NULL; |  | ||||||
|      stonith_action_t *action = NULL; |  | ||||||
| +    pcmk__action_result_t *result = NULL;
 |  | ||||||
|   |  | ||||||
|      if (host_arg == NULL) { |  | ||||||
|          time_t start_time = time(NULL); |  | ||||||
| @@ -298,9 +298,9 @@ stonith__rhcs_validate(stonith_t *st, int call_options, const char *target,
 |  | ||||||
|                                     NULL, host_arg); |  | ||||||
|   |  | ||||||
|      rc = stonith__execute(action); |  | ||||||
| -    if (rc == pcmk_ok) {
 |  | ||||||
| -        pcmk__action_result_t *result = stonith__action_result(action);
 |  | ||||||
| +    result = stonith__action_result(action);
 |  | ||||||
|   |  | ||||||
| +    if (result != NULL) {
 |  | ||||||
|          rc = pcmk_rc2legacy(stonith__result2rc(result)); |  | ||||||
|   |  | ||||||
|          // Take ownership of output so stonith__destroy_action() doesn't free it |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| @ -1,34 +0,0 @@ | |||||||
| From e4d9c795dfe2d6737c777a265292864da98dae8f Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Reid Wahl <nrwahl@protonmail.com> |  | ||||||
| Date: Thu, 30 Jun 2022 14:40:31 -0700 |  | ||||||
| Subject: [PATCH] Low: Always null-check result in stonith__rhcs_get_metadata |  | ||||||
| 
 |  | ||||||
| Null-check result even if rc == 0. |  | ||||||
| 
 |  | ||||||
| Signed-off-by: Reid Wahl <nrwahl@protonmail.com> |  | ||||||
| ---
 |  | ||||||
|  lib/fencing/st_rhcs.c | 8 +++++--- |  | ||||||
|  1 file changed, 5 insertions(+), 3 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/lib/fencing/st_rhcs.c b/lib/fencing/st_rhcs.c
 |  | ||||||
| index 029c97eea..dfccff2cb 100644
 |  | ||||||
| --- a/lib/fencing/st_rhcs.c
 |  | ||||||
| +++ b/lib/fencing/st_rhcs.c
 |  | ||||||
| @@ -132,9 +132,11 @@ stonith__rhcs_get_metadata(const char *agent, int timeout, xmlNode **metadata)
 |  | ||||||
|      int rc = stonith__execute(action); |  | ||||||
|      result = stonith__action_result(action); |  | ||||||
|   |  | ||||||
| -    if (rc < 0 && result == NULL) {
 |  | ||||||
| -        crm_warn("Could not execute metadata action for %s: %s "
 |  | ||||||
| -                 CRM_XS " rc=%d", agent, pcmk_strerror(rc), rc);
 |  | ||||||
| +    if (result == NULL) {
 |  | ||||||
| +        if (rc < 0) {
 |  | ||||||
| +            crm_warn("Could not execute metadata action for %s: %s "
 |  | ||||||
| +                     CRM_XS " rc=%d", agent, pcmk_strerror(rc), rc);
 |  | ||||||
| +        }
 |  | ||||||
|          stonith__destroy_action(action); |  | ||||||
|          return rc; |  | ||||||
|      } |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| @ -1,94 +0,0 @@ | |||||||
| From d00a6abde7e6a41f8bc6085c875cb8072aff499b Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Chris Lumens <clumens@redhat.com> |  | ||||||
| Date: Thu, 30 Jun 2022 09:25:05 -0400 |  | ||||||
| Subject: [PATCH 1/2] Fix: libstonithd: Add the "Agent not found..." message to |  | ||||||
|  formatted output. |  | ||||||
| 
 |  | ||||||
| ---
 |  | ||||||
|  lib/fencing/st_client.c | 11 ++++++++--- |  | ||||||
|  1 file changed, 8 insertions(+), 3 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c
 |  | ||||||
| index 137642af7..971bbe9a5 100644
 |  | ||||||
| --- a/lib/fencing/st_client.c
 |  | ||||||
| +++ b/lib/fencing/st_client.c
 |  | ||||||
| @@ -1763,9 +1763,14 @@ stonith_api_validate(stonith_t *st, int call_options, const char *rsc_id,
 |  | ||||||
|          default: |  | ||||||
|              rc = -EINVAL; |  | ||||||
|              errno = EINVAL; |  | ||||||
| -            crm_perror(LOG_ERR,
 |  | ||||||
| -                       "Agent %s not found or does not support validation",
 |  | ||||||
| -                       agent);
 |  | ||||||
| +
 |  | ||||||
| +            if (error_output) {
 |  | ||||||
| +                *error_output = crm_strdup_printf("Agent %s not found or does not support validation",
 |  | ||||||
| +                                                  agent);
 |  | ||||||
| +            } else {
 |  | ||||||
| +                crm_err("Agent %s not found or does not support validation", agent);
 |  | ||||||
| +            }
 |  | ||||||
| +
 |  | ||||||
|              break; |  | ||||||
|      } |  | ||||||
|      g_hash_table_destroy(params_table); |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| From f3a5fc961c30556b975011773e4cebf323bec38e Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Chris Lumens <clumens@redhat.com> |  | ||||||
| Date: Fri, 1 Jul 2022 10:38:45 -0400 |  | ||||||
| Subject: [PATCH 2/2] Refactor: libstonithd: Split apart error conditions when |  | ||||||
|  validating. |  | ||||||
| 
 |  | ||||||
| The "not found" and "can't validate" cases were previously jumbled |  | ||||||
| together.  Now, return ENOENT if the agent is not found and EOPNOTSUPP |  | ||||||
| if it can't validate.  The only caller appears to be handling both cases |  | ||||||
| correctly already, so no changes are needed there. |  | ||||||
| ---
 |  | ||||||
|  lib/fencing/st_client.c | 21 +++++++++++++++++---- |  | ||||||
|  1 file changed, 17 insertions(+), 4 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c
 |  | ||||||
| index 971bbe9a5..192334812 100644
 |  | ||||||
| --- a/lib/fencing/st_client.c
 |  | ||||||
| +++ b/lib/fencing/st_client.c
 |  | ||||||
| @@ -1760,19 +1760,32 @@ stonith_api_validate(stonith_t *st, int call_options, const char *rsc_id,
 |  | ||||||
|              break; |  | ||||||
|  #endif |  | ||||||
|   |  | ||||||
| +        case st_namespace_invalid:
 |  | ||||||
| +            errno = ENOENT;
 |  | ||||||
| +            rc = -errno;
 |  | ||||||
| +
 |  | ||||||
| +            if (error_output) {
 |  | ||||||
| +                *error_output = crm_strdup_printf("Agent %s not found", agent);
 |  | ||||||
| +            } else {
 |  | ||||||
| +                crm_err("Agent %s not found", agent);
 |  | ||||||
| +            }
 |  | ||||||
| +
 |  | ||||||
| +            break;
 |  | ||||||
| +
 |  | ||||||
|          default: |  | ||||||
| -            rc = -EINVAL;
 |  | ||||||
| -            errno = EINVAL;
 |  | ||||||
| +            errno = EOPNOTSUPP;
 |  | ||||||
| +            rc = -errno;
 |  | ||||||
|   |  | ||||||
|              if (error_output) { |  | ||||||
| -                *error_output = crm_strdup_printf("Agent %s not found or does not support validation",
 |  | ||||||
| +                *error_output = crm_strdup_printf("Agent %s does not support validation",
 |  | ||||||
|                                                    agent); |  | ||||||
|              } else { |  | ||||||
| -                crm_err("Agent %s not found or does not support validation", agent);
 |  | ||||||
| +                crm_err("Agent %s does not support validation", agent);
 |  | ||||||
|              } |  | ||||||
|   |  | ||||||
|              break; |  | ||||||
|      } |  | ||||||
| +
 |  | ||||||
|      g_hash_table_destroy(params_table); |  | ||||||
|      return rc; |  | ||||||
|  } |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| @ -1,47 +0,0 @@ | |||||||
| From e5f80059c7f1c0ad3264dc2a2a61e64cded0fe0f Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Hideo Yamauchi <renayama19661014@ybb.ne.jp> |  | ||||||
| Date: Tue, 12 Jul 2022 14:45:55 +0900 |  | ||||||
| Subject: [PATCH] High: scheduler: Resolves an issue where STONITH devices |  | ||||||
|  cannot be registered. |  | ||||||
| 
 |  | ||||||
| ---
 |  | ||||||
|  lib/pacemaker/pcmk_sched_allocate.c | 10 ++++++++++ |  | ||||||
|  1 file changed, 10 insertions(+) |  | ||||||
| 
 |  | ||||||
| diff --git a/lib/pacemaker/pcmk_sched_allocate.c b/lib/pacemaker/pcmk_sched_allocate.c
 |  | ||||||
| index 85df6ace8..a7fe9c8d6 100644
 |  | ||||||
| --- a/lib/pacemaker/pcmk_sched_allocate.c
 |  | ||||||
| +++ b/lib/pacemaker/pcmk_sched_allocate.c
 |  | ||||||
| @@ -724,12 +724,18 @@ log_unrunnable_actions(pe_working_set_t *data_set)
 |  | ||||||
|  static void |  | ||||||
|  unpack_cib(xmlNode *cib, unsigned long long flags, pe_working_set_t *data_set) |  | ||||||
|  { |  | ||||||
| +    const char* localhost_save = NULL;
 |  | ||||||
| +
 |  | ||||||
|      if (pcmk_is_set(data_set->flags, pe_flag_have_status)) { |  | ||||||
|          crm_trace("Reusing previously calculated cluster status"); |  | ||||||
|          pe__set_working_set_flags(data_set, flags); |  | ||||||
|          return; |  | ||||||
|      } |  | ||||||
|   |  | ||||||
| +    if (data_set->localhost) {
 |  | ||||||
| +        localhost_save = data_set->localhost;
 |  | ||||||
| +    }
 |  | ||||||
| +
 |  | ||||||
|      CRM_ASSERT(cib != NULL); |  | ||||||
|      crm_trace("Calculating cluster status"); |  | ||||||
|   |  | ||||||
| @@ -740,6 +746,10 @@ unpack_cib(xmlNode *cib, unsigned long long flags, pe_working_set_t *data_set)
 |  | ||||||
|       */ |  | ||||||
|      set_working_set_defaults(data_set); |  | ||||||
|   |  | ||||||
| +    if (localhost_save) {
 |  | ||||||
| +        data_set->localhost = localhost_save;
 |  | ||||||
| +    }
 |  | ||||||
| +
 |  | ||||||
|      pe__set_working_set_flags(data_set, flags); |  | ||||||
|      data_set->input = cib; |  | ||||||
|      cluster_status(data_set); // Sets pe_flag_have_status |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| @ -1,178 +0,0 @@ | |||||||
| From b1094468ab0f7c6d2f5b457b721f3a852a9cae2c Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Klaus Wenninger <klaus.wenninger@aon.at> |  | ||||||
| Date: Thu, 14 Jul 2022 13:09:51 +0200 |  | ||||||
| Subject: [PATCH 1/2] Fix: do unfencing equally for cluster-nodes & remotes |  | ||||||
| 
 |  | ||||||
| Fixes T28 |  | ||||||
| ---
 |  | ||||||
|  lib/pengine/utils.c | 8 ++------ |  | ||||||
|  1 file changed, 2 insertions(+), 6 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c
 |  | ||||||
| index 0c2eb3c16..83f76cccf 100644
 |  | ||||||
| --- a/lib/pengine/utils.c
 |  | ||||||
| +++ b/lib/pengine/utils.c
 |  | ||||||
| @@ -1201,12 +1201,8 @@ pe_fence_op(pe_node_t * node, const char *op, bool optional, const char *reason,
 |  | ||||||
|          add_hash_param(stonith_op->meta, XML_LRM_ATTR_TARGET_UUID, node->details->id); |  | ||||||
|          add_hash_param(stonith_op->meta, "stonith_action", op); |  | ||||||
|   |  | ||||||
| -        if (pe__is_guest_or_remote_node(node)
 |  | ||||||
| -            && pcmk_is_set(data_set->flags, pe_flag_enable_unfencing)) {
 |  | ||||||
| -            /* Extra work to detect device changes on remotes
 |  | ||||||
| -             *
 |  | ||||||
| -             * We may do this for all nodes in the future, but for now
 |  | ||||||
| -             * the pcmk__check_action_config() based stuff works fine.
 |  | ||||||
| +        if (pcmk_is_set(data_set->flags, pe_flag_enable_unfencing)) {
 |  | ||||||
| +            /* Extra work to detect device changes
 |  | ||||||
|               */ |  | ||||||
|              long max = 1024; |  | ||||||
|              long digests_all_offset = 0; |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| From f5db6e2c94273623a49f36f1bdb6c39315c53cab Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Klaus Wenninger <klaus.wenninger@aon.at> |  | ||||||
| Date: Thu, 14 Jul 2022 11:29:05 +0200 |  | ||||||
| Subject: [PATCH 2/2] Test: cts-scheduler: update expected output for changes |  | ||||||
|  in unfencing |  | ||||||
| 
 |  | ||||||
| ---
 |  | ||||||
|  cts/scheduler/exp/start-then-stop-with-unfence.exp | 2 +- |  | ||||||
|  cts/scheduler/exp/unfence-definition.exp           | 6 +++--- |  | ||||||
|  cts/scheduler/exp/unfence-device.exp               | 6 +++--- |  | ||||||
|  cts/scheduler/exp/unfence-parameters.exp           | 6 +++--- |  | ||||||
|  cts/scheduler/exp/unfence-startup.exp              | 4 ++-- |  | ||||||
|  5 files changed, 12 insertions(+), 12 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/cts/scheduler/exp/start-then-stop-with-unfence.exp b/cts/scheduler/exp/start-then-stop-with-unfence.exp
 |  | ||||||
| index b1868586f..69cfb63de 100644
 |  | ||||||
| --- a/cts/scheduler/exp/start-then-stop-with-unfence.exp
 |  | ||||||
| +++ b/cts/scheduler/exp/start-then-stop-with-unfence.exp
 |  | ||||||
| @@ -151,7 +151,7 @@
 |  | ||||||
|    <synapse id="11"> |  | ||||||
|      <action_set> |  | ||||||
|        <crm_event id="5" operation="stonith" operation_key="stonith-rhel7-node1.example.com-on" on_node="rhel7-node1.example.com" on_node_uuid="1"> |  | ||||||
| -        <attributes CRM_meta_on_node="rhel7-node1.example.com" CRM_meta_on_node_uuid="1" CRM_meta_probe_complete="true" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
 |  | ||||||
| +        <attributes CRM_meta_digests_all="mpath-node1:fence_mpath:019ed48e26413030411da3ae8888a649,mpath-node2:fence_mpath:b97ef86afabe0426040d1bef247023ee," CRM_meta_digests_secure="mpath-node1:fence_mpath:21f9562fe6837f7357aab98ba69f71fb,mpath-node2:fence_mpath:563e5d6a67b7dcdb65d2f0325aed9fc1," CRM_meta_on_node="rhel7-node1.example.com" CRM_meta_on_node_uuid="1" CRM_meta_probe_complete="true" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
 |  | ||||||
|        </crm_event> |  | ||||||
|      </action_set> |  | ||||||
|      <inputs/> |  | ||||||
| diff --git a/cts/scheduler/exp/unfence-definition.exp b/cts/scheduler/exp/unfence-definition.exp
 |  | ||||||
| index 840a8d212..6a098ed3c 100644
 |  | ||||||
| --- a/cts/scheduler/exp/unfence-definition.exp
 |  | ||||||
| +++ b/cts/scheduler/exp/unfence-definition.exp
 |  | ||||||
| @@ -373,7 +373,7 @@
 |  | ||||||
|    <synapse id="22"> |  | ||||||
|      <action_set> |  | ||||||
|        <crm_event id="29" operation="stonith" operation_key="stonith-virt-4-reboot" on_node="virt-4" on_node_uuid="4"> |  | ||||||
| -        <attributes CRM_meta_on_node="virt-4" CRM_meta_on_node_uuid="4" CRM_meta_stonith_action="reboot" />
 |  | ||||||
| +        <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-4" CRM_meta_on_node_uuid="4" CRM_meta_stonith_action="reboot" />
 |  | ||||||
|          <downed> |  | ||||||
|            <node id="4"/> |  | ||||||
|          </downed> |  | ||||||
| @@ -384,7 +384,7 @@
 |  | ||||||
|    <synapse id="23"> |  | ||||||
|      <action_set> |  | ||||||
|        <crm_event id="3" operation="stonith" operation_key="stonith-virt-3-on" on_node="virt-3" on_node_uuid="3"> |  | ||||||
| -        <attributes CRM_meta_on_node="virt-3" CRM_meta_on_node_uuid="3" CRM_meta_stonith_action="on" />
 |  | ||||||
| +        <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-3" CRM_meta_on_node_uuid="3" CRM_meta_stonith_action="on" />
 |  | ||||||
|        </crm_event> |  | ||||||
|      </action_set> |  | ||||||
|      <inputs/> |  | ||||||
| @@ -392,7 +392,7 @@
 |  | ||||||
|    <synapse id="24"> |  | ||||||
|      <action_set> |  | ||||||
|        <crm_event id="1" operation="stonith" operation_key="stonith-virt-1-on" on_node="virt-1" on_node_uuid="1"> |  | ||||||
| -        <attributes CRM_meta_on_node="virt-1" CRM_meta_on_node_uuid="1" CRM_meta_stonith_action="on" />
 |  | ||||||
| +        <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-1" CRM_meta_on_node_uuid="1" CRM_meta_stonith_action="on" />
 |  | ||||||
|        </crm_event> |  | ||||||
|      </action_set> |  | ||||||
|      <inputs> |  | ||||||
| diff --git a/cts/scheduler/exp/unfence-device.exp b/cts/scheduler/exp/unfence-device.exp
 |  | ||||||
| index a39fc758f..452351d98 100644
 |  | ||||||
| --- a/cts/scheduler/exp/unfence-device.exp
 |  | ||||||
| +++ b/cts/scheduler/exp/unfence-device.exp
 |  | ||||||
| @@ -76,7 +76,7 @@
 |  | ||||||
|    <synapse id="5"> |  | ||||||
|      <action_set> |  | ||||||
|        <crm_event id="6" operation="stonith" operation_key="stonith-virt-013-on" on_node="virt-013" on_node_uuid="3"> |  | ||||||
| -        <attributes CRM_meta_on_node="virt-013" CRM_meta_on_node_uuid="3" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
 |  | ||||||
| +        <attributes CRM_meta_digests_all="fence_scsi:fence_scsi:5950f402238c1e5058a556fe39bb09de," CRM_meta_digests_secure="fence_scsi:fence_scsi:a911b9a554cdc5844d863a91b1ef283a," CRM_meta_on_node="virt-013" CRM_meta_on_node_uuid="3" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
 |  | ||||||
|        </crm_event> |  | ||||||
|      </action_set> |  | ||||||
|      <inputs/> |  | ||||||
| @@ -84,7 +84,7 @@
 |  | ||||||
|    <synapse id="6"> |  | ||||||
|      <action_set> |  | ||||||
|        <crm_event id="4" operation="stonith" operation_key="stonith-virt-009-on" on_node="virt-009" on_node_uuid="2"> |  | ||||||
| -        <attributes CRM_meta_on_node="virt-009" CRM_meta_on_node_uuid="2" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
 |  | ||||||
| +        <attributes CRM_meta_digests_all="fence_scsi:fence_scsi:5950f402238c1e5058a556fe39bb09de," CRM_meta_digests_secure="fence_scsi:fence_scsi:a911b9a554cdc5844d863a91b1ef283a," CRM_meta_on_node="virt-009" CRM_meta_on_node_uuid="2" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
 |  | ||||||
|        </crm_event> |  | ||||||
|      </action_set> |  | ||||||
|      <inputs/> |  | ||||||
| @@ -92,7 +92,7 @@
 |  | ||||||
|    <synapse id="7"> |  | ||||||
|      <action_set> |  | ||||||
|        <crm_event id="2" operation="stonith" operation_key="stonith-virt-008-on" on_node="virt-008" on_node_uuid="1"> |  | ||||||
| -        <attributes CRM_meta_on_node="virt-008" CRM_meta_on_node_uuid="1" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
 |  | ||||||
| +        <attributes CRM_meta_digests_all="fence_scsi:fence_scsi:5950f402238c1e5058a556fe39bb09de," CRM_meta_digests_secure="fence_scsi:fence_scsi:a911b9a554cdc5844d863a91b1ef283a," CRM_meta_on_node="virt-008" CRM_meta_on_node_uuid="1" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
 |  | ||||||
|        </crm_event> |  | ||||||
|      </action_set> |  | ||||||
|      <inputs/> |  | ||||||
| diff --git a/cts/scheduler/exp/unfence-parameters.exp b/cts/scheduler/exp/unfence-parameters.exp
 |  | ||||||
| index 3e70cb8e9..268bf008e 100644
 |  | ||||||
| --- a/cts/scheduler/exp/unfence-parameters.exp
 |  | ||||||
| +++ b/cts/scheduler/exp/unfence-parameters.exp
 |  | ||||||
| @@ -357,7 +357,7 @@
 |  | ||||||
|    <synapse id="21"> |  | ||||||
|      <action_set> |  | ||||||
|        <crm_event id="28" operation="stonith" operation_key="stonith-virt-4-reboot" on_node="virt-4" on_node_uuid="4"> |  | ||||||
| -        <attributes CRM_meta_on_node="virt-4" CRM_meta_on_node_uuid="4" CRM_meta_stonith_action="reboot" />
 |  | ||||||
| +        <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-4" CRM_meta_on_node_uuid="4" CRM_meta_stonith_action="reboot" />
 |  | ||||||
|          <downed> |  | ||||||
|            <node id="4"/> |  | ||||||
|          </downed> |  | ||||||
| @@ -368,7 +368,7 @@
 |  | ||||||
|    <synapse id="22"> |  | ||||||
|      <action_set> |  | ||||||
|        <crm_event id="3" operation="stonith" operation_key="stonith-virt-3-on" on_node="virt-3" on_node_uuid="3"> |  | ||||||
| -        <attributes CRM_meta_on_node="virt-3" CRM_meta_on_node_uuid="3" CRM_meta_stonith_action="on" />
 |  | ||||||
| +        <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-3" CRM_meta_on_node_uuid="3" CRM_meta_stonith_action="on" />
 |  | ||||||
|        </crm_event> |  | ||||||
|      </action_set> |  | ||||||
|      <inputs/> |  | ||||||
| @@ -376,7 +376,7 @@
 |  | ||||||
|    <synapse id="23"> |  | ||||||
|      <action_set> |  | ||||||
|        <crm_event id="1" operation="stonith" operation_key="stonith-virt-1-on" on_node="virt-1" on_node_uuid="1"> |  | ||||||
| -        <attributes CRM_meta_on_node="virt-1" CRM_meta_on_node_uuid="1" CRM_meta_stonith_action="on" />
 |  | ||||||
| +        <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-1" CRM_meta_on_node_uuid="1" CRM_meta_stonith_action="on" />
 |  | ||||||
|        </crm_event> |  | ||||||
|      </action_set> |  | ||||||
|      <inputs> |  | ||||||
| diff --git a/cts/scheduler/exp/unfence-startup.exp b/cts/scheduler/exp/unfence-startup.exp
 |  | ||||||
| index 6745bff4b..f2d38e80c 100644
 |  | ||||||
| --- a/cts/scheduler/exp/unfence-startup.exp
 |  | ||||||
| +++ b/cts/scheduler/exp/unfence-startup.exp
 |  | ||||||
| @@ -173,7 +173,7 @@
 |  | ||||||
|    <synapse id="11"> |  | ||||||
|      <action_set> |  | ||||||
|        <crm_event id="28" operation="stonith" operation_key="stonith-virt-4-reboot" on_node="virt-4" on_node_uuid="4"> |  | ||||||
| -        <attributes CRM_meta_on_node="virt-4" CRM_meta_on_node_uuid="4" CRM_meta_stonith_action="reboot" />
 |  | ||||||
| +        <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-4" CRM_meta_on_node_uuid="4" CRM_meta_stonith_action="reboot" />
 |  | ||||||
|          <downed> |  | ||||||
|            <node id="4"/> |  | ||||||
|          </downed> |  | ||||||
| @@ -184,7 +184,7 @@
 |  | ||||||
|    <synapse id="12"> |  | ||||||
|      <action_set> |  | ||||||
|        <crm_event id="3" operation="stonith" operation_key="stonith-virt-3-on" on_node="virt-3" on_node_uuid="3"> |  | ||||||
| -        <attributes CRM_meta_on_node="virt-3" CRM_meta_on_node_uuid="3" CRM_meta_stonith_action="on" />
 |  | ||||||
| +        <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-3" CRM_meta_on_node_uuid="3" CRM_meta_stonith_action="on" />
 |  | ||||||
|        </crm_event> |  | ||||||
|      </action_set> |  | ||||||
|      <inputs/> |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| @ -1,38 +0,0 @@ | |||||||
| From fe9150bc4b740b3748fec34fe668df4f8c0d0e25 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Ken Gaillot <kgaillot@redhat.com> |  | ||||||
| Date: Tue, 9 Aug 2022 15:38:03 -0500 |  | ||||||
| Subject: [PATCH] Fix: tools: correct minimum execution status shown by |  | ||||||
|  crm_resource -O |  | ||||||
| 
 |  | ||||||
| regression introduced in 2.1.0 by 5ef28b946 |  | ||||||
| 
 |  | ||||||
| Fixes T533 |  | ||||||
| ---
 |  | ||||||
|  lib/pengine/pe_output.c | 4 ++-- |  | ||||||
|  1 file changed, 2 insertions(+), 2 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/lib/pengine/pe_output.c b/lib/pengine/pe_output.c
 |  | ||||||
| index 5d716fe6cb..dbb49637c9 100644
 |  | ||||||
| --- a/lib/pengine/pe_output.c
 |  | ||||||
| +++ b/lib/pengine/pe_output.c
 |  | ||||||
| @@ -1878,7 +1878,7 @@ node_and_op(pcmk__output_t *out, va_list args) {
 |  | ||||||
|      time_t last_change = 0; |  | ||||||
|   |  | ||||||
|      pcmk__scan_min_int(crm_element_value(xml_op, XML_LRM_ATTR_OPSTATUS), |  | ||||||
| -                       &status, 0);
 |  | ||||||
| +                       &status, PCMK_EXEC_UNKNOWN);
 |  | ||||||
|   |  | ||||||
|      rsc = pe_find_resource(data_set->resources, op_rsc); |  | ||||||
|   |  | ||||||
| @@ -1932,7 +1932,7 @@ node_and_op_xml(pcmk__output_t *out, va_list args) {
 |  | ||||||
|      xmlNode *node = NULL; |  | ||||||
|   |  | ||||||
|      pcmk__scan_min_int(crm_element_value(xml_op, XML_LRM_ATTR_OPSTATUS), |  | ||||||
| -                       &status, 0);
 |  | ||||||
| +                       &status, PCMK_EXEC_UNKNOWN);
 |  | ||||||
|      node = pcmk__output_create_xml_node(out, "operation", |  | ||||||
|                                          "op", op_key ? op_key : ID(xml_op), |  | ||||||
|                                          "node", crm_element_value(xml_op, XML_ATTR_UNAME), |  | ||||||
| -- 
 |  | ||||||
| 2.31.1 |  | ||||||
| 
 |  | ||||||
| @ -35,11 +35,11 @@ | |||||||
| ## Upstream pacemaker version, and its package version (specversion | ## Upstream pacemaker version, and its package version (specversion | ||||||
| ## can be incremented to build packages reliably considered "newer" | ## can be incremented to build packages reliably considered "newer" | ||||||
| ## than previously built packages with the same pcmkversion) | ## than previously built packages with the same pcmkversion) | ||||||
| %global pcmkversion 2.1.4 | %global pcmkversion 2.1.5 | ||||||
| %global specversion 5 | %global specversion 1 | ||||||
| 
 | 
 | ||||||
| ## Upstream commit (full commit ID, abbreviated commit ID, or tag) to build | ## Upstream commit (full commit ID, abbreviated commit ID, or tag) to build | ||||||
| %global commit dc6eb4362e67c1497a413434eba097063bf1ef83 | %global commit d3699a6216bdf59de6f416ed73bc1bc9ca727dc2 | ||||||
| 
 | 
 | ||||||
| ## Since git v2.11, the extent of abbreviation is autoscaled by default | ## Since git v2.11, the extent of abbreviation is autoscaled by default | ||||||
| ## (used to be constant of 7), so we need to convey it for non-tags, too. | ## (used to be constant of 7), so we need to convey it for non-tags, too. | ||||||
| @ -264,18 +264,7 @@ Source0:       https://codeload.github.com/%{github_owner}/%{name}/tar.gz/%{arch | |||||||
| Source1:       nagios-agents-metadata-%{nagios_hash}.tar.gz | Source1:       nagios-agents-metadata-%{nagios_hash}.tar.gz | ||||||
| 
 | 
 | ||||||
| # upstream commits | # upstream commits | ||||||
| Patch001:      001-stonith-enabled.patch | #Patch001:      001-xxxx.patch | ||||||
| Patch002:      002-acl_group.patch |  | ||||||
| Patch003:      003-regression.patch |  | ||||||
| Patch004:      004-schema.patch |  | ||||||
| Patch005:      005-schema.patch |  | ||||||
| Patch006:      006-crm_resource.patch |  | ||||||
| Patch007:      007-stonith_admin.patch |  | ||||||
| Patch008:      008-metadata.patch |  | ||||||
| Patch009:      009-validate.patch |  | ||||||
| Patch010:      010-regression.patch |  | ||||||
| Patch011:      011-unfencing.patch |  | ||||||
| Patch012:      012-crm_resource.patch |  | ||||||
| 
 | 
 | ||||||
| # downstream-only commits | # downstream-only commits | ||||||
| #Patch1xx:      1xx-xxxx.patch | #Patch1xx:      1xx-xxxx.patch | ||||||
| @ -362,6 +351,9 @@ BuildRequires: inkscape | |||||||
| BuildRequires: %{python_name}-sphinx | BuildRequires: %{python_name}-sphinx | ||||||
| %endif | %endif | ||||||
| 
 | 
 | ||||||
|  | # Booth requires this | ||||||
|  | Provides:      pacemaker-ticket-support = 2.0 | ||||||
|  | 
 | ||||||
| Provides:      pcmk-cluster-manager = %{version}-%{release} | Provides:      pcmk-cluster-manager = %{version}-%{release} | ||||||
| Provides:      pcmk-cluster-manager%{?_isa} = %{version}-%{release} | Provides:      pcmk-cluster-manager%{?_isa} = %{version}-%{release} | ||||||
| 
 | 
 | ||||||
| @ -383,7 +375,8 @@ when related resources fail and can be configured to periodically check | |||||||
| resource health. | resource health. | ||||||
| 
 | 
 | ||||||
| Available rpmbuild rebuild options: | Available rpmbuild rebuild options: | ||||||
|   --with(out) : cibsecrets doc hardening nls pre_release profiling stonithd |   --with(out) : cibsecrets hardening nls pre_release profiling | ||||||
|  |                 stonithd | ||||||
| 
 | 
 | ||||||
| %package cli | %package cli | ||||||
| License:       GPLv2+ and LGPLv2+ | License:       GPLv2+ and LGPLv2+ | ||||||
| @ -492,6 +485,7 @@ Requires:      %{pkgname_pcmk_libs} = %{version}-%{release} | |||||||
| Requires:      %{name}-cli = %{version}-%{release} | Requires:      %{name}-cli = %{version}-%{release} | ||||||
| Requires:      %{pkgname_procps} | Requires:      %{pkgname_procps} | ||||||
| Requires:      psmisc | Requires:      psmisc | ||||||
|  | Requires:      %{python_name}-psutil | ||||||
| BuildArch:     noarch | BuildArch:     noarch | ||||||
| 
 | 
 | ||||||
| # systemd Python bindings are a separate package in some distros | # systemd Python bindings are a separate package in some distros | ||||||
| @ -964,6 +958,15 @@ exit 0 | |||||||
| %license %{nagios_name}-%{nagios_hash}/COPYING | %license %{nagios_name}-%{nagios_hash}/COPYING | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Tue Nov 22 2022 Chris Lumens <clumens@redhat.com> - 2.1.5-1 | ||||||
|  | - Rebase on upstream 2.1.5-rc2 release | ||||||
|  | - Resolves: rhbz1822125 | ||||||
|  | - Resolves: rhbz2095662 | ||||||
|  | - Resolves: rhbz2121852 | ||||||
|  | - Resolves: rhbz2122806 | ||||||
|  | - Resolves: rhbz2133497 | ||||||
|  | - Resolves: rhbz2142681 | ||||||
|  | 
 | ||||||
| * Wed Aug 10 2022 Ken Gaillot <kgaillot@redhat.com> - 2.1.4-5 | * Wed Aug 10 2022 Ken Gaillot <kgaillot@redhat.com> - 2.1.4-5 | ||||||
| - Fix regression in crm_resource -O | - Fix regression in crm_resource -O | ||||||
| - Resolves: rhbz2118337 | - Resolves: rhbz2118337 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user