Page MenuHomeClusterLabs Projects

No OneTemporary

This file is larger than 256 KB, so syntax highlighting was skipped.
diff --git a/.gitignore b/.gitignore
index 70dab3d3b0..70e69022cc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,251 +1,251 @@
# Common
\#*
.\#*
GPATH
GRTAGS
GTAGS
TAGS
Makefile
Makefile.in
.deps
.dirstamp
.libs
*.pc
*.pyc
*.bz2
*.tar.gz
*.tgz
*.la
*.lo
*.o
*~
*.gcda
*.gcno
# Autobuild
aclocal.m4
autoconf
autoheader
autom4te.cache/
automake
build.counter
compile
/confdefs.h
config.guess
config.log
config.status
config.sub
configure
/conftest*
depcomp
install-sh
include/stamp-*
libtool
libtool.m4
ltdl.m4
libltdl
ltmain.sh
missing
py-compile
/m4/argz.m4
/m4/ltargz.m4
/m4/ltoptions.m4
/m4/ltsugar.m4
/m4/ltversion.m4
/m4/lt~obsolete.m4
test-driver
ylwrap
# Configure targets
/cts/CTS.py
/cts/CTSlab.py
/cts/CTSvars.py
/cts/LSBDummy
/cts/OCFIPraTest.py
/cts/benchmark/clubench
/cts/cluster_test
/cts/cts
/cts/cts-cli
/cts/cts-coverage
/cts/cts-exec
/cts/cts-fencing
/cts/cts-log-watcher
/cts/cts-regression
/cts/cts-scheduler
/cts/cts-support
/cts/fence_dummy
/cts/lxc_autogen.sh
/cts/pacemaker-cts-dummyd
/cts/pacemaker-cts-dummyd@.service
/daemons/execd/pacemaker_remote
/daemons/execd/pacemaker_remote.service
/daemons/fenced/fence_legacy
/daemons/pacemakerd/pacemaker
/daemons/pacemakerd/pacemaker.combined.upstart
/daemons/pacemakerd/pacemaker.service
/daemons/pacemakerd/pacemaker.upstart
/doc/Doxyfile
/extra/logrotate/pacemaker
/extra/resources/ClusterMon
/extra/resources/HealthSMART
/extra/resources/SysInfo
/extra/resources/ifspeed
/extra/resources/o2cb
include/config.h
include/config.h.in
include/crm_config.h
-publican.cfg
/tools/cibsecret
/tools/crm_error
/tools/crm_failcount
/tools/crm_master
/tools/crm_mon.service
/tools/crm_mon.upstart
/tools/crm_report
/tools/crm_rule
/tools/crm_standby
/tools/pcmk_simtimes
/tools/report.collector
/tools/report.common
# Build targets
*.7
*.7.xml
*.7.html
*.8
*.8.xml
*.8.html
/daemons/attrd/pacemaker-attrd
/daemons/based/pacemaker-based
/daemons/based/cibmon
/daemons/controld/pacemaker-controld
/daemons/execd/cts-exec-helper
/daemons/execd/pacemaker-execd
/daemons/execd/pacemaker-remoted
/daemons/fenced/cts-fence-helper
/daemons/fenced/pacemaker-fenced
/daemons/fenced/pacemaker-fenced.xml
/daemons/pacemakerd/pacemakerd
/daemons/schedulerd/pacemaker-schedulerd
/daemons/schedulerd/pacemaker-schedulerd.xml
-/doc/*/tmp/**
-/doc/*/publish
-/doc/*.build
-/doc/*/en-US/Ap-*.xml
-/doc/*/en-US/Ch-*.xml
/doc/.ABI-build
/doc/HTML
/doc/abi_dumps
/doc/abi-check
/doc/api/*
/doc/compat_reports
/doc/crm_fencing.html
-/doc/publican-catalog*
-/doc/shared/en-US/*.xml
/doc/sphinx/*/_build
/doc/sphinx/*/conf.py
/doc/sphinx/shared/images/*.png
/lib/common/md5.c
/maint/testcc_helper.cc
/maint/testcc_*_h
/maint/mocked/based
scratch
/tools/attrd_updater
/tools/cibadmin
/tools/crmadmin
/tools/crm_attribute
/tools/crm_diff
/tools/crm_mon
/tools/crm_node
/tools/crm_resource
/tools/crm_shadow
/tools/crm_simulate
/tools/crm_ticket
/tools/crm_verify
/tools/iso8601
/tools/stonith_admin
xml/crm.dtd
xml/pacemaker*.rng
xml/versions.rng
xml/api/api-result*.rng
lib/gnu/libgnu.a
lib/gnu/stdalign.h
*.coverity
# Packager artifacts
*.rpm
/mock
/pacemaker.spec
/rpm/[A-Z]*
# make dist/export working directory
pacemaker-[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]
# Test detritus
/cts/.regression.failed.diff
/cts/scheduler/*.ref
/cts/scheduler/*.up
/cts/scheduler/*.up.err
/cts/scheduler/bug-rh-1097457.log
/cts/scheduler/bug-rh-1097457.trs
/cts/scheduler/shadow.*
/cts/test-suite.log
/lib/*/tests/*/*.log
/lib/*/tests/*/*_test
/lib/*/tests/*/*.trs
/xml/test-*/*.up
/xml/test-*/*.up.err
/xml/assets/*.rng
/xml/assets/diffview.js
/xml/assets/xmlcatalog
# Release maintenance detritus
/maint/gnulib
# Formerly built files (helps when jumping back and forth in checkout)
/.ABI-build
/Doxyfile
/HTML
/abi_dumps
/abi-check
/compat_reports
/attrd
/cib
/coverage.sh
/crmd
/cts/HBDummy
+/doc/*.build
+/doc/*/en-US/Ap-*.xml
+/doc/*/en-US/Ch-*.xml
+/doc/*/publican.cfg
+/doc/*/publish
+/doc/*/tmp/**
/doc/Clusters_from_Scratch.txt
/doc/Pacemaker_Explained.txt
/doc/acls.html
+/doc/publican-catalog*
+/doc/shared/en-US/*.xml
/doc/shared/en-US/images/pcmk-*.png
/doc/shared/en-US/images/Policy-Engine-*.png
/fencing
/lib/common/tests/flags/pcmk__clear_flags_as
/lib/common/tests/flags/pcmk__set_flags_as
/lib/common/tests/flags/pcmk_all_flags_set
/lib/common/tests/flags/pcmk_any_flags_set
/lib/common/tests/operations/parse_op_key
/lib/common/tests/strings/pcmk__btoa
/lib/common/tests/strings/pcmk__parse_ll_range
/lib/common/tests/strings/pcmk__scan_double
/lib/common/tests/strings/pcmk__str_any_of
/lib/common/tests/strings/pcmk__strcmp
/lib/common/tests/strings/pcmk__char_in_any_str
/lib/common/tests/utils/pcmk_str_is_infinity
/lib/common/tests/utils/pcmk_str_is_minus_infinity
/lib/pengine/tests/rules/pe_cron_range_satisfied
/lrmd
/mcp
/pacemaker-*.spec
/pengine
#Other
coverity-*
logs
*.patch
*.diff
*.sed
*.orig
*.rej
*.swp
diff --git a/INSTALL.md b/INSTALL.md
index d61b9f0e84..dc4fe00805 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -1,77 +1,76 @@
# How to Install Pacemaker
## Build Dependencies
| Version | Fedora-based | Suse-based | Debian-based |
|:---------------:|:------------------:|:------------------:|:--------------:|
| 1.11 or later | automake | automake | automake |
| 2.64 or later | autoconf | autoconf | autoconf |
| | libtool | libtool | libtool |
| | libtool-ltdl-devel | | libltdl-dev |
| | libuuid-devel | libuuid-devel | uuid-dev |
| | pkgconfig | pkgconfig | pkg-config |
| 2.16.0 or later | glib2-devel | glib2-devel | libglib2.0-dev |
| | libxml2-devel | libxml2-devel | libxml2-dev |
| | libxslt-devel | libxslt-devel | libxslt-dev |
| | bzip2-devel | libbz2-devel | libbz2-dev |
| | libqb-devel | libqb-devel | libqb-dev |
Also: GNU make, and Python 2.7 or Python 3.2 or later
### Cluster Stack Dependencies
*Only corosync is currently supported*
| Version | Fedora-based | Suse-based | Debian-based |
|:---------------:|:------------------:|:------------------:|:--------------:|
| 2.0.0 or later | corosynclib | libcorosync | corosync |
| 2.0.0 or later | corosynclib-devel | libcorosync-devel | |
| | | | libcfg-dev |
| | | | libcpg-dev |
| | | | libcmap-dev |
| | | | libquorum-dev |
### Optional Build Dependencies
| Feature Enabled | Version | Fedora-based | Suse-based | Debian-based |
|:-----------------------------------------------:|:--------------:|:-----------------------:|:-----------------------:|:-----------------------:|
| Pacemaker Remote and encrypted remote CIB admin | 2.1.7 or later | gnutls-devel | libgnutls-devel | libgnutls-dev |
| encrypted remote CIB admin | | pam-devel | pam-devel | libpam0g-dev |
| interactive crm_mon | | ncurses-devel | ncurses-devel | ncurses-dev |
| systemd support | | systemd-devel | systemd-devel | libsystemd-dev |
| systemd/upstart resource support | | dbus-devel | dbus-devel | libdbus-1-dev |
| Linux-HA style fencing agents | | cluster-glue-libs-devel | libglue-devel | cluster-glue-dev |
| documentation | | asciidoc or asciidoctor | asciidoc or asciidoctor | asciidoc or asciidoctor |
| documentation | | help2man | help2man | help2man |
-| documentation | | publican | | publican |
| documentation | | inkscape | inkscape | inkscape |
| documentation | | docbook-style-xsl | docbook-xsl-stylesheets | docbook-xsl |
| documentation | | python-sphinx or python3-sphinx | python-sphinx or python3-sphinx | python-sphinx or python3-sphinx |
| documentation (PDF) | | texlive, texlive-titlesec, texlive-framed, texlive-threeparttable texlive-wrapfig texlive-multirow | texlive, texlive-latex | texlive, texlive-latex-extra |
## Optional testing dependencies
* valgrind (if running CTS valgrind tests)
* systemd-python (if using CTS on cluster nodes running systemd)
* rsync (if running CTS container tests)
* libvirt-daemon-driver-lxc (if running CTS container tests)
* libvirt-daemon-lxc (if running CTS container tests)
* libvirt-login-shell (if running CTS container tests)
* nmap (if not specifying an IP address base)
* oprofile (if running CTS profiling tests)
* dlm (to log DLM debugging info after CTS tests)
## Simple install
$ make && sudo make install
If GNU make is not your default make, use "gmake" instead.
## Detailed install
First, browse the build options that are available:
$ ./autogen.sh
$ ./configure --help
Re-run ./configure with any options you want, then proceed with the simple
method.
diff --git a/Makefile.am b/Makefile.am
index 0765057761..b6dcb849fb 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,127 +1,114 @@
#
# Copyright 2003-2019 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.
#
# m4/glibtests.m4 is copied from https://gitlab.gnome.org/GNOME/glib/blob/master/m4macros/glibtests.m4.
EXTRA_DIST = CONTRIBUTING.md \
GNUmakefile \
INSTALL.md \
README.markdown \
autogen.sh \
m4/glibtests.m4 \
m4/gnulib-cache.m4 \
m4/gnulib-tool.m4 \
rpm/rpmlintrc \
rpm/pacemaker.spec.in
DISTCLEANFILES = config.status
MAINTAINERCLEANFILES = Makefile.in \
aclocal.m4 \
config.guess \
config.sub \
configure \
depcomp \
install-sh \
ltmain.sh \
missing \
py-compile \
test-driver
-# Disable building Publican documentation when doing "make distcheck", because
-# some of our book sources are in the source directory, while others are
-# dynamically generated in the build directory, and publican can't handle that.
-#
-# In a non-VPATH build, doc isn't entered with a plain "make" because the
-# GNUmakefile sets "core" as the default target. However in a VPATH build,
-# there is no GNUmakefile, so "all" becomes the default target.
-#
-# Also, don't try to install files outside the build directory.
-#
-# @TODO To support VPATH builds for Publican, we could use the same "copy all
-# static inputs into the build tree" trick that xml/Makefile.am uses for
-# static schema files.
-AM_DISTCHECK_CONFIGURE_FLAGS = --with-brand="" \
- --prefix="$$dc_install_base/usr" \
+# Don't try to install files outside build directory for "make distcheck".
+AM_DISTCHECK_CONFIGURE_FLAGS = --prefix="$$dc_install_base/usr" \
--sysconfdir="$$dc_install_base/etc" \
--with-initdir="$$dc_install_base/etc/init.d" \
--with-ocfdir="$$dc_install_base/usr/lib/ocf" \
--with-systemdsystemunitdir="$$dc_install_base$(systemdsystemunitdir)"
# Only these will get installed with a plain "make install"
CORE_INSTALL = replace include lib daemons tools xml
# Only these will get built with a plain "make" or "make clean"
CORE = $(CORE_INSTALL) cts
SUBDIRS = $(CORE) devel doc extra maint tests
AM_CPPFLAGS = -I$(top_srcdir)/include
doc_DATA = README.markdown COPYING
licensedir = $(docdir)/licenses/
dist_license_DATA = $(wildcard licenses/*)
# Scratch file for ad-hoc testing
EXTRA_PROGRAMS = scratch
nodist_scratch_SOURCES = scratch.c
scratch_LDADD = $(top_builddir)/lib/common/libcrmcommon.la
core:
@echo "Building only core components and tests: $(CORE)"
@for subdir in $(CORE); do \
echo "Building $$subdir"; \
$(MAKE) $(AM_MAKEFLAGS) -C $$subdir all || exit 1; \
done
core-install:
@echo "Installing only core components: $(CORE_INSTALL)"
@for subdir in $(CORE_INSTALL); do \
echo "Installing $$subdir"; \
$(MAKE) $(AM_MAKEFLAGS) -C $$subdir install || exit 1; \
done
core-clean:
@echo "Cleaning only core components and tests: $(CORE)"
@for subdir in $(CORE); do \
echo "Cleaning $$subdir"; \
$(MAKE) $(AM_MAKEFLAGS) -C $$subdir clean || exit 1; \
done
install-exec-local:
$(INSTALL) -d -m 750 $(DESTDIR)/$(PACEMAKER_CONFIG_DIR)
$(INSTALL) -d -m 750 $(DESTDIR)/$(CRM_CONFIG_DIR)
$(INSTALL) -d -m 750 $(DESTDIR)/$(CRM_CORE_DIR)
$(INSTALL) -d -m 750 $(DESTDIR)/$(CRM_BLACKBOX_DIR)
$(INSTALL) -d -m 770 $(DESTDIR)/$(CRM_LOG_DIR)
$(INSTALL) -d -m 770 $(DESTDIR)/$(CRM_BUNDLE_DIR)
-chgrp $(CRM_DAEMON_GROUP) $(DESTDIR)/$(PACEMAKER_CONFIG_DIR)
-chown $(CRM_DAEMON_USER):$(CRM_DAEMON_GROUP) $(DESTDIR)/$(CRM_CONFIG_DIR)
-chown $(CRM_DAEMON_USER):$(CRM_DAEMON_GROUP) $(DESTDIR)/$(CRM_CORE_DIR)
-chown $(CRM_DAEMON_USER):$(CRM_DAEMON_GROUP) $(DESTDIR)/$(CRM_BLACKBOX_DIR)
-chown $(CRM_DAEMON_USER):$(CRM_DAEMON_GROUP) $(DESTDIR)/$(CRM_LOG_DIR)
-chown $(CRM_DAEMON_USER):$(CRM_DAEMON_GROUP) $(DESTDIR)/$(CRM_BUNDLE_DIR)
# Use chown because the user/group may not exist
clean-generic:
-rm -f *.tar.bz2 *.sed
PACKAGE ?= pacemaker
# In a normal build, this file is included by GNUmakefile, which serves as the
# "real" makefile. But in a VPATH build, GNUmakefile won't exist in the build
# tree, and this file will be the "real" makefile. EXTRA_CLEAN_TARGETS handles
# both cases: GNUmakefile defines it before including this file, so the
# clean-local target can clean up files created by GNUmakefile targets.
# If this file is used alone, the variable will be undefined.
clean-local: $(EXTRA_CLEAN_TARGETS)
-rm -f scratch $(builddir)/$(PACKAGE)-*.tar.gz
distclean-local:
-rm -rf libltdl autom4te.cache
diff --git a/configure.ac b/configure.ac
index 69398fba4d..62434a368d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,2127 +1,2087 @@
dnl
dnl autoconf for Pacemaker
dnl
dnl Copyright 2009-2020 the Pacemaker project contributors
dnl
dnl The version control history for this file may have further details.
dnl
dnl This source code is licensed under the GNU General Public License version 2
dnl or later (GPLv2+) WITHOUT ANY WARRANTY.
dnl ===============================================
dnl Bootstrap
dnl ===============================================
AC_PREREQ(2.64)
AC_CONFIG_MACRO_DIR([m4])
AC_DEFUN([AC_DATAROOTDIR_CHECKED])
dnl Suggested structure:
dnl information on the package
dnl checks for programs
dnl checks for libraries
dnl checks for header files
dnl checks for types
dnl checks for structures
dnl checks for compiler characteristics
dnl checks for library functions
dnl checks for system services
m4_include([version.m4])
AC_INIT([pacemaker], VERSION_NUMBER, [users@clusterlabs.org], [pacemaker],
PCMK_URL)
PCMK_FEATURES=""
AC_CONFIG_AUX_DIR(.)
AC_CANONICAL_HOST
dnl Where #defines go (e.g. `AC_CHECK_HEADERS' below)
dnl
dnl Internal header: include/config.h
dnl - Contains ALL defines
dnl - include/config.h.in is generated automatically by autoheader
dnl - NOT to be included in any header files except crm_internal.h
dnl (which is also not to be included in any other header files)
dnl
dnl External header: include/crm_config.h
dnl - Contains a subset of defines checked here
dnl - Manually edit include/crm_config.h.in to have configure include
dnl new defines
dnl - Should not include HAVE_* defines
dnl - Safe to include anywhere
AC_CONFIG_HEADERS([include/config.h include/crm_config.h])
dnl 1.11: minimum automake version required
dnl foreign: don't require GNU-standard top-level files
dnl tar-ustar: use (older) POSIX variant of generated tar rather than v7
dnl silent-rules: allow "--enable-silent-rules" (no-op in 1.13+)
dnl subdir-objects: keep .o's with their .c's (no-op in 2.0+)
AM_INIT_AUTOMAKE([1.11 foreign tar-ustar silent-rules subdir-objects])
dnl Require pkg-config (with a minimum version)
PKG_PROG_PKG_CONFIG(0.18)
AS_IF([test "x${PKG_CONFIG}" != x], [],
[AC_MSG_ERROR([pkgconfig must be installed to build ${PACKAGE}])])
dnl PKG_NOARCH_INSTALLDIR is not available prior to pkg-config 0.27 and
dnl pkgconf 0.8.10 (uncomment next line to mimic that scenario)
dnl m4_ifdef([PKG_NOARCH_INSTALLDIR], [m4_undefine([PKG_NOARCH_INSTALLDIR])])
m4_ifndef([PKG_NOARCH_INSTALLDIR], [
AC_DEFUN([PKG_NOARCH_INSTALLDIR], [
AC_SUBST([noarch_pkgconfigdir], ['${datadir}/pkgconfig'])
])
])
PKG_NOARCH_INSTALLDIR
dnl Example 2.4. Silent Custom Rule to Generate a File
dnl %-bar.pc: %.pc
dnl $(AM_V_GEN)$(LN_S) $(notdir $^) $@
dnl Versioned attributes implementation is not yet production-ready
AC_DEFINE_UNQUOTED(ENABLE_VERSIONED_ATTRS, 0, [Enable versioned attributes])
CC_IN_CONFIGURE=yes
export CC_IN_CONFIGURE
LDD=ldd
GLIB_TESTS
dnl ========================================================================
dnl Compiler characteristics
dnl ========================================================================
AC_PROG_CC dnl Can force other with environment variable "CC".
AC_PROG_CC_STDC
AC_PROG_CXX dnl C++ is not needed for build, just maintainer utilities
dnl We use md5.c from gnulib, which has its own m4 macros. Per its docs:
dnl "The macro gl_EARLY must be called as soon as possible after verifying that
dnl the C compiler is working. ... The core part of the gnulib checks are done
dnl by the macro gl_INIT." In addition, prevent gnulib from introducing OpenSSL
dnl as a dependency.
gl_EARLY
gl_SET_CRYPTO_CHECK_DEFAULT([no])
gl_INIT
# --enable-new-dtags: Use RUNPATH instead of RPATH.
# It is necessary to have this done before libtool does linker detection.
# See also: https://github.com/kronosnet/kronosnet/issues/107
AX_CHECK_LINK_FLAG([-Wl,--enable-new-dtags],
[AM_LDFLAGS=-Wl,--enable-new-dtags],
[AC_MSG_ERROR(["Linker support for --enable-new-dtags is required"])])
AC_SUBST([AM_LDFLAGS])
saved_LDFLAGS="$LDFLAGS"
LDFLAGS="$AM_LDFLAGS $LDFLAGS"
LT_INIT([dlopen])
LDFLAGS="$saved_LDFLAGS"
LTDL_INIT([convenience])
AC_TYPE_SIZE_T
AC_CHECK_SIZEOF(char)
AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
AC_CHECK_SIZEOF(long long)
dnl ===============================================
dnl Helpers
dnl ===============================================
cc_supports_flag() {
local CFLAGS="-Werror $@"
AC_MSG_CHECKING(whether $CC supports "$@")
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[ ]])],
[RC=0; AC_MSG_RESULT(yes)],
[RC=1; AC_MSG_RESULT(no)])
return $RC
}
# Some tests need to use their own CFLAGS
cc_temp_flags() {
ac_save_CFLAGS="$CFLAGS"
CFLAGS="$*"
}
cc_restore_flags() {
CFLAGS=$ac_save_CFLAGS
}
dnl ===============================================
dnl Configure Options
dnl ===============================================
dnl Actual library checks come later, but pkg-config can be used here to grab
dnl external values to use as defaults for configure options
dnl --enable-* options
AC_ARG_ENABLE([ansi],
[AS_HELP_STRING([--enable-ansi],
[force GCC to compile to ANSI standard for older compilers. @<:@no@:>@])],
)
AC_ARG_ENABLE([fatal-warnings],
[AS_HELP_STRING([--enable-fatal-warnings],
[enable pedantic and fatal warnings for gcc @<:@yes@:>@])],
)
AC_ARG_ENABLE([quiet],
[AS_HELP_STRING([--enable-quiet],
[suppress make output unless there is an error @<:@no@:>@])],
)
AC_ARG_ENABLE([no-stack],
[AS_HELP_STRING([--enable-no-stack],
[build only the scheduler and its requirements @<:@no@:>@])],
)
AC_ARG_ENABLE([upstart],
[AS_HELP_STRING([--enable-upstart],
[enable support for managing resources via Upstart @<:@try@:>@])],
[],
[enable_upstart=try],
)
AC_ARG_ENABLE([systemd],
[AS_HELP_STRING([--enable-systemd],
[enable support for managing resources via systemd @<:@try@:>@])],
[],
[enable_systemd=try],
)
AC_ARG_ENABLE([hardening],
[AS_HELP_STRING([--enable-hardening],
[harden the resulting executables/libraries @<:@try@:>@])],
[ HARDENING="${enableval}" ],
[ HARDENING=try ],
)
# By default, we add symlinks at the pre-2.0.0 daemon name locations, so that:
# (1) tools that directly invoke those names for metadata etc. will still work
# (2) this installation can be used in a bundle container image used with
# cluster hosts running Pacemaker 1.1.17+
# If you know your target systems will not have any need for it, you can
# disable this option. Once the above use cases are no longer in wide use, we
# can disable this option by default, and once we no longer want to support
# them at all, we can drop the option altogether.
AC_ARG_ENABLE([legacy-links],
[AS_HELP_STRING([--enable-legacy-links],
[add symlinks for old daemon names @<:@yes@:>@])],
[ LEGACY_LINKS="${enableval}" ],
[ LEGACY_LINKS=yes ],
)
AM_CONDITIONAL(BUILD_LEGACY_LINKS, test "x${LEGACY_LINKS}" = "xyes")
dnl --with-* options
AC_DEFUN([VERSION_ARG],
[AC_ARG_WITH([version],
[AS_HELP_STRING([--with-version=VERSION],
[override package version @<:@$1@:>@])],
[ PACKAGE_VERSION="$withval" ])]
)
VERSION_ARG(VERSION_NUMBER)
AC_ARG_WITH([corosync],
[AS_HELP_STRING([--with-corosync],
[support the Corosync messaging and membership layer])],
[ SUPPORT_CS=$withval ],
[ SUPPORT_CS=try ],
)
AC_ARG_WITH([nagios],
[AS_HELP_STRING([--with-nagios],
[support nagios remote monitoring])],
[ SUPPORT_NAGIOS=$withval ],
[ SUPPORT_NAGIOS=try ],
)
AC_ARG_WITH([nagios-plugin-dir],
[AS_HELP_STRING([--with-nagios-plugin-dir=DIR],
[directory for nagios plugins @<:@LIBEXECDIR/nagios/plugins@:>@])],
[ NAGIOS_PLUGIN_DIR="$withval" ]
)
AC_ARG_WITH([nagios-metadata-dir],
[AS_HELP_STRING([--with-nagios-metadata-dir=DIR],
[directory for nagios plugins metadata @<:@DATADIR/nagios/plugins-metadata@:>@])],
[ NAGIOS_METADATA_DIR="$withval" ]
)
AC_ARG_WITH([acl],
[AS_HELP_STRING([--with-acl],
[support CIB ACL])],
[ SUPPORT_ACL=$withval ],
[ SUPPORT_ACL=yes ],
)
AC_ARG_WITH([cibsecrets],
[AS_HELP_STRING([--with-cibsecrets],
[support separate file for CIB secrets])],
[ SUPPORT_CIBSECRETS=$withval ],
[ SUPPORT_CIBSECRETS=no ],
)
PCMK_GNUTLS_PRIORITIES="NORMAL"
AC_ARG_WITH([gnutls-priorities],
[AS_HELP_STRING([--with-gnutls-priorities],
[default GnuTLS cipher priorities @<:@NORMAL@:>@])],
[ test x"$withval" = x"no" || PCMK_GNUTLS_PRIORITIES="$withval" ]
)
INITDIR=""
AC_ARG_WITH([initdir],
[AS_HELP_STRING([--with-initdir=DIR],
[directory for init (rc) scripts])],
[ INITDIR="$withval" ]
)
systemdsystemunitdir="${systemdsystemunitdir-}"
AC_ARG_WITH([systemdsystemunitdir],
[AS_HELP_STRING([--with-systemdsystemunitdir=DIR],
[directory for systemd unit files (advanced option: must match what systemd uses)])],
[ systemdsystemunitdir="$withval" ]
)
SUPPORT_PROFILING=0
AC_ARG_WITH([profiling],
[AS_HELP_STRING([--with-profiling],
[disable optimizations for effective profiling])],
[ SUPPORT_PROFILING=$withval ]
)
AC_ARG_WITH([coverage],
[AS_HELP_STRING([--with-coverage],
[disable optimizations for effective profiling])],
[ SUPPORT_COVERAGE=$withval ]
)
-PUBLICAN_BRAND="common"
-AC_ARG_WITH([brand],
- [AS_HELP_STRING([--with-brand=brand],
- [brand to use for generated documentation (set empty for no docs) @<:@common@:>@])],
- [ test x"$withval" = x"no" || PUBLICAN_BRAND="$withval" ]
-)
-AC_SUBST(PUBLICAN_BRAND)
-
BUG_URL=""
AC_ARG_WITH([bug-url],
[AS_HELP_STRING([--with-bug-url=DIR],
[address where users should submit bug reports @<:@https://bugs.clusterlabs.org/enter_bug.cgi?product=Pacemaker@:>@])],
[ BUG_URL="$withval" ]
)
CONFIGDIR=""
AC_ARG_WITH([configdir],
[AS_HELP_STRING([--with-configdir=DIR],
[directory for Pacemaker configuration file @<:@SYSCONFDIR/sysconfig@:>@])],
[ CONFIGDIR="$withval" ]
)
CRM_LOG_DIR=""
AC_ARG_WITH([logdir],
[AS_HELP_STRING([--with-logdir=DIR],
[directory for Pacemaker log file @<:@LOCALSTATEDIR/log/pacemaker@:>@])],
[ CRM_LOG_DIR="$withval" ]
)
CRM_BUNDLE_DIR=""
AC_ARG_WITH([bundledir],
[AS_HELP_STRING([--with-bundledir=DIR],
[directory for Pacemaker bundle logs @<:@LOCALSTATEDIR/log/pacemaker/bundles@:>@])],
[ CRM_BUNDLE_DIR="$withval" ]
)
AC_ARG_WITH([sanitizers],
[AS_HELP_STRING([--with-sanitizers=...,...],
[enable SANitizer build, do *NOT* use for production. Only ASAN/UBSAN/TSAN are currently supported])],
[ SANITIZERS="$withval" ],
[ SANITIZERS="" ])
dnl The not-yet-released autoconf 2.70 will have a --runstatedir option.
dnl Until that's available, emulate it with our own --with-runstatedir.
pcmk_runstatedir=""
AC_ARG_WITH([runstatedir],
[AS_HELP_STRING([--with-runstatedir=DIR],
[modifiable per-process data @<:@LOCALSTATEDIR/run@:>@ (ignored if --runstatedir is available)])],
[ pcmk_runstatedir="$withval" ]
)
dnl This defaults to /usr/lib rather than libdir because it's determined by the
dnl OCF project and not pacemaker. Even if a user wants to install pacemaker to
dnl /usr/local or such, the OCF agents will be expected in their usual
dnl location. However, we do give the user the option to override it.
OCF_ROOT_DIR="/usr/lib/ocf"
AC_ARG_WITH([ocfdir],
[AS_HELP_STRING([--with-ocfdir=DIR],
[OCF resource agent root directory (advanced option: changing this may break other cluster components unless similarly configured) @<:@/usr/lib/ocf@:>@])],
[ OCF_ROOT_DIR="$withval" ]
)
AC_SUBST(OCF_ROOT_DIR)
dnl Get default from fence-agents if available
PKG_CHECK_VAR([FA_PREFIX], [fence-agents], [prefix],
[PCMK__FENCE_BINDIR="${FA_PREFIX}/sbin"],
[PCMK__FENCE_BINDIR="$sbindir"])
AC_ARG_WITH([fence-bindir],
[AS_HELP_STRING([--with-fence-bindir=DIR], m4_normalize([
directory for executable fence agents @<:@value from fence-agents
package if available otherwise SBINDIR@:>@]))],
[ PCMK__FENCE_BINDIR="$withval" ]
)
AC_SUBST(PCMK__FENCE_BINDIR)
CRM_DAEMON_USER=""
AC_ARG_WITH([daemon-user],
[AS_HELP_STRING([--with-daemon-user=USER],
[user to run unprivileged Pacemaker daemons as (advanced option: changing this may break other cluster components unless similarly configured) @<:@hacluster@:>@])],
[ CRM_DAEMON_USER="$withval" ]
)
CRM_DAEMON_GROUP=""
AC_ARG_WITH([daemon-group],
[AS_HELP_STRING([--with-daemon-group=GROUP],
[group to run unprivileged Pacemaker daemons as (advanced option: changing this may break other cluster components unless similarly configured) @<:@haclient@:>@])],
[ CRM_DAEMON_GROUP="$withval" ]
)
dnl Deprecated options
AC_ARG_WITH([pkg-name],
[AS_HELP_STRING([--with-pkg-name=name],
[deprecated and unused (will be removed in a future release)])],
)
AC_ARG_WITH([pkgname],
[AS_HELP_STRING([--with-pkgname=name],
[deprecated and unused (will be removed in a future release)])],
)
dnl ===============================================
dnl General Processing
dnl ===============================================
AC_DEFINE_UNQUOTED(PACEMAKER_VERSION, "$PACKAGE_VERSION",
[Current pacemaker version])
PACKAGE_SERIES=`echo $PACKAGE_VERSION | awk -F. '{ print $1"."$2 }'`
AC_SUBST(PACKAGE_SERIES)
AC_SUBST(PACKAGE_VERSION)
AC_PROG_LN_S
AC_PROG_MKDIR_P
if cc_supports_flag -Werror; then
WERROR="-Werror"
else
WERROR=""
fi
# Normalize enable_fatal_warnings (defaulting to yes, when compiler supports it)
if test "x${enable_fatal_warnings}" != "xno" ; then
if test "$GCC" = "yes" && test "x${WERROR}" != "x" ; then
enable_fatal_warnings=yes
else
AC_MSG_NOTICE(Compiler does not support fatal warnings)
enable_fatal_warnings=no
fi
fi
INIT_EXT=""
echo Our Host OS: $host_os/$host
AC_MSG_NOTICE(Sanitizing prefix: ${prefix})
case $prefix in
NONE)
prefix=/usr
dnl Fix default variables - "prefix" variable if not specified
if test "$localstatedir" = "\${prefix}/var"; then
localstatedir="/var"
fi
if test "$sysconfdir" = "\${prefix}/etc"; then
sysconfdir="/etc"
fi
;;
esac
AC_MSG_NOTICE(Sanitizing exec_prefix: ${exec_prefix})
case $exec_prefix in
prefix|NONE)
exec_prefix=$prefix
;;
esac
AC_MSG_NOTICE(Sanitizing INITDIR: ${INITDIR})
case $INITDIR in
prefix) INITDIR=$prefix;;
"")
AC_MSG_CHECKING(which init (rc) directory to use)
for initdir in /etc/init.d /etc/rc.d/init.d /sbin/init.d \
/usr/local/etc/rc.d /etc/rc.d
do
if
test -d $initdir
then
INITDIR=$initdir
break
fi
done
AC_MSG_RESULT($INITDIR)
;;
esac
AC_SUBST(INITDIR)
AC_MSG_NOTICE(Sanitizing libdir: ${libdir})
case $libdir in
prefix|NONE)
AC_MSG_CHECKING(which lib directory to use)
for aDir in lib64 lib
do
trydir="${exec_prefix}/${aDir}"
if
test -d ${trydir}
then
libdir=${trydir}
break
fi
done
AC_MSG_RESULT($libdir);
;;
esac
dnl Expand autoconf variables so that we don't end up with '${prefix}'
dnl in #defines and python scripts
dnl NOTE: Autoconf deliberately leaves them unexpanded to allow
dnl make exec_prefix=/foo install
dnl No longer being able to do this seems like no great loss to me...
eval prefix="`eval echo ${prefix}`"
eval exec_prefix="`eval echo ${exec_prefix}`"
eval bindir="`eval echo ${bindir}`"
eval sbindir="`eval echo ${sbindir}`"
eval libexecdir="`eval echo ${libexecdir}`"
eval datadir="`eval echo ${datadir}`"
eval sysconfdir="`eval echo ${sysconfdir}`"
eval sharedstatedir="`eval echo ${sharedstatedir}`"
eval localstatedir="`eval echo ${localstatedir}`"
eval libdir="`eval echo ${libdir}`"
eval includedir="`eval echo ${includedir}`"
eval oldincludedir="`eval echo ${oldincludedir}`"
eval infodir="`eval echo ${infodir}`"
eval mandir="`eval echo ${mandir}`"
dnl Home-grown variables
if [ test "x${runstatedir}" = "x" ]; then
if [ test "x${pcmk_runstatedir}" = "x" ]; then
runstatedir="${localstatedir}/run"
else
runstatedir="${pcmk_runstatedir}"
fi
fi
eval runstatedir="$(eval echo ${runstatedir})"
AC_DEFINE_UNQUOTED([PCMK_RUN_DIR], ["$runstatedir"],
[Location for modifiable per-process data])
AC_SUBST(runstatedir)
eval INITDIR="${INITDIR}"
eval docdir="`eval echo ${docdir}`"
if test x"${docdir}" = x""; then
docdir=${datadir}/doc/${PACKAGE}-${VERSION}
fi
AC_SUBST(docdir)
if test x"${CONFIGDIR}" = x""; then
CONFIGDIR="${sysconfdir}/sysconfig"
fi
AC_SUBST(CONFIGDIR)
if test x"${CRM_LOG_DIR}" = x""; then
CRM_LOG_DIR="${localstatedir}/log/pacemaker"
fi
AC_DEFINE_UNQUOTED(CRM_LOG_DIR,"$CRM_LOG_DIR", Location for Pacemaker log file)
AC_SUBST(CRM_LOG_DIR)
if test x"${CRM_BUNDLE_DIR}" = x""; then
CRM_BUNDLE_DIR="${localstatedir}/log/pacemaker/bundles"
fi
AC_DEFINE_UNQUOTED(CRM_BUNDLE_DIR,"$CRM_BUNDLE_DIR", Location for Pacemaker bundle logs)
AC_SUBST(CRM_BUNDLE_DIR)
eval PCMK__FENCE_BINDIR="`eval echo ${PCMK__FENCE_BINDIR}`"
AC_DEFINE_UNQUOTED(PCMK__FENCE_BINDIR,"$PCMK__FENCE_BINDIR",
[Location for executable fence agents])
if test x"${PCMK_GNUTLS_PRIORITIES}" = x""; then
AC_MSG_ERROR([Empty string not applicable with --with-gnutls-priorities])
fi
AC_DEFINE_UNQUOTED([PCMK_GNUTLS_PRIORITIES], ["$PCMK_GNUTLS_PRIORITIES"],
[GnuTLS cipher priorities])
if test x"${BUG_URL}" = x""; then
BUG_URL="https://bugs.clusterlabs.org/enter_bug.cgi?product=Pacemaker"
fi
AC_SUBST(BUG_URL)
for j in prefix exec_prefix bindir sbindir libexecdir datadir sysconfdir \
sharedstatedir localstatedir libdir includedir oldincludedir infodir \
mandir INITDIR docdir CONFIGDIR
do
dirname=`eval echo '${'${j}'}'`
if
test ! -d "$dirname"
then
AC_MSG_WARN([$j directory ($dirname) does not exist!])
fi
done
us_auth=
AC_CHECK_HEADER([sys/socket.h], [
AC_CHECK_DECL([SO_PEERCRED], [
# Linux
AC_CHECK_TYPE([struct ucred], [
us_auth=peercred_ucred;
AC_DEFINE([US_AUTH_PEERCRED_UCRED], [1],
[Define if Unix socket auth method is
getsockopt(s, SO_PEERCRED, &ucred, ...)])
], [
# OpenBSD
AC_CHECK_TYPE([struct sockpeercred], [
us_auth=localpeercred_sockepeercred;
AC_DEFINE([US_AUTH_PEERCRED_SOCKPEERCRED], [1],
[Define if Unix socket auth method is
getsockopt(s, SO_PEERCRED, &sockpeercred, ...)])
], [], [[#include <sys/socket.h>]])
], [[#define _GNU_SOURCE
#include <sys/socket.h>]])
], [], [[#include <sys/socket.h>]])
])
if test -z "${us_auth}"; then
# FreeBSD
AC_CHECK_DECL([getpeereid], [
us_auth=getpeereid;
AC_DEFINE([US_AUTH_GETPEEREID], [1],
[Define if Unix socket auth method is
getpeereid(s, &uid, &gid)])
], [
# Solaris/OpenIndiana
AC_CHECK_DECL([getpeerucred], [
us_auth=getpeerucred;
AC_DEFINE([US_AUTH_GETPEERUCRED], [1],
[Define if Unix socket auth method is
getpeercred(s, &ucred)])
], [
AC_MSG_ERROR([No way to authenticate a Unix socket peer])
], [[#include <ucred.h>]])
])
fi
dnl This OS-based decision-making is poor autotools practice;
dnl feature-based mechanisms are strongly preferred.
dnl
dnl So keep this section to a bare minimum; regard as a "necessary evil".
case "$host_os" in
*bsd*)
AC_DEFINE_UNQUOTED(ON_BSD, 1, Compiling for BSD platform)
INIT_EXT=".sh"
;;
*solaris*)
AC_DEFINE_UNQUOTED(ON_SOLARIS, 1, Compiling for Solaris platform)
;;
*linux*)
AC_DEFINE_UNQUOTED(ON_LINUX, 1, Compiling for Linux platform)
;;
darwin*)
AC_DEFINE_UNQUOTED(ON_DARWIN, 1, Compiling for Darwin platform)
LIBS="$LIBS -L${prefix}/lib"
CFLAGS="$CFLAGS -I${prefix}/include"
;;
esac
AC_SUBST(INIT_EXT)
AC_MSG_NOTICE(Host CPU: $host_cpu)
case "$host_cpu" in
ppc64|powerpc64)
case $CFLAGS in
*powerpc64*)
;;
*)
if test "$GCC" = yes; then
CFLAGS="$CFLAGS -m64"
fi
;;
esac
;;
esac
# C99 doesn't guarantee uint64_t type and related format specifiers, but
# prerequisites, corosync + libqb, use that widely, so the target platforms
# are already pre-constrained to those "64bit-clean" (doesn't imply native
# bit width) and hence we deliberately refrain from artificial surrogates
# (sans manipulation through cached values).
AC_CACHE_VAL(
[pcmk_cv_decl_inttypes],
[
AC_CHECK_DECLS(
[PRIu64, PRIu32, PRIx32,
SCNu64],
[pcmk_cv_decl_inttypes="PRIu64 PRIu32 PRIx32 SCNu64"],
[
# test shall only react on "no" cached result & error out respectively
if test "x$ac_cv_have_decl_PRIu64" = xno; then
AC_MSG_ERROR([lack of inttypes.h based specifier serving uint64_t (PRIu64)])
elif test "x$ac_cv_have_decl_PRIu32" = xno; then
AC_MSG_ERROR([lack of inttypes.h based specifier serving uint32_t (PRIu32)])
elif test "x$ac_cv_have_decl_PRIx32" = xno; then
AC_MSG_ERROR([lack of inttypes.h based hexa specifier serving uint32_t (PRIx32)])
elif test "x$ac_cv_have_decl_SCNu64" = xno; then
AC_MSG_ERROR([lack of inttypes.h based specifier gathering uint64_t (SCNu64)])
fi
],
[[#include <inttypes.h>]]
)
]
)
(
set $pcmk_cv_decl_inttypes
AC_DEFINE_UNQUOTED([U64T], [$1], [Correct format specifier for U64T])
AC_DEFINE_UNQUOTED([U32T], [$2], [Correct format specifier for U32T])
AC_DEFINE_UNQUOTED([X32T], [$3], [Correct format specifier for X32T])
AC_DEFINE_UNQUOTED([U64TS], [$4], [Correct format specifier for U64TS])
)
dnl ===============================================
dnl Program Paths
dnl ===============================================
PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin"
export PATH
dnl Replacing AC_PROG_LIBTOOL with AC_CHECK_PROG because LIBTOOL
dnl was NOT being expanded all the time thus causing things to fail.
AC_CHECK_PROGS(LIBTOOL, glibtool libtool libtool15 libtool13)
dnl Pacemaker's executable python scripts will invoke the python specified by
dnl configure's PYTHON variable. If not specified, AM_PATH_PYTHON will check a
dnl built-in list with (unversioned) "python" having precedence. To configure
dnl Pacemaker to use a specific python interpreter version, define PYTHON
dnl when calling configure, for example: ./configure PYTHON=/usr/bin/python3.6
dnl Ensure PYTHON is an absolute path
if test x"${PYTHON}" != x""; then
AC_PATH_PROG([PYTHON], [$PYTHON])
fi
case "x$PYTHON" in
x*python3*|x*platform-python*)
dnl When used with Python 3, Pacemaker requires a minimum of 3.2
AM_PATH_PYTHON([3.2])
;;
*)
dnl Otherwise, Pacemaker requires a minimum of 2.7
AM_PATH_PYTHON([2.7])
;;
esac
AC_PATH_PROGS([ASCIIDOC_CONV], [asciidoc asciidoctor])
AC_PATH_PROG([HELP2MAN], [help2man])
-AC_PATH_PROG([PUBLICAN], [publican])
AC_PATH_PROG([SPHINX], [sphinx-build])
AC_PATH_PROG([INKSCAPE], [inkscape])
AC_PATH_PROG([XSLTPROC], [xsltproc])
AC_PATH_PROG([XMLCATALOG], [xmlcatalog])
dnl BASH is already an environment variable, so use something else
AC_PATH_PROG([BASH_PATH], [bash])
AC_PATH_PROGS(VALGRIND_BIN, valgrind, /usr/bin/valgrind)
AC_DEFINE_UNQUOTED(VALGRIND_BIN, "$VALGRIND_BIN", Valgrind command)
if test x"${LIBTOOL}" = x""; then
AC_MSG_ERROR(You need (g)libtool installed in order to build ${PACKAGE})
fi
dnl Bash is needed for building man pages and running regression tests
if test x"${BASH_PATH}" = x""; then
AC_MSG_ERROR(bash must be installed in order to build ${PACKAGE})
fi
AM_CONDITIONAL(BUILD_HELP, test x"${HELP2MAN}" != x"")
if test x"${HELP2MAN}" != x""; then
PCMK_FEATURES="$PCMK_FEATURES generated-manpages"
fi
MANPAGE_XSLT=""
if test x"${XSLTPROC}" != x""; then
AC_MSG_CHECKING(docbook to manpage transform)
# first try to figure out correct template using xmlcatalog query,
# resort to extensive (semi-deterministic) file search if that fails
DOCBOOK_XSL_URI='http://docbook.sourceforge.net/release/xsl/current'
DOCBOOK_XSL_PATH='manpages/docbook.xsl'
MANPAGE_XSLT=$(${XMLCATALOG} "" ${DOCBOOK_XSL_URI}/${DOCBOOK_XSL_PATH} \
| sed -n 's|^file://||p;q')
if test x"${MANPAGE_XSLT}" = x""; then
DIRS=$(find "${datadir}" -name $(basename $(dirname ${DOCBOOK_XSL_PATH})) \
-type d | LC_ALL=C sort)
XSLT=$(basename ${DOCBOOK_XSL_PATH})
for d in ${DIRS}; do
if test -f "${d}/${XSLT}"; then
MANPAGE_XSLT="${d}/${XSLT}"
break
fi
done
fi
fi
AC_MSG_RESULT($MANPAGE_XSLT)
AC_SUBST(MANPAGE_XSLT)
AM_CONDITIONAL(BUILD_XML_HELP, test x"${MANPAGE_XSLT}" != x"")
if test x"${MANPAGE_XSLT}" != x""; then
PCMK_FEATURES="$PCMK_FEATURES agent-manpages"
fi
AM_CONDITIONAL([IS_ASCIIDOC], [echo "${ASCIIDOC_CONV}" | grep -Eq 'asciidoc$'])
AM_CONDITIONAL([BUILD_ASCIIDOC], [test "x${ASCIIDOC_CONV}" != x])
if test "x${ASCIIDOC_CONV}" != x; then
PCMK_FEATURES="$PCMK_FEATURES ascii-docs"
fi
-publican_intree_brand=no
-if test x"${PUBLICAN_BRAND}" != x"" \
- && test x"${PUBLICAN}" != x"" \
- && test x"${INKSCAPE}" != x""; then
-
- dnl special handling for clusterlabs brand (possibly in-tree version used)
- test "${PUBLICAN_BRAND}" != "clusterlabs" \
- || test -d /usr/share/publican/Common_Content/clusterlabs
- if test $? -ne 0; then
- dnl Unknown option: brand_dir vs. Option brand_dir requires an argument
- if ${PUBLICAN} build --brand_dir 2>&1 | grep -Eq 'brand_dir$'; then
- AC_MSG_WARN([Cannot use in-tree clusterlabs brand, resorting to common])
- PUBLICAN_BRAND=common
- else
- publican_intree_brand=yes
- fi
- fi
- AC_MSG_NOTICE([Enabling Publican-generated documentation using ${PUBLICAN_BRAND} brand])
- PCMK_FEATURES="$PCMK_FEATURES publican-docs"
-fi
-AM_CONDITIONAL([BUILD_DOCBOOK],
- [test x"${PUBLICAN_BRAND}" != x"" \
- && test x"${PUBLICAN}" != x"" \
- && test x"${INKSCAPE}" != x""])
-AM_CONDITIONAL([PUBLICAN_INTREE_BRAND],
- [test x"${publican_intree_brand}" = x"yes"])
AM_CONDITIONAL([BUILD_SPHINX_DOCS],
[test x"${SPHINX}" != x"" && test x"${INKSCAPE}" != x""])
dnl Pacemaker's shell scripts (and thus man page builders) rely on GNU getopt
AC_MSG_CHECKING([for GNU-compatible getopt])
IFS_orig=$IFS
IFS=:
for PATH_DIR in $PATH; do
IFS=$IFS_orig
GETOPT_PATH="${PATH_DIR}/getopt"
if test -f "$GETOPT_PATH" && test -x "$GETOPT_PATH" ; then
$GETOPT_PATH -T >/dev/null 2>/dev/null
if test $? -eq 4; then
break
fi
fi
GETOPT_PATH=""
done
IFS=$IFS_orig
if test -n "$GETOPT_PATH"; then
AC_MSG_RESULT([$GETOPT_PATH])
else
AC_MSG_RESULT([no])
AC_MSG_ERROR(Pacemaker build requires a GNU-compatible getopt)
fi
AC_SUBST([GETOPT_PATH])
dnl ========================================================================
dnl checks for library functions to replace them
dnl
dnl NoSuchFunctionName:
dnl is a dummy function which no system supplies. It is here to make
dnl the system compile semi-correctly on OpenBSD which doesn't know
dnl how to create an empty archive
dnl
dnl scandir: Only on BSD.
dnl System-V systems may have it, but hidden and/or deprecated.
dnl A replacement function is supplied for it.
dnl
dnl setenv: is some bsdish function that should also be avoided (use
dnl putenv instead)
dnl On the other hand, putenv doesn't provide the right API for the
dnl code and has memory leaks designed in (sigh...) Fortunately this
dnl A replacement function is supplied for it.
dnl
dnl strerror: returns a string that corresponds to an errno.
dnl A replacement function is supplied for it.
dnl
dnl strnlen: is a gnu function similar to strlen, but safer.
dnl We wrote a tolerably-fast replacement function for it.
dnl
dnl strndup: is a gnu function similar to strdup, but safer.
dnl We wrote a tolerably-fast replacement function for it.
AC_REPLACE_FUNCS(alphasort NoSuchFunctionName scandir setenv strerror strchrnul unsetenv strnlen strndup)
dnl ===============================================
dnl Libraries
dnl ===============================================
AC_CHECK_LIB(socket, socket) dnl -lsocket
AC_CHECK_LIB(c, dlopen) dnl if dlopen is in libc...
AC_CHECK_LIB(dl, dlopen) dnl -ldl (for Linux)
AC_CHECK_LIB(rt, sched_getscheduler) dnl -lrt (for Tru64)
AC_CHECK_LIB(gnugetopt, getopt_long) dnl -lgnugetopt ( if available )
AC_CHECK_LIB(pam, pam_start) dnl -lpam (if available)
AC_CHECK_FUNCS([sched_setscheduler])
if test "$ac_cv_func_sched_setscheduler" != yes; then
PC_LIBS_RT=""
else
PC_LIBS_RT="-lrt"
fi
AC_SUBST(PC_LIBS_RT)
AC_CHECK_LIB(uuid, uuid_parse) dnl load the library if necessary
AC_CHECK_FUNCS(uuid_unparse) dnl OSX ships uuid_* as standard functions
AC_CHECK_HEADERS(uuid/uuid.h)
if test "x$ac_cv_func_uuid_unparse" != xyes; then
AC_MSG_ERROR(You do not have the libuuid development package installed)
fi
# Require glib 2.16.0 (2008-03) or later for g_hash_table_iter_init() etc.
PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.16.0],
[CPPFLAGS="${CPPFLAGS} ${GLIB_CFLAGS}"
LIBS="${LIBS} ${GLIB_LIBS}"])
#
# Where is dlopen?
#
if test "$ac_cv_lib_c_dlopen" = yes; then
LIBADD_DL=""
elif test "$ac_cv_lib_dl_dlopen" = yes; then
LIBADD_DL=-ldl
else
LIBADD_DL=${lt_cv_dlopen_libs}
fi
dnl ========================================================================
dnl Headers
dnl ========================================================================
# Some distributions insert #warnings into deprecated headers. If we will
# enable fatal warnings for the build, then enable them for the header checks
# as well, otherwise the build could fail even though the header check
# succeeds. (We should probably be doing this in more places.)
if test "x${enable_fatal_warnings}" = xyes ; then
cc_temp_flags "$CFLAGS $WERROR"
fi
AC_CHECK_HEADERS(arpa/inet.h)
AC_CHECK_HEADERS(ctype.h)
AC_CHECK_HEADERS(dirent.h)
AC_CHECK_HEADERS(errno.h)
AC_CHECK_HEADERS(getopt.h)
AC_CHECK_HEADERS(glib.h)
AC_CHECK_HEADERS(grp.h)
AC_CHECK_HEADERS(limits.h)
AC_CHECK_HEADERS(linux/swab.h)
AC_CHECK_HEADERS(malloc.h)
AC_CHECK_HEADERS(netdb.h)
AC_CHECK_HEADERS(netinet/in.h)
AC_CHECK_HEADERS(netinet/ip.h)
AC_CHECK_HEADERS(pwd.h)
AC_CHECK_HEADERS(sgtty.h)
AC_CHECK_HEADERS(signal.h)
AC_CHECK_HEADERS(stdarg.h)
AC_CHECK_HEADERS(stddef.h)
AC_CHECK_HEADERS(stdio.h)
AC_CHECK_HEADERS(stdlib.h)
AC_CHECK_HEADERS(string.h)
AC_CHECK_HEADERS(strings.h)
AC_CHECK_HEADERS(sys/dir.h)
AC_CHECK_HEADERS(sys/ioctl.h)
AC_CHECK_HEADERS(sys/param.h)
AC_CHECK_HEADERS(sys/reboot.h)
AC_CHECK_HEADERS(sys/resource.h)
AC_CHECK_HEADERS(sys/socket.h)
AC_CHECK_HEADERS(sys/signalfd.h)
AC_CHECK_HEADERS(sys/sockio.h)
AC_CHECK_HEADERS(sys/stat.h)
AC_CHECK_HEADERS(sys/time.h)
AC_CHECK_HEADERS(sys/types.h)
AC_CHECK_HEADERS(sys/utsname.h)
AC_CHECK_HEADERS(sys/wait.h)
AC_CHECK_HEADERS(time.h)
AC_CHECK_HEADERS(unistd.h)
if test "x${enable_fatal_warnings}" = xyes ; then
cc_restore_flags
fi
dnl These headers need prerequisites before the tests will pass
dnl AC_CHECK_HEADERS(net/if.h)
PKG_CHECK_MODULES(LIBXML2, [libxml-2.0],
[CPPFLAGS="${CPPFLAGS} ${LIBXML2_CFLAGS}"
LIBS="${LIBS} ${LIBXML2_LIBS}"])
AC_CHECK_HEADERS(libxml/xpath.h)
if test "$ac_cv_header_libxml_xpath_h" != "yes"; then
AC_MSG_ERROR(libxml development headers not found)
fi
AC_CHECK_LIB(xslt, xsltApplyStylesheet, [],
AC_MSG_ERROR(Unsupported libxslt library version))
AC_CHECK_HEADERS(libxslt/xslt.h)
if test "$ac_cv_header_libxslt_xslt_h" != "yes"; then
AC_MSG_ERROR(libxslt development headers not found)
fi
AC_CACHE_CHECK(whether __progname and __progname_full are available,
pf_cv_var_progname,
AC_TRY_LINK([extern char *__progname, *__progname_full;],
[__progname = "foo"; __progname_full = "foo bar";],
pf_cv_var_progname="yes", pf_cv_var_progname="no"))
if test "$pf_cv_var_progname" = "yes"; then
AC_DEFINE(HAVE___PROGNAME,1,[ ])
fi
dnl ========================================================================
dnl Generic declarations
dnl ========================================================================
AC_CHECK_DECLS([CLOCK_MONOTONIC], [], [], [[
#include <time.h>
]])
dnl ========================================================================
dnl Structures
dnl ========================================================================
AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,[[#include <time.h>]])
AC_CHECK_MEMBER([struct dirent.d_type],
AC_DEFINE(HAVE_STRUCT_DIRENT_D_TYPE,1,[Define this if struct dirent has d_type]),,
[#include <dirent.h>])
dnl ========================================================================
dnl Functions
dnl ========================================================================
AC_CHECK_FUNCS(getopt, AC_DEFINE(HAVE_DECL_GETOPT, 1, [Have getopt function]))
AC_CHECK_FUNCS(nanosleep, AC_DEFINE(HAVE_DECL_NANOSLEEP, 1, [Have nanosleep function]))
AC_CACHE_CHECK(whether sscanf supports %m,
pf_cv_var_sscanf,
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <stdio.h>
const char *s = "some-command-line-arg";
int main(int argc, char **argv) {
char *name = NULL;
int n = sscanf(s, "%ms", &name);
return n == 1 ? 0 : 1;
}
]])],
pf_cv_var_sscanf="yes", pf_cv_var_sscanf="no", pf_cv_var_sscanf="no"))
if test "$pf_cv_var_sscanf" = "yes"; then
AC_DEFINE(SSCANF_HAS_M, 1, [ ])
fi
dnl ========================================================================
dnl bzip2
dnl ========================================================================
AC_CHECK_HEADERS(bzlib.h)
AC_CHECK_LIB(bz2, BZ2_bzBuffToBuffCompress)
if test x$ac_cv_lib_bz2_BZ2_bzBuffToBuffCompress != xyes ; then
AC_MSG_ERROR(BZ2 libraries not found)
fi
if test x$ac_cv_header_bzlib_h != xyes; then
AC_MSG_ERROR(BZ2 Development headers not found)
fi
dnl ========================================================================
dnl sighandler_t is missing from Illumos, Solaris11 systems
dnl ========================================================================
AC_MSG_CHECKING([for sighandler_t])
AC_TRY_COMPILE([#include <signal.h>],[sighandler_t *f;],
has_sighandler_t=yes,has_sighandler_t=no)
AC_MSG_RESULT($has_sighandler_t)
if test "$has_sighandler_t" = "yes" ; then
AC_DEFINE( HAVE_SIGHANDLER_T, 1, [Define if sighandler_t available] )
fi
dnl ========================================================================
dnl ncurses
dnl ========================================================================
dnl
dnl A few OSes (e.g. Linux) deliver a default "ncurses" alongside "curses".
dnl Many non-Linux deliver "curses"; sites may add "ncurses".
dnl
dnl However, the source-code recommendation for both is to #include "curses.h"
dnl (i.e. "ncurses" still wants the include to be simple, no-'n', "curses.h").
dnl
dnl ncurse takes precedence.
dnl
AC_CHECK_HEADERS(curses.h)
AC_CHECK_HEADERS(curses/curses.h)
AC_CHECK_HEADERS(ncurses.h)
AC_CHECK_HEADERS(ncurses/ncurses.h)
dnl Although n-library is preferred, only look for it if the n-header was found.
CURSESLIBS=''
PC_NAME_CURSES=""
PC_LIBS_CURSES=""
if test "$ac_cv_header_ncurses_h" = "yes"; then
AC_CHECK_LIB(ncurses, printw,
[AC_DEFINE(HAVE_LIBNCURSES,1, have ncurses library)])
CURSESLIBS=`$PKG_CONFIG --libs ncurses` || CURSESLIBS='-lncurses'
PC_NAME_CURSES="ncurses"
fi
if test "$ac_cv_header_ncurses_ncurses_h" = "yes"; then
AC_CHECK_LIB(ncurses, printw,
[AC_DEFINE(HAVE_LIBNCURSES,1, have ncurses library)])
CURSESLIBS=`$PKG_CONFIG --libs ncurses` || CURSESLIBS='-lncurses'
PC_NAME_CURSES="ncurses"
fi
dnl Only look for non-n-library if there was no n-library.
if test X"$CURSESLIBS" = X"" -a "$ac_cv_header_curses_h" = "yes"; then
AC_CHECK_LIB(curses, printw,
[CURSESLIBS='-lcurses'; AC_DEFINE(HAVE_LIBCURSES,1, have curses library)])
PC_LIBS_CURSES="$CURSESLIBS"
fi
dnl Only look for non-n-library if there was no n-library.
if test X"$CURSESLIBS" = X"" -a "$ac_cv_header_curses_curses_h" = "yes"; then
AC_CHECK_LIB(curses, printw,
[CURSESLIBS='-lcurses'; AC_DEFINE(HAVE_LIBCURSES,1, have curses library)])
PC_LIBS_CURSES="$CURSESLIBS"
fi
if test "x$CURSESLIBS" != "x"; then
PCMK_FEATURES="$PCMK_FEATURES ncurses"
fi
dnl Check for printw() prototype compatibility
if test X"$CURSESLIBS" != X"" && cc_supports_flag -Wcast-qual; then
ac_save_LIBS=$LIBS
LIBS="$CURSESLIBS"
cc_temp_flags "-Wcast-qual $WERROR"
# avoid broken test because of hardened build environment in Fedora 23+
# - https://fedoraproject.org/wiki/Changes/Harden_All_Packages
# - https://bugzilla.redhat.com/1297985
if cc_supports_flag -fPIC; then
CFLAGS="$CFLAGS -fPIC"
fi
AC_MSG_CHECKING(whether printw() requires argument of "const char *")
AC_LINK_IFELSE(
[AC_LANG_PROGRAM([
#if defined(HAVE_NCURSES_H)
# include <ncurses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
# include <ncurses/ncurses.h>
#elif defined(HAVE_CURSES_H)
# include <curses.h>
#endif
],
[printw((const char *)"Test");]
)],
[pcmk_cv_compatible_printw=yes],
[pcmk_cv_compatible_printw=no]
)
LIBS=$ac_save_LIBS
cc_restore_flags
AC_MSG_RESULT([$pcmk_cv_compatible_printw])
if test "$pcmk_cv_compatible_printw" = no; then
AC_MSG_WARN([The printw() function of your ncurses or curses library is old, we will disable usage of the library. If you want to use this library anyway, please update to newer version of the library, ncurses 5.4 or later is recommended. You can get the library from http://www.gnu.org/software/ncurses/.])
AC_MSG_NOTICE([Disabling curses])
AC_DEFINE(HAVE_INCOMPATIBLE_PRINTW, 1, [Do we have incompatible printw() in curses library?])
fi
fi
AC_SUBST(CURSESLIBS)
AC_SUBST(PC_NAME_CURSES)
AC_SUBST(PC_LIBS_CURSES)
dnl ========================================================================
dnl Profiling and GProf
dnl ========================================================================
AC_MSG_NOTICE(Old CFLAGS: $CFLAGS)
case $SUPPORT_COVERAGE in
1|yes|true)
SUPPORT_PROFILING=1
PCMK_FEATURES="$PCMK_FEATURES coverage"
CFLAGS="$CFLAGS -fprofile-arcs -ftest-coverage"
dnl During linking, make sure to specify -lgcov or -coverage
;;
esac
case $SUPPORT_PROFILING in
1|yes|true)
SUPPORT_PROFILING=1
dnl Disable various compiler optimizations
CFLAGS="$CFLAGS -fno-omit-frame-pointer -fno-inline -fno-builtin "
dnl CFLAGS="$CFLAGS -fno-inline-functions -fno-default-inline -fno-inline-functions-called-once -fno-optimize-sibling-calls"
dnl Turn off optimization so tools can get accurate line numbers
CFLAGS=`echo $CFLAGS | sed -e 's/-O.\ //g' -e 's/-Wp,-D_FORTIFY_SOURCE=.\ //g' -e 's/-D_FORTIFY_SOURCE=.\ //g'`
CFLAGS="$CFLAGS -O0 -g3 -gdwarf-2"
dnl Update features
PCMK_FEATURES="$PCMK_FEATURES profile"
;;
*)
SUPPORT_PROFILING=0
;;
esac
AC_MSG_NOTICE(New CFLAGS: $CFLAGS)
AC_DEFINE_UNQUOTED(SUPPORT_PROFILING, $SUPPORT_PROFILING, Support for profiling)
dnl ========================================================================
dnl Cluster infrastructure - LibQB
dnl ========================================================================
if test x${enable_no_stack} = xyes; then
SUPPORT_CS=no
fi
PKG_CHECK_MODULES(libqb, libqb >= 0.13)
CPPFLAGS="$libqb_CFLAGS $CPPFLAGS"
LIBS="$libqb_LIBS $LIBS"
dnl libqb 2.02+ (2020-10)
AC_CHECK_FUNCS(qb_ipcc_auth_get,
AC_DEFINE(HAVE_IPCC_AUTH_GET, 1,
[Have qb_ipcc_auth_get function]))
PCMK_FEATURES="$PCMK_FEATURES libqb-logging libqb-ipc"
dnl libqb 0.17.0+ (2014-02)
AC_CHECK_FUNCS(qb_ipcs_connection_get_buffer_size,
AC_DEFINE(HAVE_IPCS_GET_BUFFER_SIZE, 1,
[Have qb_ipcc_get_buffer_size function]))
dnl libqb 2.0.0+ (2020-05)
CHECK_ENUM_VALUE([qb/qblog.h],[qb_log_conf],[QB_LOG_CONF_MAX_LINE_LEN])
CHECK_ENUM_VALUE([qb/qblog.h],[qb_log_conf],[QB_LOG_CONF_ELLIPSIS])
dnl Support Linux-HA fence agents if available
if test "$cross_compiling" != "yes"; then
CPPFLAGS="$CPPFLAGS -I${prefix}/include/heartbeat"
fi
AC_CHECK_HEADERS(stonith/stonith.h)
if test "$ac_cv_header_stonith_stonith_h" = "yes"; then
dnl On Debian, AC_CHECK_LIBS fail if a library has any unresolved symbols
dnl So check for all the dependencies (so they're added to LIBS) before checking for -lplumb
AC_CHECK_LIB(pils, PILLoadPlugin)
AC_CHECK_LIB(plumb, G_main_add_IPC_Channel)
PCMK_FEATURES="$PCMK_FEATURES lha-fencing"
fi
AM_CONDITIONAL([BUILD_LHA_SUPPORT], [test "$ac_cv_header_stonith_stonith_h" = "yes"])
dnl ===============================================
dnl Variables needed for substitution
dnl ===============================================
CRM_SCHEMA_DIRECTORY="${datadir}/pacemaker"
AC_DEFINE_UNQUOTED(CRM_SCHEMA_DIRECTORY,"$CRM_SCHEMA_DIRECTORY", Location for the Pacemaker Relax-NG Schema)
AC_SUBST(CRM_SCHEMA_DIRECTORY)
CRM_CORE_DIR="${localstatedir}/lib/pacemaker/cores"
AC_DEFINE_UNQUOTED(CRM_CORE_DIR,"$CRM_CORE_DIR", Location to store core files produced by Pacemaker daemons)
AC_SUBST(CRM_CORE_DIR)
if test x"${CRM_DAEMON_USER}" = x""; then
CRM_DAEMON_USER="hacluster"
fi
AC_DEFINE_UNQUOTED(CRM_DAEMON_USER,"$CRM_DAEMON_USER", User to run Pacemaker daemons as)
AC_SUBST(CRM_DAEMON_USER)
if test x"${CRM_DAEMON_GROUP}" = x""; then
CRM_DAEMON_GROUP="haclient"
fi
AC_DEFINE_UNQUOTED(CRM_DAEMON_GROUP,"$CRM_DAEMON_GROUP", Group to run Pacemaker daemons as)
AC_SUBST(CRM_DAEMON_GROUP)
CRM_PACEMAKER_DIR=${localstatedir}/lib/pacemaker
AC_DEFINE_UNQUOTED(CRM_PACEMAKER_DIR,"$CRM_PACEMAKER_DIR", Location to store directory produced by Pacemaker daemons)
AC_SUBST(CRM_PACEMAKER_DIR)
CRM_BLACKBOX_DIR=${localstatedir}/lib/pacemaker/blackbox
AC_DEFINE_UNQUOTED(CRM_BLACKBOX_DIR,"$CRM_BLACKBOX_DIR", Where to keep blackbox dumps)
AC_SUBST(CRM_BLACKBOX_DIR)
PE_STATE_DIR="${localstatedir}/lib/pacemaker/pengine"
AC_DEFINE_UNQUOTED(PE_STATE_DIR,"$PE_STATE_DIR", Where to keep scheduler outputs)
AC_SUBST(PE_STATE_DIR)
CRM_CONFIG_DIR="${localstatedir}/lib/pacemaker/cib"
AC_DEFINE_UNQUOTED(CRM_CONFIG_DIR,"$CRM_CONFIG_DIR", Where to keep configuration files)
AC_SUBST(CRM_CONFIG_DIR)
CRM_CONFIG_CTS="${localstatedir}/lib/pacemaker/cts"
AC_DEFINE_UNQUOTED(CRM_CONFIG_CTS,"$CRM_CONFIG_CTS", Where to keep cts stateful data)
AC_SUBST(CRM_CONFIG_CTS)
CRM_DAEMON_DIR="${libexecdir}/pacemaker"
AC_DEFINE_UNQUOTED(CRM_DAEMON_DIR,"$CRM_DAEMON_DIR", Location for Pacemaker daemons)
AC_SUBST(CRM_DAEMON_DIR)
CRM_STATE_DIR="${runstatedir}/crm"
AC_DEFINE_UNQUOTED([CRM_STATE_DIR], ["$CRM_STATE_DIR"],
[Where to keep state files and sockets])
AC_SUBST(CRM_STATE_DIR)
CRM_RSCTMP_DIR="${runstatedir}/resource-agents"
AC_DEFINE_UNQUOTED(CRM_RSCTMP_DIR,"$CRM_RSCTMP_DIR", Where resource agents should keep state files)
AC_SUBST(CRM_RSCTMP_DIR)
PACEMAKER_CONFIG_DIR="${sysconfdir}/pacemaker"
AC_DEFINE_UNQUOTED(PACEMAKER_CONFIG_DIR,"$PACEMAKER_CONFIG_DIR", Where to keep configuration files like authkey)
AC_SUBST(PACEMAKER_CONFIG_DIR)
OCF_RA_DIR="$OCF_ROOT_DIR/resource.d"
AC_DEFINE_UNQUOTED(OCF_RA_DIR,"$OCF_RA_DIR", Location for OCF RAs)
AC_SUBST(OCF_RA_DIR)
AC_DEFINE_UNQUOTED(SBIN_DIR,"$sbindir",[Location for system binaries])
AC_PATH_PROGS(GIT, git false)
AC_MSG_CHECKING(build version)
BUILD_VERSION=$Format:%h$
if test $BUILD_VERSION != ":%h$"; then
AC_MSG_RESULT(archive hash: $BUILD_VERSION)
elif test -x $GIT -a -d .git; then
BUILD_VERSION=`$GIT log --pretty="format:%h" -n 1`
AC_MSG_RESULT(git hash: $BUILD_VERSION)
else
# The current directory name make a reasonable default
# Most generated archives will include the hash or tag
BASE=`basename $PWD`
BUILD_VERSION=`echo $BASE | sed s:.*[[Pp]]acemaker-::`
AC_MSG_RESULT(directory based hash: $BUILD_VERSION)
fi
AC_DEFINE_UNQUOTED(BUILD_VERSION, "$BUILD_VERSION", Build version)
AC_SUBST(BUILD_VERSION)
HAVE_dbus=1
PKG_CHECK_MODULES([DBUS], [dbus-1],
[CPPFLAGS="${CPPFLAGS} ${DBUS_CFLAGS}"],
[HAVE_dbus=0])
AC_DEFINE_UNQUOTED(SUPPORT_DBUS, $HAVE_dbus, Support dbus)
AM_CONDITIONAL(BUILD_DBUS, test $HAVE_dbus = 1)
AC_CHECK_TYPES([DBusBasicValue],,,[[#include <dbus/dbus.h>]])
if test $HAVE_dbus = 0; then
PC_NAME_DBUS=""
else
PC_NAME_DBUS="dbus-1"
fi
AC_SUBST(PC_NAME_DBUS)
if test "x${enable_systemd}" != xno; then
if test $HAVE_dbus = 0; then
if test "x${enable_systemd}" = xyes; then
AC_MSG_FAILURE([cannot enable systemd without DBus])
else
enable_systemd=no
fi
fi
if test $(echo "$CPPFLAGS" | grep -q PCMK_TIME_EMERGENCY_CGT) \
|| test "x$ac_cv_have_decl_CLOCK_MONOTONIC" = xno; then
if test "x${enable_systemd}" = xyes; then
AC_MSG_FAILURE([cannot enable systemd without clock_gettime(CLOCK_MONOTONIC, ...)])
else
enable_systemd=no
fi
fi
if test "x${enable_systemd}" = xtry; then
AC_MSG_CHECKING([for systemd version query result via dbus-send])
ret=$({ dbus-send --system --print-reply \
--dest=org.freedesktop.systemd1 \
/org/freedesktop/systemd1 \
org.freedesktop.DBus.Properties.Get \
string:org.freedesktop.systemd1.Manager \
string:Version 2>/dev/null \
|| echo "this borked"; } | tail -n1)
# sanitize output a bit (interested just in value, not type),
# ret is intentionally unenquoted so as to normalize whitespace
ret=$(echo ${ret} | cut -d' ' -f2-)
AC_MSG_RESULT([${ret}])
if test "x${ret}" != xborked \
|| systemctl --version 2>/dev/null | grep -q systemd; then
enable_systemd=yes
else
enable_systemd=no
fi
fi
fi
AC_MSG_CHECKING([whether to enable support for managing resources via systemd])
AC_MSG_RESULT([${enable_systemd}])
HAVE_systemd=0
if test "x${enable_systemd}" = xyes; then
HAVE_systemd=1
PCMK_FEATURES="$PCMK_FEATURES systemd"
AC_MSG_CHECKING([which system unit file directory to use])
PKG_CHECK_VAR([systemdsystemunitdir], [systemd], [systemdsystemunitdir])
AC_MSG_RESULT([${systemdsystemunitdir}])
if test "x${systemdsystemunitdir}" = x""; then
AC_MSG_FAILURE([cannot enable systemd when systemdsystemunitdir unresolved])
fi
fi
AC_SUBST([systemdsystemunitdir])
AC_DEFINE_UNQUOTED(SUPPORT_SYSTEMD, $HAVE_systemd, Support systemd based system services)
AM_CONDITIONAL(BUILD_SYSTEMD, test $HAVE_systemd = 1)
AC_SUBST(SUPPORT_SYSTEMD)
if test "x${enable_upstart}" != xno; then
if test $HAVE_dbus = 0; then
if test "x${enable_upstart}" = xyes; then
AC_MSG_FAILURE([cannot enable Upstart without DBus])
else
enable_upstart=no
fi
fi
if test "x${enable_upstart}" = xtry; then
AC_MSG_CHECKING([for Upstart version query result via dbus-send])
ret=$({ dbus-send --system --print-reply --dest=com.ubuntu.Upstart \
/com/ubuntu/Upstart org.freedesktop.DBus.Properties.Get \
string:com.ubuntu.Upstart0_6 string:version 2>/dev/null \
|| echo "this borked"; } | tail -n1)
# sanitize output a bit (interested just in value, not type),
# ret is intentionally unenquoted so as to normalize whitespace
ret=$(echo ${ret} | cut -d' ' -f2-)
AC_MSG_RESULT([${ret}])
if test "x${ret}" != xborked \
|| initctl --version 2>/dev/null | grep -q upstart; then
enable_upstart=yes
else
enable_upstart=no
fi
fi
fi
AC_MSG_CHECKING([whether to enable support for managing resources via Upstart])
AC_MSG_RESULT([${enable_upstart}])
HAVE_upstart=0
if test "x${enable_upstart}" = xyes; then
HAVE_upstart=1
PCMK_FEATURES="$PCMK_FEATURES upstart"
fi
AC_DEFINE_UNQUOTED(SUPPORT_UPSTART, $HAVE_upstart, Support upstart based system services)
AM_CONDITIONAL(BUILD_UPSTART, test $HAVE_upstart = 1)
AC_SUBST(SUPPORT_UPSTART)
case $SUPPORT_NAGIOS in
1|yes|true)
if test $(echo "CPPFLAGS" | grep -q PCMK_TIME_EMERGENCY_CGT) \
|| test "x$ac_cv_have_decl_CLOCK_MONOTONIC" = xno; then
AC_MSG_FAILURE([cannot enable nagios without clock_gettime(CLOCK_MONOTONIC, ...)])
fi
SUPPORT_NAGIOS=1
;;
try)
if test $(echo "CPPFLAGS" | grep -q PCMK_TIME_EMERGENCY_CGT) \
|| test "x$ac_cv_have_decl_CLOCK_MONOTONIC" = xno; then
SUPPORT_NAGIOS=0
else
SUPPORT_NAGIOS=1
fi
;;
*)
SUPPORT_NAGIOS=0
;;
esac
if test $SUPPORT_NAGIOS = 1; then
PCMK_FEATURES="$PCMK_FEATURES nagios"
fi
AC_DEFINE_UNQUOTED(SUPPORT_NAGIOS, $SUPPORT_NAGIOS, Support nagios plugins)
AM_CONDITIONAL(BUILD_NAGIOS, test $SUPPORT_NAGIOS = 1)
if test x"$NAGIOS_PLUGIN_DIR" = x""; then
NAGIOS_PLUGIN_DIR="${libexecdir}/nagios/plugins"
fi
AC_DEFINE_UNQUOTED(NAGIOS_PLUGIN_DIR, "$NAGIOS_PLUGIN_DIR", Directory for nagios plugins)
AC_SUBST(NAGIOS_PLUGIN_DIR)
if test x"$NAGIOS_METADATA_DIR" = x""; then
NAGIOS_METADATA_DIR="${datadir}/nagios/plugins-metadata"
fi
AC_DEFINE_UNQUOTED(NAGIOS_METADATA_DIR, "$NAGIOS_METADATA_DIR", Directory for nagios plugins metadata)
AC_SUBST(NAGIOS_METADATA_DIR)
STACKS=""
CLUSTERLIBS=""
PC_NAME_CLUSTER=""
dnl ========================================================================
dnl Cluster stack - Corosync
dnl ========================================================================
dnl Normalize the values
case $SUPPORT_CS in
1|yes|true)
SUPPORT_CS=yes
missingisfatal=1
;;
try)
missingisfatal=0
;;
*)
SUPPORT_CS=no
;;
esac
AC_MSG_CHECKING(for native corosync)
COROSYNC_LIBS=""
if test $SUPPORT_CS = no; then
AC_MSG_RESULT(no (disabled))
SUPPORT_CS=0
else
AC_MSG_RESULT($SUPPORT_CS)
SUPPORT_CS=1
PKG_CHECK_MODULES(cpg, libcpg) dnl Fatal
PKG_CHECK_MODULES(cfg, libcfg) dnl Fatal
PKG_CHECK_MODULES(cmap, libcmap) dnl Fatal
PKG_CHECK_MODULES(quorum, libquorum) dnl Fatal
PKG_CHECK_MODULES(libcorosync_common, libcorosync_common) dnl Fatal
CFLAGS="$CFLAGS $libqb_CFLAGS $cpg_CFLAGS $cfg_CFLAGS $cmap_CFLAGS $quorum_CFLAGS $libcorosync_common_CFLAGS"
COROSYNC_LIBS="$COROSYNC_LIBS $cpg_LIBS $cfg_LIBS $cmap_LIBS $quorum_LIBS $libcorosync_common_LIBS"
CLUSTERLIBS="$CLUSTERLIBS $COROSYNC_LIBS"
PC_NAME_CLUSTER="$PC_CLUSTER_NAME libcfg libcmap libcorosync_common libcpg libquorum"
STACKS="$STACKS corosync-native"
fi
AC_DEFINE_UNQUOTED(SUPPORT_COROSYNC, $SUPPORT_CS, Support the Corosync messaging and membership layer)
AM_CONDITIONAL(BUILD_CS_SUPPORT, test $SUPPORT_CS = 1)
AC_SUBST(SUPPORT_COROSYNC)
dnl
dnl Cluster stack - Sanity
dnl
if test x${enable_no_stack} = xyes; then
AC_MSG_NOTICE(No cluster stack supported, building only the scheduler)
PCMK_FEATURES="$PCMK_FEATURES no-cluster-stack"
else
AC_MSG_CHECKING(for supported stacks)
if test x"$STACKS" = x; then
AC_MSG_FAILURE(You must support at least one cluster stack)
fi
AC_MSG_RESULT($STACKS)
PCMK_FEATURES="$PCMK_FEATURES $STACKS"
fi
PCMK_FEATURES="$PCMK_FEATURES atomic-attrd"
AC_SUBST(CLUSTERLIBS)
AC_SUBST(PC_NAME_CLUSTER)
dnl ========================================================================
dnl ACL
dnl ========================================================================
case $SUPPORT_ACL in
1|yes|true)
missingisfatal=1
;;
try)
missingisfatal=0
;;
*)
SUPPORT_ACL=no
;;
esac
AC_MSG_CHECKING(for acl support)
if test $SUPPORT_ACL = no; then
AC_MSG_RESULT(no (disabled))
SUPPORT_ACL=0
else
AC_MSG_RESULT($SUPPORT_ACL)
AC_CHECK_FUNCS(qb_ipcs_connection_auth_set, SUPPORT_ACL=1, SUPPORT_ACL=0)
if test $SUPPORT_ACL = 0; then
if test $missingisfatal = 0; then
AC_MSG_WARN(Unable to support ACL. You need to use libqb > 0.13.0)
else
AC_MSG_FAILURE(Unable to support ACL. You need to use libqb > 0.13.0)
fi
fi
fi
if test $SUPPORT_ACL = 1; then
PCMK_FEATURES="$PCMK_FEATURES acls"
fi
AM_CONDITIONAL(ENABLE_ACL, test "$SUPPORT_ACL" = "1")
AC_DEFINE_UNQUOTED(ENABLE_ACL, $SUPPORT_ACL, Build in support for CIB ACL)
dnl ========================================================================
dnl CIB secrets
dnl ========================================================================
case $SUPPORT_CIBSECRETS in
1|yes|true|try)
SUPPORT_CIBSECRETS=1
;;
*)
SUPPORT_CIBSECRETS=0
;;
esac
AC_DEFINE_UNQUOTED(SUPPORT_CIBSECRETS, $SUPPORT_CIBSECRETS, Support CIB secrets)
AM_CONDITIONAL(BUILD_CIBSECRETS, test $SUPPORT_CIBSECRETS = 1)
if test $SUPPORT_CIBSECRETS = 1; then
PCMK_FEATURES="$PCMK_FEATURES cibsecrets"
LRM_CIBSECRETS_DIR="${localstatedir}/lib/pacemaker/lrm/secrets"
AC_DEFINE_UNQUOTED(LRM_CIBSECRETS_DIR,"$LRM_CIBSECRETS_DIR", Location for CIB secrets)
AC_SUBST(LRM_CIBSECRETS_DIR)
fi
dnl ========================================================================
dnl GnuTLS
dnl ========================================================================
dnl gnutls_priority_set_direct available since 2.1.7 (released 2007-11-29)
AC_CHECK_LIB(gnutls, gnutls_priority_set_direct)
if test "$ac_cv_lib_gnutls_gnutls_priority_set_direct" != ""; then
AC_CHECK_HEADERS(gnutls/gnutls.h)
AC_CHECK_FUNCS([gnutls_sec_param_to_pk_bits]) dnl since 2.12.0 (2011-03-24)
if test "$ac_cv_header_gnutls_gnutls_h" != "yes"; then
PC_NAME_GNUTLS=""
else
PC_NAME_GNUTLS="gnutls"
fi
AC_SUBST(PC_NAME_GNUTLS)
fi
dnl ========================================================================
dnl PAM
dnl ========================================================================
AC_CHECK_HEADERS(security/pam_appl.h pam/pam_appl.h)
dnl ========================================================================
dnl System Health
dnl ========================================================================
dnl Check if servicelog development package is installed
SERVICELOG=servicelog-1
SERVICELOG_EXISTS="no"
AC_MSG_CHECKING(for $SERVICELOG packages)
if
$PKG_CONFIG --exists $SERVICELOG
then
PKG_CHECK_MODULES([SERVICELOG], [servicelog-1])
SERVICELOG_EXISTS="yes"
fi
AC_MSG_RESULT($SERVICELOG_EXISTS)
AM_CONDITIONAL(BUILD_SERVICELOG, test "$SERVICELOG_EXISTS" = "yes")
dnl Check if OpenIMPI packages and servicelog are installed
OPENIPMI="OpenIPMI OpenIPMIposix"
OPENIPMI_SERVICELOG_EXISTS="no"
AC_MSG_CHECKING(for $SERVICELOG $OPENIPMI packages)
if
$PKG_CONFIG --exists $OPENIPMI $SERVICELOG
then
PKG_CHECK_MODULES([OPENIPMI_SERVICELOG],[OpenIPMI OpenIPMIposix])
OPENIPMI_SERVICELOG_EXISTS="yes"
fi
AC_MSG_RESULT($OPENIPMI_SERVICELOG_EXISTS)
AM_CONDITIONAL(BUILD_OPENIPMI_SERVICELOG, test "$OPENIPMI_SERVICELOG_EXISTS" = "yes")
# --- ASAN/UBSAN/TSAN (see man gcc) ---
# when using SANitizers, we need to pass the -fsanitize..
# to both CFLAGS and LDFLAGS. The CFLAGS/LDFLAGS must be
# specified as first in the list or there will be runtime
# issues (for example user has to LD_PRELOAD asan for it to work
# properly).
if test -n "${SANITIZERS}"; then
SANITIZERS=$(echo $SANITIZERS | sed -e 's/,/ /g')
for SANITIZER in $SANITIZERS; do
case $SANITIZER in
asan|ASAN)
SANITIZERS_CFLAGS="$SANITIZERS_CFLAGS -fsanitize=address"
SANITIZERS_LDFLAGS="$SANITIZERS_LDFLAGS -fsanitize=address -lasan"
AC_CHECK_LIB([asan],[main],,AC_MSG_ERROR([Unable to find libasan]))
;;
ubsan|UBSAN)
SANITIZERS_CFLAGS="$SANITIZERS_CFLAGS -fsanitize=undefined"
SANITIZERS_LDFLAGS="$SANITIZERS_LDFLAGS -fsanitize=undefined -lubsan"
AC_CHECK_LIB([ubsan],[main],,AC_MSG_ERROR([Unable to find libubsan]))
;;
tsan|TSAN)
SANITIZERS_CFLAGS="$SANITIZERS_CFLAGS -fsanitize=thread"
SANITIZERS_LDFLAGS="$SANITIZERS_LDFLAGS -fsanitize=thread -ltsan"
AC_CHECK_LIB([tsan],[main],,AC_MSG_ERROR([Unable to find libtsan]))
;;
esac
done
fi
dnl ========================================================================
dnl Compiler flags
dnl ========================================================================
dnl Make sure that CFLAGS is not exported. If the user did
dnl not have CFLAGS in their environment then this should have
dnl no effect. However if CFLAGS was exported from the user's
dnl environment, then the new CFLAGS will also be exported
dnl to sub processes.
if export | fgrep " CFLAGS=" > /dev/null; then
SAVED_CFLAGS="$CFLAGS"
unset CFLAGS
CFLAGS="$SAVED_CFLAGS"
unset SAVED_CFLAGS
fi
AC_ARG_VAR([CFLAGS_HARDENED_LIB], [extra C compiler flags for hardened libraries])
AC_ARG_VAR([LDFLAGS_HARDENED_LIB], [extra linker flags for hardened libraries])
AC_ARG_VAR([CFLAGS_HARDENED_EXE], [extra C compiler flags for hardened executables])
AC_ARG_VAR([LDFLAGS_HARDENED_EXE], [extra linker flags for hardened executables])
CC_EXTRAS=""
if test "$GCC" != yes; then
CFLAGS="$CFLAGS -g"
else
CFLAGS="$CFLAGS -ggdb"
dnl When we don't have diagnostic push / pull, we can't explicitly disable
dnl checking for nonliteral formats in the places where they occur on purpose
dnl thus we disable nonliteral format checking globally as we are aborting
dnl on warnings.
dnl what makes the things really ugly is that nonliteral format checking is
dnl obviously available as an extra switch in very modern gcc but for older
dnl gcc this is part of -Wformat=2
dnl so if we have push/pull we can enable -Wformat=2 -Wformat-nonliteral
dnl if we don't have push/pull but -Wformat-nonliteral we can enable -Wformat=2
dnl otherwise none of both
gcc_diagnostic_push_pull=no
cc_temp_flags "$CFLAGS $WERROR"
AC_MSG_CHECKING([for gcc diagnostic push / pull])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#pragma GCC diagnostic push
#pragma GCC diagnostic pop
]])],
[
AC_MSG_RESULT([yes])
gcc_diagnostic_push_pull=yes
], AC_MSG_RESULT([no]))
cc_restore_flags
if cc_supports_flag "-Wformat-nonliteral"; then
gcc_format_nonliteral=yes
else
gcc_format_nonliteral=no
fi
# We had to eliminate -Wnested-externs because of libtool changes
# Make sure to order options so that the former stand for prerequisites
# of the latter (e.g., -Wformat-nonliteral requires -Wformat).
EXTRA_FLAGS="-fgnu89-inline
-Wall
-Waggregate-return
-Wbad-function-cast
-Wcast-align
-Wdeclaration-after-statement
-Wendif-labels
-Wfloat-equal
-Wformat-security
-Wmissing-prototypes
-Wmissing-declarations
-Wnested-externs
-Wno-long-long
-Wno-strict-aliasing
-Wpointer-arith
-Wstrict-prototypes
-Wwrite-strings
-Wunused-but-set-variable
-Wunsigned-char"
if test "x$gcc_diagnostic_push_pull" = "xyes"; then
AC_DEFINE([GCC_FORMAT_NONLITERAL_CHECKING_ENABLED], [],
[gcc can complain about nonliterals in format])
EXTRA_FLAGS="$EXTRA_FLAGS
-Wformat=2
-Wformat-nonliteral"
else
if test "x$gcc_format_nonliteral" = "xyes"; then
EXTRA_FLAGS="$EXTRA_FLAGS -Wformat=2"
fi
fi
# Additional warnings it might be nice to enable one day
# -Wshadow
# -Wunreachable-code
for j in $EXTRA_FLAGS
do
if
cc_supports_flag $CC_EXTRAS $j
then
CC_EXTRAS="$CC_EXTRAS $j"
fi
done
if test "x${enable_ansi}" = xyes && cc_supports_flag -std=iso9899:199409 ; then
AC_MSG_NOTICE(Enabling ANSI Compatibility)
CC_EXTRAS="$CC_EXTRAS -ansi -D_GNU_SOURCE -DANSI_ONLY"
fi
AC_MSG_NOTICE(Activated additional gcc flags: ${CC_EXTRAS})
fi
dnl
dnl Hardening flags
dnl
dnl The prime control of whether to apply (targeted) hardening build flags and
dnl which ones is --{enable,disable}-hardening option passed to ./configure:
dnl
dnl --enable-hardening=try (default):
dnl depending on whether any of CFLAGS_HARDENED_EXE, LDFLAGS_HARDENED_EXE,
dnl CFLAGS_HARDENED_LIB or LDFLAGS_HARDENED_LIB environment variables
dnl (see below) is set and non-null, all these custom flags (even if not
dnl set) are used as are, otherwise the best effort is made to offer
dnl reasonably strong hardening in several categories (RELRO, PIE,
dnl "bind now", stack protector) according to what the selected toolchain
dnl can offer
dnl
dnl --enable-hardening:
dnl same effect as --enable-hardening=try when the environment variables
dnl in question are suppressed
dnl
dnl --disable-hardening:
dnl do not apply any targeted hardening measures at all
dnl
dnl The user-injected environment variables that regulate the hardening in
dnl default case are as follows:
dnl
dnl * CFLAGS_HARDENED_EXE, LDFLAGS_HARDENED_EXE
dnl compiler and linker flags (respectively) for daemon programs
dnl (pacemakerd, pacemaker-attrd, pacemaker-controld, pacemaker-execd,
dnl cib, stonithd, pacemaker-remoted, pacemaker-schedulerd)
dnl
dnl * CFLAGS_HARDENED_LIB, LDFLAGS_HARDENED_LIB
dnl compiler and linker flags (respectively) for libraries linked
dnl with the daemon programs
dnl
dnl Note that these are purposedly targeted variables (addressing particular
dnl targets all over the scattered Makefiles) and have no effect outside of
dnl the predestined scope (e.g., CLI utilities). For a global reach,
dnl use CFLAGS, LDFLAGS, etc. as usual.
dnl
dnl For guidance on the suitable flags consult, for instance:
dnl https://fedoraproject.org/wiki/Changes/Harden_All_Packages#Detailed_Harden_Flags_Description
dnl https://owasp.org/index.php/C-Based_Toolchain_Hardening#GCC.2FBinutils
dnl
if test "x${HARDENING}" != "xtry"; then
unset CFLAGS_HARDENED_EXE
unset CFLAGS_HARDENED_LIB
unset LDFLAGS_HARDENED_EXE
unset LDFLAGS_HARDENED_LIB
fi
if test "x${HARDENING}" = "xno"; then
AC_MSG_NOTICE([Hardening: explicitly disabled])
elif test "x${HARDENING}" = "xyes" \
|| test "$(env | grep -Ec '^(C|LD)FLAGS_HARDENED_(EXE|LIB)=.')" = 0; then
dnl We'll figure out on our own...
CFLAGS_HARDENED_EXE=
CFLAGS_HARDENED_LIB=
LDFLAGS_HARDENED_EXE=
LDFLAGS_HARDENED_LIB=
relro=0
pie=0
bindnow=0
# daemons incl. libs: partial RELRO
flag="-Wl,-z,relro"
CC_CHECK_LDFLAGS(["${flag}"],
[LDFLAGS_HARDENED_EXE="${LDFLAGS_HARDENED_EXE} ${flag}";
LDFLAGS_HARDENED_LIB="${LDFLAGS_HARDENED_LIB} ${flag}";
relro=1])
# daemons: PIE for both CFLAGS and LDFLAGS
if cc_supports_flag -fPIE; then
flag="-pie"
CC_CHECK_LDFLAGS(["${flag}"],
[CFLAGS_HARDENED_EXE="${CFLAGS_HARDENED_EXE} -fPIE";
LDFLAGS_HARDENED_EXE="${LDFLAGS_HARDENED_EXE} ${flag}";
pie=1])
fi
# daemons incl. libs: full RELRO if sensible + as-needed linking
# so as to possibly mitigate startup performance
# hit caused by excessive linking with unneeded
# libraries
if test "${relro}" = 1 && test "${pie}" = 1; then
flag="-Wl,-z,now"
CC_CHECK_LDFLAGS(["${flag}"],
[LDFLAGS_HARDENED_EXE="${LDFLAGS_HARDENED_EXE} ${flag}";
LDFLAGS_HARDENED_LIB="${LDFLAGS_HARDENED_LIB} ${flag}";
bindnow=1])
fi
if test "${bindnow}" = 1; then
flag="-Wl,--as-needed"
CC_CHECK_LDFLAGS(["${flag}"],
[LDFLAGS_HARDENED_EXE="${LDFLAGS_HARDENED_EXE} ${flag}";
LDFLAGS_HARDENED_LIB="${LDFLAGS_HARDENED_LIB} ${flag}"])
fi
# universal: prefer strong > all > default stack protector if possible
flag=
if cc_supports_flag -fstack-protector-strong; then
flag="-fstack-protector-strong"
elif cc_supports_flag -fstack-protector-all; then
flag="-fstack-protector-all"
elif cc_supports_flag -fstack-protector; then
flag="-fstack-protector"
fi
if test -n "${flag}"; then
CC_EXTRAS="${CC_EXTRAS} ${flag}"
stackprot=1
fi
if test "${relro}" = 1 \
|| test "${pie}" = 1 \
|| test "${stackprot}" = 1; then
AC_MSG_NOTICE([Hardening: relro=${relro} pie=${pie} bindnow=${bindnow} stackprot=${flag}])
else
AC_MSG_WARN([Hardening: no suitable features in the toolchain detected])
fi
else
AC_MSG_NOTICE([Hardening: using custom flags])
fi
CFLAGS="$SANITIZERS_CFLAGS $CFLAGS $CC_EXTRAS"
LDFLAGS="$SANITIZERS_LDFLAGS $LDFLAGS"
CFLAGS_HARDENED_EXE="$SANITIZERS_CFLAGS $CFLAGS_HARDENED_EXE"
LDFLAGS_HARDENED_EXE="$SANITIZERS_LDFLAGS $LDFLAGS_HARDENED_EXE"
NON_FATAL_CFLAGS="$CFLAGS"
AC_SUBST(NON_FATAL_CFLAGS)
dnl
dnl We reset CFLAGS to include our warnings *after* all function
dnl checking goes on, so that our warning flags don't keep the
dnl AC_*FUNCS() calls above from working. In particular, -Werror will
dnl *always* cause us troubles if we set it before here.
dnl
dnl
if test "x${enable_fatal_warnings}" = xyes ; then
AC_MSG_NOTICE(Enabling Fatal Warnings)
CFLAGS="$CFLAGS $WERROR"
fi
AC_SUBST(CFLAGS)
dnl This is useful for use in Makefiles that need to remove one specific flag
CFLAGS_COPY="$CFLAGS"
AC_SUBST(CFLAGS_COPY)
AC_SUBST(LIBADD_DL) dnl extra flags for dynamic linking libraries
AC_SUBST(LOCALE)
dnl Options for cleaning up the compiler output
QUIET_LIBTOOL_OPTS=""
QUIET_MAKE_OPTS=""
if test "x${enable_quiet}" = "xyes"; then
QUIET_LIBTOOL_OPTS="--silent"
QUIET_MAKE_OPTS="-s" # POSIX compliant
fi
AC_MSG_RESULT(Suppress make details: ${enable_quiet})
dnl Put the above variables to use
LIBTOOL="${LIBTOOL} --tag=CC \$(QUIET_LIBTOOL_OPTS)"
MAKEFLAGS="${MAKEFLAGS} ${QUIET_MAKE_OPTS}"
AC_SUBST(CC)
AC_SUBST(MAKEFLAGS)
AC_SUBST(LIBTOOL)
AC_SUBST(QUIET_LIBTOOL_OPTS)
AC_DEFINE_UNQUOTED(CRM_FEATURES, "$PCMK_FEATURES", Set of enabled features)
AC_SUBST(PCMK_FEATURES)
dnl Files we output that need to be executable
AC_CONFIG_FILES([cts/CTSlab.py], [chmod +x cts/CTSlab.py])
AC_CONFIG_FILES([cts/LSBDummy], [chmod +x cts/LSBDummy])
AC_CONFIG_FILES([cts/OCFIPraTest.py], [chmod +x cts/OCFIPraTest.py])
AC_CONFIG_FILES([cts/cluster_test], [chmod +x cts/cluster_test])
AC_CONFIG_FILES([cts/cts], [chmod +x cts/cts])
AC_CONFIG_FILES([cts/cts-cli], [chmod +x cts/cts-cli])
AC_CONFIG_FILES([cts/cts-coverage], [chmod +x cts/cts-coverage])
AC_CONFIG_FILES([cts/cts-exec], [chmod +x cts/cts-exec])
AC_CONFIG_FILES([cts/cts-fencing], [chmod +x cts/cts-fencing])
AC_CONFIG_FILES([cts/cts-log-watcher], [chmod +x cts/cts-log-watcher])
AC_CONFIG_FILES([cts/cts-regression], [chmod +x cts/cts-regression])
AC_CONFIG_FILES([cts/cts-scheduler], [chmod +x cts/cts-scheduler])
AC_CONFIG_FILES([cts/cts-support], [chmod +x cts/cts-support])
AC_CONFIG_FILES([cts/lxc_autogen.sh], [chmod +x cts/lxc_autogen.sh])
AC_CONFIG_FILES([cts/benchmark/clubench], [chmod +x cts/benchmark/clubench])
AC_CONFIG_FILES([cts/fence_dummy], [chmod +x cts/fence_dummy])
AC_CONFIG_FILES([cts/pacemaker-cts-dummyd], [chmod +x cts/pacemaker-cts-dummyd])
AC_CONFIG_FILES([daemons/fenced/fence_legacy], [chmod +x daemons/fenced/fence_legacy])
AC_CONFIG_FILES([doc/abi-check], [chmod +x doc/abi-check])
AC_CONFIG_FILES([extra/resources/ClusterMon], [chmod +x extra/resources/ClusterMon])
AC_CONFIG_FILES([extra/resources/HealthSMART], [chmod +x extra/resources/HealthSMART])
AC_CONFIG_FILES([extra/resources/SysInfo], [chmod +x extra/resources/SysInfo])
AC_CONFIG_FILES([extra/resources/ifspeed], [chmod +x extra/resources/ifspeed])
AC_CONFIG_FILES([extra/resources/o2cb], [chmod +x extra/resources/o2cb])
AC_CONFIG_FILES([tools/crm_failcount], [chmod +x tools/crm_failcount])
AC_CONFIG_FILES([tools/crm_master], [chmod +x tools/crm_master])
AC_CONFIG_FILES([tools/crm_report], [chmod +x tools/crm_report])
AC_CONFIG_FILES([tools/crm_standby], [chmod +x tools/crm_standby])
AC_CONFIG_FILES([tools/cibsecret], [chmod +x tools/cibsecret])
AC_CONFIG_FILES([tools/pcmk_simtimes], [chmod +x tools/pcmk_simtimes])
dnl Other files we output
AC_CONFIG_FILES(Makefile \
cts/Makefile \
cts/CTS.py \
cts/CTSvars.py \
cts/benchmark/Makefile \
cts/pacemaker-cts-dummyd@.service \
daemons/Makefile \
daemons/attrd/Makefile \
daemons/based/Makefile \
daemons/controld/Makefile \
daemons/execd/Makefile \
daemons/execd/pacemaker_remote \
daemons/execd/pacemaker_remote.service \
daemons/fenced/Makefile \
daemons/pacemakerd/Makefile \
daemons/pacemakerd/pacemaker \
daemons/pacemakerd/pacemaker.service \
daemons/pacemakerd/pacemaker.upstart \
daemons/pacemakerd/pacemaker.combined.upstart \
daemons/schedulerd/Makefile \
devel/Makefile \
doc/Doxyfile \
doc/Makefile \
- doc/Clusters_from_Scratch/publican.cfg \
- doc/Pacemaker_Administration/publican.cfg \
- doc/Pacemaker_Development/publican.cfg \
- doc/Pacemaker_Explained/publican.cfg \
- doc/Pacemaker_Remote/publican.cfg \
doc/sphinx/Makefile \
extra/Makefile \
extra/alerts/Makefile \
extra/resources/Makefile \
extra/logrotate/Makefile \
extra/logrotate/pacemaker \
include/Makefile \
include/crm/Makefile \
include/crm/cib/Makefile \
include/crm/common/Makefile \
include/crm/cluster/Makefile \
include/crm/fencing/Makefile \
include/crm/pengine/Makefile \
include/pcmki/Makefile \
replace/Makefile \
lib/Makefile \
lib/libpacemaker.pc \
lib/pacemaker.pc \
lib/pacemaker-cib.pc \
lib/pacemaker-lrmd.pc \
lib/pacemaker-service.pc \
lib/pacemaker-pe_rules.pc \
lib/pacemaker-pe_status.pc \
lib/pacemaker-fencing.pc \
lib/pacemaker-cluster.pc \
lib/common/Makefile \
lib/common/tests/Makefile \
lib/common/tests/agents/Makefile \
lib/common/tests/cmdline/Makefile \
lib/common/tests/flags/Makefile \
lib/common/tests/operations/Makefile \
lib/common/tests/strings/Makefile \
lib/common/tests/utils/Makefile \
lib/cluster/Makefile \
lib/cib/Makefile \
lib/gnu/Makefile \
lib/pacemaker/Makefile \
lib/pengine/Makefile \
lib/pengine/tests/Makefile \
lib/pengine/tests/rules/Makefile \
lib/fencing/Makefile \
lib/lrmd/Makefile \
lib/services/Makefile \
maint/Makefile \
tests/Makefile \
tools/Makefile \
tools/report.collector \
tools/report.common \
tools/crm_mon.service \
tools/crm_mon.upstart \
xml/Makefile \
xml/pacemaker-schemas.pc \
)
dnl Now process the entire list of files added by previous
dnl calls to AC_CONFIG_FILES()
AC_OUTPUT()
dnl *****************
dnl Configure summary
dnl *****************
AC_MSG_RESULT([])
AC_MSG_RESULT([$PACKAGE configuration:])
AC_MSG_RESULT([ Version = ${VERSION} (Build: $BUILD_VERSION)])
AC_MSG_RESULT([ Features =${PCMK_FEATURES}])
AC_MSG_RESULT([])
AC_MSG_RESULT([ Prefix = ${prefix}])
AC_MSG_RESULT([ Executables = ${sbindir}])
AC_MSG_RESULT([ Man pages = ${mandir}])
AC_MSG_RESULT([ Libraries = ${libdir}])
AC_MSG_RESULT([ Header files = ${includedir}])
AC_MSG_RESULT([ Arch-independent files = ${datadir}])
AC_MSG_RESULT([ State information = ${localstatedir}])
AC_MSG_RESULT([ System configuration = ${sysconfdir}])
AC_MSG_RESULT([])
AC_MSG_RESULT([ HA group name = ${CRM_DAEMON_GROUP}])
AC_MSG_RESULT([ HA user name = ${CRM_DAEMON_USER}])
AC_MSG_RESULT([])
AC_MSG_RESULT([ CFLAGS = ${CFLAGS}])
AC_MSG_RESULT([ CFLAGS_HARDENED_EXE = ${CFLAGS_HARDENED_EXE}])
AC_MSG_RESULT([ CFLAGS_HARDENED_LIB = ${CFLAGS_HARDENED_LIB}])
AC_MSG_RESULT([ LDFLAGS_HARDENED_EXE = ${LDFLAGS_HARDENED_EXE}])
AC_MSG_RESULT([ LDFLAGS_HARDENED_LIB = ${LDFLAGS_HARDENED_LIB}])
AC_MSG_RESULT([ Libraries = ${LIBS}])
AC_MSG_RESULT([ Stack Libraries = ${CLUSTERLIBS}])
AC_MSG_RESULT([ Unix socket auth method = ${us_auth}])
diff --git a/doc/Clusters_from_Scratch/en-US/Ap-Configuration.txt b/doc/Clusters_from_Scratch/en-US/Ap-Configuration.txt
deleted file mode 100644
index 381bd68a5b..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Ap-Configuration.txt
+++ /dev/null
@@ -1,363 +0,0 @@
-:compat-mode: legacy
-[appendix]
-== Configuration Recap ==
-
-=== Final Cluster Configuration ===
-
-----
-[root@pcmk-1 ~]# pcs resource
- Master/Slave Set: WebDataClone [WebData]
- Masters: [ pcmk-1 pcmk-2 ]
- Clone Set: dlm-clone [dlm]
- Started: [ pcmk-1 pcmk-2 ]
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
- Clone Set: WebFS-clone [WebFS]
- Started: [ pcmk-1 pcmk-2 ]
- WebSite (ocf::heartbeat:apache): Started pcmk-1
-----
-
-----
-[root@pcmk-1 ~]# pcs resource op defaults
-timeout: 240s
-----
-
-----
-[root@pcmk-1 ~]# pcs stonith
- impi-fencing (stonith:fence_ipmilan): Started pcmk-1
-----
-
-----
-[root@pcmk-1 ~]# pcs constraint
-Location Constraints:
-Ordering Constraints:
- start ClusterIP then start WebSite (kind:Mandatory)
- promote WebDataClone then start WebFS-clone (kind:Mandatory)
- start WebFS-clone then start WebSite (kind:Mandatory)
- start dlm-clone then start WebFS-clone (kind:Mandatory)
-Colocation Constraints:
- WebSite with ClusterIP (score:INFINITY)
- WebFS-clone with WebDataClone (score:INFINITY) (with-rsc-role:Master)
- WebSite with WebFS-clone (score:INFINITY)
- WebFS-clone with dlm-clone (score:INFINITY)
-Ticket Constraints:
-----
-
-----
-[root@pcmk-1 ~]# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: pcmk-1 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Tue Sep 11 10:41:53 2018
-Last change: Tue Sep 11 10:40:16 2018 by root via cibadmin on pcmk-1
-
-2 nodes configured
-11 resources configured
-
-Online: [ pcmk-1 pcmk-2 ]
-
-Full list of resources:
-
- ipmi-fencing (stonith:fence_ipmilan): Started pcmk-1
- Master/Slave Set: WebDataClone [WebData]
- Masters: [ pcmk-1 pcmk-2 ]
- Clone Set: dlm-clone [dlm]
- Started: [ pcmk-1 pcmk-2 ]
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
- Clone Set: WebFS-clone [WebFS]
- Started: [ pcmk-1 pcmk-2 ]
- WebSite (ocf::heartbeat:apache): Started pcmk-1
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-----
-[root@pcmk-1 ~]# pcs cluster cib --config
-----
-[source,XML]
-----
-<configuration>
- <crm_config>
- <cluster_property_set id="cib-bootstrap-options">
- <nvpair id="cib-bootstrap-options-have-watchdog" name="have-watchdog" value="false"/>
- <nvpair id="cib-bootstrap-options-dc-version" name="dc-version" value="1.1.18-11.el7_5.3-2b07d5c5a9"/>
- <nvpair id="cib-bootstrap-options-cluster-infrastructure" name="cluster-infrastructure" value="corosync"/>
- <nvpair id="cib-bootstrap-options-cluster-name" name="cluster-name" value="mycluster"/>
- <nvpair id="cib-bootstrap-options-stonith-enabled" name="stonith-enabled" value="true"/>
- <nvpair id="cib-bootstrap-options-last-lrm-refresh" name="last-lrm-refresh" value="1536679009"/>
- </cluster_property_set>
- </crm_config>
- <nodes>
- <node id="1" uname="pcmk-1"/>
- <node id="2" uname="pcmk-2"/>
- </nodes>
- <resources>
- <primitive class="stonith" id="impi-fencing" type="fence_ipmilan">
- <instance_attributes id="impi-fencing-instance_attributes">
- <nvpair id="impi-fencing-instance_attributes-pcmk_host_list" name="pcmk_host_list" value="pcmk-1 pcmk-2"/>
- <nvpair id="impi-fencing-instance_attributes-ipaddr" name="ipaddr" value="10.0.0.1"/>
- <nvpair id="impi-fencing-instance_attributes-login" name="login" value="testuser"/>
- <nvpair id="impi-fencing-instance_attributes-passwd" name="passwd" value="acd123"/>
- </instance_attributes>
- <operations>
- <op id="impi-fencing-interval-60s" interval="60s" name="monitor"/>
- </operations>
- </primitive>
- <master id="WebDataClone">
- <primitive class="ocf" id="WebData" provider="linbit" type="drbd">
- <instance_attributes id="WebData-instance_attributes">
- <nvpair id="WebData-instance_attributes-drbd_resource" name="drbd_resource" value="wwwdata"/>
- </instance_attributes>
- <operations>
- <op id="WebData-demote-interval-0s" interval="0s" name="demote" timeout="90"/>
- <op id="WebData-monitor-interval-60s" interval="60s" name="monitor"/>
- <op id="WebData-notify-interval-0s" interval="0s" name="notify" timeout="90"/>
- <op id="WebData-promote-interval-0s" interval="0s" name="promote" timeout="90"/>
- <op id="WebData-reload-interval-0s" interval="0s" name="reload" timeout="30"/>
- <op id="WebData-start-interval-0s" interval="0s" name="start" timeout="240"/>
- <op id="WebData-stop-interval-0s" interval="0s" name="stop" timeout="100"/>
- </operations>
- </primitive>
- <meta_attributes id="WebDataClone-meta_attributes">
- <nvpair id="WebDataClone-meta_attributes-master-node-max" name="master-node-max" value="1"/>
- <nvpair id="WebDataClone-meta_attributes-clone-max" name="clone-max" value="2"/>
- <nvpair id="WebDataClone-meta_attributes-notify" name="notify" value="true"/>
- <nvpair id="WebDataClone-meta_attributes-master-max" name="master-max" value="2"/>
- <nvpair id="WebDataClone-meta_attributes-clone-node-max" name="clone-node-max" value="1"/>
- </meta_attributes>
- </master>
- <clone id="dlm-clone">
- <primitive class="ocf" id="dlm" provider="pacemaker" type="controld">
- <operations>
- <op id="dlm-monitor-interval-60s" interval="60s" name="monitor"/>
- <op id="dlm-start-interval-0s" interval="0s" name="start" timeout="90"/>
- <op id="dlm-stop-interval-0s" interval="0s" name="stop" timeout="100"/>
- </operations>
- </primitive>
- <meta_attributes id="dlm-clone-meta_attributes">
- <nvpair id="dlm-clone-meta_attributes-clone-max" name="clone-max" value="2"/>
- <nvpair id="dlm-clone-meta_attributes-clone-node-max" name="clone-node-max" value="1"/>
- </meta_attributes>
- </clone>
- <primitive class="ocf" id="ClusterIP" provider="heartbeat" type="IPaddr2">
- <instance_attributes id="ClusterIP-instance_attributes">
- <nvpair id="ClusterIP-instance_attributes-cidr_netmask" name="cidr_netmask" value="24"/>
- <nvpair id="ClusterIP-instance_attributes-ip" name="ip" value="192.168.122.120"/>
- <nvpair id="ClusterIP-instance_attributes-clusterip_hash" name="clusterip_hash" value="sourceip"/>
- </instance_attributes>
- <operations>
- <op id="ClusterIP-monitor-interval-30s" interval="30s" name="monitor"/>
- <op id="ClusterIP-start-interval-0s" interval="0s" name="start" timeout="20s"/>
- <op id="ClusterIP-stop-interval-0s" interval="0s" name="stop" timeout="20s"/>
- </operations>
- <meta_attributes id="ClusterIP-meta_attributes">
- <nvpair id="ClusterIP-meta_attributes-resource-stickiness" name="resource-stickiness" value="0"/>
- </meta_attributes>
- </primitive>
- <clone id="WebFS-clone">
- <primitive class="ocf" id="WebFS" provider="heartbeat" type="Filesystem">
- <instance_attributes id="WebFS-instance_attributes">
- <nvpair id="WebFS-instance_attributes-device" name="device" value="/dev/drbd1"/>
- <nvpair id="WebFS-instance_attributes-directory" name="directory" value="/var/www/html"/>
- <nvpair id="WebFS-instance_attributes-fstype" name="fstype" value="gfs2"/>
- </instance_attributes>
- <operations>
- <op id="WebFS-monitor-interval-20" interval="20" name="monitor" timeout="40"/>
- <op id="WebFS-notify-interval-0s" interval="0s" name="notify" timeout="60"/>
- <op id="WebFS-start-interval-0s" interval="0s" name="start" timeout="60"/>
- <op id="WebFS-stop-interval-0s" interval="0s" name="stop" timeout="60"/>
- </operations>
- </primitive>
- </clone>
- <primitive class="ocf" id="WebSite" provider="heartbeat" type="apache">
- <instance_attributes id="WebSite-instance_attributes">
- <nvpair id="WebSite-instance_attributes-configfile" name="configfile" value="/etc/httpd/conf/httpd.conf"/>
- <nvpair id="WebSite-instance_attributes-statusurl" name="statusurl" value="http://localhost/server-status"/>
- </instance_attributes>
- <operations>
- <op id="WebSite-monitor-interval-1min" interval="1min" name="monitor"/>
- <op id="WebSite-start-interval-0s" interval="0s" name="start" timeout="40s"/>
- <op id="WebSite-stop-interval-0s" interval="0s" name="stop" timeout="60s"/>
- </operations>
- </primitive>
- </resources>
- <constraints>
- <rsc_colocation id="colocation-WebSite-ClusterIP-INFINITY" rsc="WebSite" score="INFINITY" with-rsc="ClusterIP"/>
- <rsc_order first="ClusterIP" first-action="start" id="order-ClusterIP-WebSite-mandatory" then="WebSite" then-action="start"/>
- <rsc_colocation id="colocation-WebFS-WebDataClone-INFINITY" rsc="WebFS-clone" score="INFINITY" with-rsc="WebDataClone" with-rsc-role="Master"/>
- <rsc_order first="WebDataClone" first-action="promote" id="order-WebDataClone-WebFS-mandatory" then="WebFS-clone" then-action="start"/>
- <rsc_colocation id="colocation-WebSite-WebFS-INFINITY" rsc="WebSite" score="INFINITY" with-rsc="WebFS-clone"/>
- <rsc_order first="WebFS-clone" first-action="start" id="order-WebFS-WebSite-mandatory" then="WebSite" then-action="start"/>
- <rsc_colocation id="colocation-WebFS-dlm-clone-INFINITY" rsc="WebFS-clone" score="INFINITY" with-rsc="dlm-clone"/>
- <rsc_order first="dlm-clone" first-action="start" id="order-dlm-clone-WebFS-mandatory" then="WebFS-clone" then-action="start"/>
- </constraints>
- <rsc_defaults>
- <meta_attributes id="rsc_defaults-options">
- <nvpair id="rsc_defaults-options-resource-stickiness" name="resource-stickiness" value="100"/>
- </meta_attributes>
- </rsc_defaults>
- <op_defaults>
- <meta_attributes id="op_defaults-options">
- <nvpair id="op_defaults-options-timeout" name="timeout" value="240s"/>
- </meta_attributes>
- </op_defaults>
-</configuration>
-----
-
-=== Node List ===
-
-----
-[root@pcmk-1 ~]# pcs status nodes
-Pacemaker Nodes:
- Online: pcmk-1 pcmk-2
- Standby:
- Maintenance:
- Offline:
-Pacemaker Remote Nodes:
- Online:
- Standby:
- Maintenance:
- Offline:
-----
-
-=== Cluster Options ===
-
-----
-[root@pcmk-1 ~]# pcs property
-Cluster Properties:
- cluster-infrastructure: corosync
- cluster-name: mycluster
- dc-version: 1.1.18-11.el7_5.3-2b07d5c5a9
- have-watchdog: false
- last-lrm-refresh: 1536679009
- stonith-enabled: true
-----
-
-The output shows state information automatically obtained about the cluster, including:
-
-* *cluster-infrastructure* - the cluster communications layer in use
-* *cluster-name* - the cluster name chosen by the administrator when the cluster was created
-* *dc-version* - the version (including upstream source-code hash) of Pacemaker
- used on the Designated Controller, which is the node elected to determine what
- actions are needed when events occur
-
-The output also shows options set by the administrator that control the way the cluster operates, including:
-
-* *stonith-enabled=true* - whether the cluster is allowed to use STONITH resources
-
-=== Resources ===
-
-==== Default Options ====
-
-----
-[root@pcmk-1 ~]# pcs resource defaults
-resource-stickiness: 100
-----
-
-This shows cluster option defaults that apply to every resource that does not
-explicitly set the option itself. Above:
-
-* *resource-stickiness* - Specify the aversion to moving healthy resources to other machines
-
-==== Fencing ====
-
-----
-[root@pcmk-1 ~]# pcs stonith show
- ipmi-fencing (stonith:fence_ipmilan): Started pcmk-1
-[root@pcmk-1 ~]# pcs stonith show ipmi-fencing
- Resource: ipmi-fencing (class=stonith type=fence_ipmilan)
- Attributes: ipaddr="10.0.0.1" login="testuser" passwd="acd123" pcmk_host_list="pcmk-1 pcmk-2"
- Operations: monitor interval=60s (fence-monitor-interval-60s)
-----
-
-==== Service Address ====
-
-Users of the services provided by the cluster require an unchanging
-address with which to access it.
-
-----
-[root@pcmk-1 ~]# pcs resource show ClusterIP
-Resource: ClusterIP (class=ocf provider=heartbeat type=IPaddr2)
- Attributes: cidr_netmask=24 ip=192.168.122.120 clusterip_hash=sourceip
- Meta Attrs: resource-stickiness=0
- Operations: monitor interval=30s (ClusterIP-monitor-interval-30s)
- start interval=0s timeout=20s (ClusterIP-start-interval-0s)
- stop interval=0s timeout=20s (ClusterIP-stop-interval-0s)
-----
-
-==== DRBD - Shared Storage ====
-
-Here, we define the DRBD service and specify which DRBD resource (from
-/etc/drbd.d/*.res) it should manage. We make it a master clone resource and, in
-order to have an active/active setup, allow both instances to be promoted to master
-at the same time. We also set the notify option so that the
-cluster will tell DRBD agent when its peer changes state.
-
-----
-[root@pcmk-1 ~]# pcs resource show WebDataClone
- Master: WebDataClone
- Meta Attrs: master-node-max=1 clone-max=2 notify=true master-max=2 clone-node-max=1
- Resource: WebData (class=ocf provider=linbit type=drbd)
- Attributes: drbd_resource=wwwdata
- Operations: demote interval=0s timeout=90 (WebData-demote-interval-0s)
- monitor interval=60s (WebData-monitor-interval-60s)
- notify interval=0s timeout=90 (WebData-notify-interval-0s)
- promote interval=0s timeout=90 (WebData-promote-interval-0s)
- reload interval=0s timeout=30 (WebData-reload-interval-0s)
- start interval=0s timeout=240 (WebData-start-interval-0s)
- stop interval=0s timeout=100 (WebData-stop-interval-0s)
-[root@pcmk-1 ~]# pcs constraint ref WebDataClone
-Resource: WebDataClone
- colocation-WebFS-WebDataClone-INFINITY
- order-WebDataClone-WebFS-mandatory
-----
-
-==== Cluster Filesystem ====
-
-The cluster filesystem ensures that files are read and written correctly.
-We need to specify the block device (provided by DRBD), where we want it
-mounted and that we are using GFS2. Again, it is a clone because it is
-intended to be active on both nodes. The additional constraints ensure
-that it can only be started on nodes with active DLM and DRBD instances.
-
-----
-[root@pcmk-1 ~]# pcs resource show WebFS-clone
- Clone: WebFS-clone
- Resource: WebFS (class=ocf provider=heartbeat type=Filesystem)
- Attributes: device=/dev/drbd1 directory=/var/www/html fstype=gfs2
- Operations: monitor interval=20 timeout=40 (WebFS-monitor-interval-20)
- notify interval=0s timeout=60 (WebFS-notify-interval-0s)
- start interval=0s timeout=60 (WebFS-start-interval-0s)
- stop interval=0s timeout=60 (WebFS-stop-interval-0s)
-[root@pcmk-1 ~]# pcs constraint ref WebFS-clone
-Resource: WebFS-clone
- colocation-WebFS-WebDataClone-INFINITY
- colocation-WebSite-WebFS-INFINITY
- colocation-WebFS-dlm-clone-INFINITY
- order-WebDataClone-WebFS-mandatory
- order-WebFS-WebSite-mandatory
- order-dlm-clone-WebFS-mandatory
-----
-
-==== Apache ====
-
-Lastly, we have the actual service, Apache. We need only tell the cluster
-where to find its main configuration file and restrict it to running on
-a node that has the required filesystem mounted and the IP address active.
-
-----
-[root@pcmk-1 ~]# pcs resource show WebSite
-Resource: WebSite (class=ocf provider=heartbeat type=apache)
- Attributes: configfile=/etc/httpd/conf/httpd.conf statusurl=http://localhost/server-status
- Operations: monitor interval=1min (WebSite-monitor-interval-1min)
- start interval=0s timeout=40s (WebSite-start-interval-0s)
- stop interval=0s timeout=60s (WebSite-stop-interval-0s)
-[root@pcmk-1 ~]# pcs constraint ref WebSite
-Resource: WebSite
- colocation-WebSite-ClusterIP-INFINITY
- colocation-WebSite-WebFS-INFINITY
- order-ClusterIP-WebSite-mandatory
- order-WebFS-WebSite-mandatory
-----
diff --git a/doc/Clusters_from_Scratch/en-US/Ap-Corosync-Conf.txt b/doc/Clusters_from_Scratch/en-US/Ap-Corosync-Conf.txt
deleted file mode 100644
index ea286275da..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Ap-Corosync-Conf.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-:compat-mode: legacy
-[appendix]
-[[ap-corosync-conf]]
-== Sample Corosync Configuration ==
-
-.Sample +corosync.conf+ for two-node cluster created by `pcs`.
-.....
-totem {
- version: 2
- cluster_name: mycluster
- secauth: off
- transport: udpu
-}
-
-nodelist {
- node {
- ring0_addr: pcmk-1
- nodeid: 1
- }
-
- node {
- ring0_addr: pcmk-2
- nodeid: 2
- }
-}
-
-quorum {
- provider: corosync_votequorum
- two_node: 1
-}
-
-logging {
- to_logfile: yes
- logfile: /var/log/cluster/corosync.log
- to_syslog: yes
-}
-.....
diff --git a/doc/Clusters_from_Scratch/en-US/Ap-Reading.txt b/doc/Clusters_from_Scratch/en-US/Ap-Reading.txt
deleted file mode 100644
index 750fd74b2a..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Ap-Reading.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-:compat-mode: legacy
-[appendix]
-== Further Reading ==
-
-- Project Website https://www.clusterlabs.org/
-
-- SuSE has a comprehensive guide to cluster commands (though using the `crmsh` command-line
- shell rather than `pcs`) at:
- https://www.suse.com/documentation/sle_ha/book_sleha/data/book_sleha.html
-
-- Corosync http://www.corosync.org/
diff --git a/doc/Clusters_from_Scratch/en-US/Author_Group.xml b/doc/Clusters_from_Scratch/en-US/Author_Group.xml
deleted file mode 100644
index ff907feee5..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Author_Group.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<authorgroup>
- <author>
- <affiliation>
- <orgname>Written by the Pacemaker project contributors</orgname>
- </affiliation>
- </author>
-</authorgroup>
diff --git a/doc/Clusters_from_Scratch/en-US/Book_Info.xml b/doc/Clusters_from_Scratch/en-US/Book_Info.xml
deleted file mode 100644
index 2eec85c420..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Book_Info.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE bookinfo PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-<!ENTITY % BOOK_ENTITIES SYSTEM "Clusters_from_Scratch.ent">
-%BOOK_ENTITIES;
-]>
-<bookinfo id="book-Clusters_from_Scratch-Clusters_from_Scratch">
- <title>Clusters from Scratch</title>
- <subtitle>Step-by-Step Instructions for Building Your First High-Availability Cluster</subtitle>
- <productname>Pacemaker</productname>
- <productnumber>2.0</productnumber>
- <!--
- EDITION-PUBSNUMBER should match REVNUMBER in Revision_History.xml.
- Increment EDITION when the syntax of the documented software
- changes (OS, pacemaker, corosync, pcs), and PUBSNUMBER for
- simple textual changes (corrections, translations, etc.).
- -->
- <edition>11</edition>
- <pubsnumber>1</pubsnumber>
- <abstract>
- <para>
- This document provides a step-by-step guide to building a simple high-availability cluster using Pacemaker.
- </para>
- <para>
- The example cluster will use:
- <orderedlist>
- <listitem>
- <para>
- &DISTRO; &DISTRO_VERSION; as the host operating system
- </para>
- </listitem>
- <listitem>
- <para>
- Corosync to provide messaging and membership services,
- </para>
- </listitem>
- <listitem>
- <para>
- Pacemaker 1.1.18
- <footnote><para>While this guide is part of the document set for
- Pacemaker 2.0, it demonstrates the version available in
- the standard &DISTRO; repositories.</para></footnote>
- </para>
- </listitem>
- <listitem>
- <para>
- DRBD as a cost-effective alternative to shared storage,
- </para>
- </listitem>
- <listitem>
- <para>
- GFS2 as the cluster filesystem (in active/active mode)
- </para>
- </listitem>
- </orderedlist>
- </para>
- <para>
- Given the graphical nature of the install process, a number of
- screenshots are included. However the guide is primarily composed of
- commands, the reasons for executing them and their expected outputs.
- </para>
- </abstract>
- <corpauthor>
- <inlinemediaobject>
- <imageobject>
- <imagedata fileref="Common_Content/images/title_logo.svg" format="SVG" />
- </imageobject>
- </inlinemediaobject>
- </corpauthor>
- <xi:include href="Common_Content/Legal_Notice.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Author_Group.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-</bookinfo>
diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Active-Active.txt b/doc/Clusters_from_Scratch/en-US/Ch-Active-Active.txt
deleted file mode 100644
index 57e376e484..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Ch-Active-Active.txt
+++ /dev/null
@@ -1,272 +0,0 @@
-:compat-mode: legacy
-= Convert Storage to Active/Active =
-
-The primary requirement for an Active/Active cluster is that the data
-required for your services is available, simultaneously, on both
-machines. Pacemaker makes no requirement on how this is achieved; you
-could use a SAN if you had one available, but since DRBD supports
-multiple Primaries, we can continue to use it here.
-
-== Install Cluster Filesystem Software ==
-
-The only hitch is that we need to use a cluster-aware filesystem. The
-one we used earlier with DRBD, xfs, is not one of those. Both OCFS2
-and GFS2 are supported; here, we will use GFS2.
-
-On both nodes, install the GFS2 command-line utilities and the
-Distributed Lock Manager (DLM) required by cluster filesystems:
-----
-# yum install -y gfs2-utils dlm
-----
-
-== Configure the Cluster for the DLM ==
-
-The DLM control daemon needs to run on both nodes, so we'll start by creating a
-resource for it (using the *ocf:pacemaker:controld* resource script), and clone
-it:
-----
-[root@pcmk-1 ~]# pcs cluster cib dlm_cfg
-[root@pcmk-1 ~]# pcs -f dlm_cfg resource create dlm \
- ocf:pacemaker:controld op monitor interval=60s
-[root@pcmk-1 ~]# pcs -f dlm_cfg resource clone dlm clone-max=2 clone-node-max=1
-[root@pcmk-1 ~]# pcs -f dlm_cfg resource show
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
- WebSite (ocf::heartbeat:apache): Started pcmk-1
- Master/Slave Set: WebDataClone [WebData]
- Masters: [ pcmk-1 ]
- Slaves: [ pcmk-2 ]
- WebFS (ocf::heartbeat:Filesystem): Started pcmk-1
- Clone Set: dlm-clone [dlm]
- Stopped: [ pcmk-1 pcmk-2 ]
-----
-
-Activate our new configuration, and see how the cluster responds:
-----
-[root@pcmk-1 ~]# pcs cluster cib-push dlm_cfg --config
-CIB updated
-[root@pcmk-1 ~]# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: pcmk-1 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Tue Sep 11 10:18:30 2018
-Last change: Tue Sep 11 10:16:49 2018 by hacluster via crmd on pcmk-2
-
-2 nodes configured
-8 resources configured
-
-Online: [ pcmk-1 pcmk-2 ]
-
-Full list of resources:
-
- ipmi-fencing (stonith:fence_ipmilan): Started pcmk-1
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
- WebSite (ocf::heartbeat:apache): Started pcmk-1
- Master/Slave Set: WebDataClone [WebData]
- Masters: [ pcmk-1 ]
- Slaves: [ pcmk-2 ]
- WebFS (ocf::heartbeat:Filesystem): Started pcmk-1
- Clone Set: dlm-clone [dlm]
- Started: [ pcmk-1 pcmk-2 ]
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-[[GFS2_prep]]
-== Create and Populate GFS2 Filesystem ==
-
-Before we do anything to the existing partition, we need to make sure it
-is unmounted. We do this by telling the cluster to stop the WebFS resource.
-This will ensure that other resources (in our case, Apache) using WebFS
-are not only stopped, but stopped in the correct order.
-
-----
-[root@pcmk-1 ~]# pcs resource disable WebFS
-[root@pcmk-1 ~]# pcs resource
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
- WebSite (ocf::heartbeat:apache): Stopped
- Master/Slave Set: WebDataClone [WebData]
- Masters: [ pcmk-1 ]
- Slaves: [ pcmk-2 ]
- WebFS (ocf::heartbeat:Filesystem): Stopped (disabled)
- Clone Set: dlm-clone [dlm]
- Started: [ pcmk-1 pcmk-2 ]
-----
-
-You can see that both Apache and WebFS have been stopped,
-and that *pcmk-1* is the current master for the DRBD device.
-
-Now we can create a new GFS2 filesystem on the DRBD device.
-
-[WARNING]
-=========
-This will erase all previous content stored on the DRBD device. Ensure
-you have a copy of any important data.
-=========
-
-[IMPORTANT]
-===========
-Run the next command on whichever node has the DRBD Primary role.
-Otherwise, you will receive the message:
------
-/dev/drbd1: Read-only file system
------
-===========
-
------
-[root@pcmk-1 ~]# mkfs.gfs2 -p lock_dlm -j 2 -t mycluster:web /dev/drbd1
-It appears to contain an existing filesystem (xfs)
-This will destroy any data on /dev/drbd1
-Are you sure you want to proceed? [y/n] y
-Discarding device contents (may take a while on large devices): Done
-Adding journals: Done
-Building resource groups: Done
-Creating quota file: Done
-Writing superblock and syncing: Done
-Device: /dev/drbd1
-Block size: 4096
-Device size: 0.50 GB (131059 blocks)
-Filesystem size: 0.50 GB (131056 blocks)
-Journals: 2
-Resource groups: 3
-Locking protocol: "lock_dlm"
-Lock table: "mycluster:web"
-UUID: 0bcbffab-cada-4105-94d1-be8a26669ee0
------
-
-The `mkfs.gfs2` command required a number of additional parameters:
-
-* `-p lock_dlm` specifies that we want to use the
-kernel's DLM.
-
-* `-j 2` indicates that the filesystem should reserve enough
-space for two journals (one for each node that will access the filesystem).
-
-* `-t mycluster:web` specifies the lock table name. The format for
-this field is +pass:[<replaceable>clustername:fsname</replaceable>]+. For
-+pass:[<replaceable>clustername</replaceable>]+, we need to use the same
-value we specified originally with `pcs cluster setup --name` (which is also
-the value of *cluster_name* in +/etc/corosync/corosync.conf+).
-If you are unsure what your cluster name is, you can look in
-+/etc/corosync/corosync.conf+ or execute the command
-`pcs cluster corosync pcmk-1 | grep cluster_name`.
-
-Now we can (re-)populate the new filesystem with data
-(web pages). We'll create yet another variation on our home page.
-
------
-[root@pcmk-1 ~]# mount /dev/drbd1 /mnt
-[root@pcmk-1 ~]# cat <<-END >/mnt/index.html
-<html>
-<body>My Test Site - GFS2</body>
-</html>
-END
-[root@pcmk-1 ~]# chcon -R --reference=/var/www/html /mnt
-[root@pcmk-1 ~]# umount /dev/drbd1
-[root@pcmk-1 ~]# drbdadm verify wwwdata
------
-
-== Reconfigure the Cluster for GFS2 ==
-
-With the WebFS resource stopped, let's update the configuration.
-
-----
-[root@pcmk-1 ~]# pcs resource show WebFS
- Resource: WebFS (class=ocf provider=heartbeat type=Filesystem)
- Attributes: device=/dev/drbd1 directory=/var/www/html fstype=xfs
- Meta Attrs: target-role=Stopped
- Operations: monitor interval=20 timeout=40 (WebFS-monitor-interval-20)
- notify interval=0s timeout=60 (WebFS-notify-interval-0s)
- start interval=0s timeout=60 (WebFS-start-interval-0s)
- stop interval=0s timeout=60 (WebFS-stop-interval-0s)
-----
-
-The fstype option needs to be updated to *gfs2* instead of *xfs*.
-
-----
-[root@pcmk-1 ~]# pcs resource update WebFS fstype=gfs2
-[root@pcmk-1 ~]# pcs resource show WebFS
- Resource: WebFS (class=ocf provider=heartbeat type=Filesystem)
- Attributes: device=/dev/drbd1 directory=/var/www/html fstype=gfs2
- Meta Attrs: target-role=Stopped
- Operations: monitor interval=20 timeout=40 (WebFS-monitor-interval-20)
- notify interval=0s timeout=60 (WebFS-notify-interval-0s)
- start interval=0s timeout=60 (WebFS-start-interval-0s)
- stop interval=0s timeout=60 (WebFS-stop-interval-0s)
-----
-
-GFS2 requires that DLM be running, so we also need to set up new colocation
-and ordering constraints for it:
-----
-[root@pcmk-1 ~]# pcs constraint colocation add WebFS with dlm-clone INFINITY
-[root@pcmk-1 ~]# pcs constraint order dlm-clone then WebFS
-Adding dlm-clone WebFS (kind: Mandatory) (Options: first-action=start then-action=start)
-----
-
-== Clone the Filesystem Resource ==
-
-Now that we have a cluster filesystem ready to go, we can configure the cluster
-so both nodes mount the filesystem.
-
-Clone the filesystem resource in a new configuration.
-Notice how pcs automatically updates the relevant constraints again.
-----
-[root@pcmk-1 ~]# pcs cluster cib active_cfg
-[root@pcmk-1 ~]# pcs -f active_cfg resource clone WebFS
-[root@pcmk-1 ~]# pcs -f active_cfg constraint
-Location Constraints:
-Ordering Constraints:
- start ClusterIP then start WebSite (kind:Mandatory)
- promote WebDataClone then start WebFS-clone (kind:Mandatory)
- start WebFS-clone then start WebSite (kind:Mandatory)
- start dlm-clone then start WebFS-clone (kind:Mandatory)
-Colocation Constraints:
- WebSite with ClusterIP (score:INFINITY)
- WebFS-clone with WebDataClone (score:INFINITY) (with-rsc-role:Master)
- WebSite with WebFS-clone (score:INFINITY)
- WebFS-clone with dlm-clone (score:INFINITY)
-Ticket Constraints:
-----
-
-Tell the cluster that it is now allowed to promote both instances to be DRBD
-Primary (aka. master).
-
------
-[root@pcmk-1 ~]# pcs -f active_cfg resource update WebDataClone master-max=2
------
-
-Finally, load our configuration to the cluster, and re-enable the WebFS resource
-(which we disabled earlier).
------
-[root@pcmk-1 ~]# pcs cluster cib-push active_cfg --config
-CIB updated
-[root@pcmk-1 ~]# pcs resource enable WebFS
------
-
-After all the processes are started, the status should look similar to this.
------
-[root@pcmk-1 ~]# pcs resource
- Master/Slave Set: WebDataClone [WebData]
- Masters: [ pcmk-1 pcmk-2 ]
- Clone Set: dlm-clone [dlm]
- Started: [ pcmk-1 pcmk-2 ]
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
- Clone Set: WebFS-clone [WebFS]
- Started: [ pcmk-1 pcmk-2 ]
- WebSite (ocf::heartbeat:apache): Started pcmk-1
------
-
-== Test Failover ==
-
-Testing failover is left as an exercise for the reader.
-
-With this configuration, the data is now active/active. The website
-administrator could change HTML files on either node, and the live website will
-show the changes even if it is running on the opposite node.
-
-If the web server is configured to listen on all IP addresses, it is possible
-to remove the constraints between the WebSite and ClusterIP resources, and
-clone the WebSite resource. The web server would always be ready to serve web
-pages, and only the IP address would need to be moved in a failover.
diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Active-Passive.txt b/doc/Clusters_from_Scratch/en-US/Ch-Active-Passive.txt
deleted file mode 100644
index f75cb34e2b..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Ch-Active-Passive.txt
+++ /dev/null
@@ -1,268 +0,0 @@
-:compat-mode: legacy
-= Create an Active/Passive Cluster =
-
-== Add a Resource ==
-
-Our first resource will be a unique IP address that the cluster can bring up on
-either node. Regardless of where any cluster service(s) are running, end
-users need a consistent address to contact them on. Here, I will choose
-192.168.122.120 as the floating address, give it the imaginative name ClusterIP
-and tell the cluster to check whether it is running every 30 seconds.
-
-[WARNING]
-===========
-The chosen address must not already be in use on the network.
-Do not reuse an IP address one of the nodes already has configured.
-===========
-
-----
-[root@pcmk-1 ~]# pcs resource create ClusterIP ocf:heartbeat:IPaddr2 \
- ip=192.168.122.120 cidr_netmask=24 op monitor interval=30s
-----
-
-Another important piece of information here is *ocf:heartbeat:IPaddr2*.
-This tells Pacemaker three things about the resource you want to add:
-
-* The first field (*ocf* in this case) is the standard to which the resource
-script conforms and where to find it.
-
-* The second field (*heartbeat* in this case) is standard-specific; for OCF
-resources, it tells the cluster which OCF namespace the resource script is in.
-
-* The third field (*IPaddr2* in this case) is the name of the resource script.
-
-To obtain a list of the available resource standards (the *ocf* part of
-*ocf:heartbeat:IPaddr2*), run:
-
-----
-[root@pcmk-1 ~]# pcs resource standards
-lsb
-ocf
-service
-systemd
-----
-
-To obtain a list of the available OCF resource providers (the *heartbeat*
-part of *ocf:heartbeat:IPaddr2*), run:
-
-----
-[root@pcmk-1 ~]# pcs resource providers
-heartbeat
-openstack
-pacemaker
-----
-
-Finally, if you want to see all the resource agents available for
-a specific OCF provider (the *IPaddr2* part of *ocf:heartbeat:IPaddr2*), run:
-
-----
-[root@pcmk-1 ~]# pcs resource agents ocf:heartbeat
-apache
-aws-vpc-move-ip
-awseip
-awsvip
-azure-lb
-clvm
-.
-. (skipping lots of resources to save space)
-.
-symlink
-tomcat
-VirtualDomain
-Xinetd
-----
-
-Now, verify that the IP resource has been added, and display the cluster's
-status to see that it is now active:
-
-----
-[root@pcmk-1 ~]# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: pcmk-2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Mon Sep 10 16:55:26 2018
-Last change: Mon Sep 10 16:53:42 2018 by root via cibadmin on pcmk-1
-
-2 nodes configured
-1 resource configured
-
-Online: [ pcmk-1 pcmk-2 ]
-
-Full list of resources:
-
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-== Perform a Failover ==
-
-Since our ultimate goal is high availability, we should test failover of
-our new resource before moving on.
-
-First, find the node on which the IP address is running.
-
-----
-[root@pcmk-1 ~]# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: pcmk-2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Mon Sep 10 16:55:26 2018
-Last change: Mon Sep 10 16:53:42 2018 by root via cibadmin on pcmk-1
-
-2 nodes configured
-1 resource configured
-
-Online: [ pcmk-1 pcmk-2 ]
-
-Full list of resources:
-
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
-----
-
-You can see that the status of the *ClusterIP* resource
-is *Started* on a particular node (in this example, *pcmk-1*).
-Shut down Pacemaker and Corosync on that machine to trigger a failover.
-
-----
-[root@pcmk-1 ~]# pcs cluster stop pcmk-1
-Stopping Cluster (pacemaker)...
-Stopping Cluster (corosync)...
-----
-
-[NOTE]
-======
-A cluster command such as +pcs cluster stop pass:[<replaceable>nodename</replaceable>]+ can be run
-from any node in the cluster, not just the affected node.
-======
-
-Verify that pacemaker and corosync are no longer running:
-----
-[root@pcmk-1 ~]# pcs status
-Error: cluster is not currently running on this node
-----
-
-Go to the other node, and check the cluster status.
-
-----
-[root@pcmk-2 ~]# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: pcmk-2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Mon Sep 10 16:57:22 2018
-Last change: Mon Sep 10 16:53:42 2018 by root via cibadmin on pcmk-1
-
-2 nodes configured
-1 resource configured
-
-Online: [ pcmk-2 ]
-OFFLINE: [ pcmk-1 ]
-
-Full list of resources:
-
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-2
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-Notice that *pcmk-1* is *OFFLINE* for cluster purposes (its *pcsd* is still
-active, allowing it to receive `pcs` commands, but it is not participating in
-the cluster).
-
-Also notice that *ClusterIP* is now running on *pcmk-2* -- failover happened
-automatically, and no errors are reported.
-
-[IMPORTANT]
-.Quorum
-====
-If a cluster splits into two (or more) groups of nodes that can no longer
-communicate with each other (aka. _partitions_), _quorum_ is used to prevent
-resources from starting on more nodes than desired, which would risk
-data corruption.
-
-A cluster has quorum when more than half of all known nodes are online in
-the same partition, or for the mathematically inclined, whenever the following
-equation is true:
-....
-total_nodes < 2 * active_nodes
-....
-
-For example, if a 5-node cluster split into 3- and 2-node paritions,
-the 3-node partition would have quorum and could continue serving resources.
-If a 6-node cluster split into two 3-node partitions, neither partition
-would have quorum; pacemaker's default behavior in such cases is to
-stop all resources, in order to prevent data corruption.
-
-Two-node clusters are a special case. By the above definition,
-a two-node cluster would only have quorum when both nodes are
-running. This would make the creation of a two-node cluster pointless,
-but corosync has the ability to treat two-node clusters as if only one node
-is required for quorum.
-
-The `pcs cluster setup` command will automatically configure *two_node: 1*
-in +corosync.conf+, so a two-node cluster will "just work".
-
-If you are using a different cluster shell, you will have to configure
-+corosync.conf+ appropriately yourself.
-====
-
-Now, simulate node recovery by restarting the cluster stack on *pcmk-1*, and
-check the cluster's status. (It may take a little while before the cluster
-gets going on the node, but it eventually will look like the below.)
-
-----
-[root@pcmk-1 ~]# pcs cluster start pcmk-1
-pcmk-1: Starting Cluster...
-[root@pcmk-1 ~]# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: pcmk-2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Mon Sep 10 17:00:04 2018
-Last change: Mon Sep 10 16:53:42 2018 by root via cibadmin on pcmk-1
-
-2 nodes configured
-1 resource configured
-
-Online: [ pcmk-1 pcmk-2 ]
-
-Full list of resources:
-
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-2
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-== Prevent Resources from Moving after Recovery ==
-
-In most circumstances, it is highly desirable to prevent healthy
-resources from being moved around the cluster. Moving resources almost
-always requires a period of downtime. For complex services such as
-databases, this period can be quite long.
-
-To address this, Pacemaker has the concept of resource _stickiness_,
-which controls how strongly a service prefers to stay running where it
-is. You may like to think of it as the "cost" of any downtime. By
-default, Pacemaker assumes there is zero cost associated with moving
-resources and will do so to achieve "optimal"
-footnote:[Pacemaker's definition of optimal may not always agree with that of a
-human's. The order in which Pacemaker processes lists of resources and nodes
-creates implicit preferences in situations where the administrator has not
-explicitly specified them.]
-resource placement. We can specify a different stickiness for every
-resource, but it is often sufficient to change the default.
-
-----
-[root@pcmk-1 ~]# pcs resource defaults resource-stickiness=100
-Warning: Defaults do not apply to resources which override them with their own defined values
-[root@pcmk-1 ~]# pcs resource defaults
-resource-stickiness: 100
-----
diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Apache.txt b/doc/Clusters_from_Scratch/en-US/Ch-Apache.txt
deleted file mode 100644
index efa2c763b5..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Ch-Apache.txt
+++ /dev/null
@@ -1,424 +0,0 @@
-:compat-mode: legacy
-= Add Apache HTTP Server as a Cluster Service =
-
-indexterm:[Apache HTTP Server]
-
-Now that we have a basic but functional active/passive two-node cluster,
-we're ready to add some real services. We're going to start with
-Apache HTTP Server because it is a feature of many clusters and relatively
-simple to configure.
-
-== Install Apache ==
-
-Before continuing, we need to make sure Apache is installed on both
-hosts. We also need the wget tool in order for the cluster to be able to check
-the status of the Apache server.
-
-----
-# yum install -y httpd wget
-# firewall-cmd --permanent --add-service=http
-# firewall-cmd --reload
-----
-
-[IMPORTANT]
-====
-Do *not* enable the httpd service. Services that are intended to
-be managed via the cluster software should never be managed by the OS.
-It is often useful, however, to manually start the service, verify that
-it works, then stop it again, before adding it to the cluster. This
-allows you to resolve any non-cluster-related problems before continuing.
-Since this is a simple example, we'll skip that step here.
-====
-
-== Create Website Documents ==
-
-We need to create a page for Apache to serve. On &DISTRO; &DISTRO_VERSION;, the
-default Apache document root is /var/www/html, so we'll create an index file
-there. For the moment, we will simplify things by serving a static site
-and manually synchronizing the data between the two nodes, so run this command
-on both nodes:
-
------
-# cat <<-END >/var/www/html/index.html
- <html>
- <body>My Test Site - $(hostname)</body>
- </html>
-END
------
-
-== Enable the Apache status URL ==
-
-indexterm:[Apache HTTP Server,/server-status]
-
-In order to monitor the health of your Apache instance, and recover it if
-it fails, the resource agent used by Pacemaker assumes the server-status
-URL is available. On both nodes, enable the URL with:
-
-----
-# cat <<-END >/etc/httpd/conf.d/status.conf
- <Location /server-status>
- SetHandler server-status
- Require local
- </Location>
-END
-----
-
-[NOTE]
-======
-If you are using a different operating system, server-status may already be
-enabled or may be configurable in a different location. If you are using
-a version of Apache HTTP Server less than 2.4, the syntax will be different.
-======
-
-== Configure the Cluster ==
-
-indexterm:[Apache HTTP Server,Apache resource configuration]
-
-At this point, Apache is ready to go, and all that needs to be done is to
-add it to the cluster. Let's call the resource WebSite. We need to use
-an OCF resource script called apache in the heartbeat namespace.
-footnote:[Compare the key used here, *ocf:heartbeat:apache*, with the one we
-used earlier for the IP address, *ocf:heartbeat:IPaddr2*]
-The script's only required parameter is the path to the main Apache
-configuration file, and we'll tell the cluster to check once a
-minute that Apache is still running.
-
-----
-[root@pcmk-1 ~]# pcs resource create WebSite ocf:heartbeat:apache \
- configfile=/etc/httpd/conf/httpd.conf \
- statusurl="http://localhost/server-status" \
- op monitor interval=1min
-----
-
-By default, the operation timeout for all resources' start, stop, and monitor
-operations is 20 seconds. In many cases, this timeout period is less than
-a particular resource's advised timeout period. For the purposes of this
-tutorial, we will adjust the global operation timeout default to 240 seconds.
-
-----
-[root@pcmk-1 ~]# pcs resource op defaults timeout=240s
-Warning: Defaults do not apply to resources which override them with their own defined values
-[root@pcmk-1 ~]# pcs resource op defaults
-timeout: 240s
-----
-
-[NOTE]
-======
-In a production cluster, it is usually better to adjust each resource's
-start, stop, and monitor timeouts to values that are appropriate to
-the behavior observed in your environment, rather than adjust
-the global default.
-======
-
-After a short delay, we should see the cluster start Apache.
-
------
-[root@pcmk-1 ~]# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: pcmk-2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Mon Sep 10 17:06:22 2018
-Last change: Mon Sep 10 17:05:41 2018 by root via cibadmin on pcmk-1
-
-2 nodes configured
-2 resources configured
-
-Online: [ pcmk-1 pcmk-2 ]
-
-Full list of resources:
-
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-2
- WebSite (ocf::heartbeat:apache): Started pcmk-1
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
------
-
-Wait a moment, the WebSite resource isn't running on the same host as our
-IP address!
-
-[NOTE]
-======
-If, in the `pcs status` output, you see the WebSite resource has
-failed to start, then you've likely not enabled the status URL correctly.
-You can check whether this is the problem by running:
-
-....
-wget -O - http://localhost/server-status
-....
-
-If you see *Not Found* or *Forbidden* in the output, then this is likely the
-problem. Ensure that the *<Location /server-status>* block is correct.
-
-======
-
-== Ensure Resources Run on the Same Host ==
-
-To reduce the load on any one machine, Pacemaker will generally try to
-spread the configured resources across the cluster nodes. However, we
-can tell the cluster that two resources are related and need to run on
-the same host (or not at all). Here, we instruct the cluster that
-WebSite can only run on the host that ClusterIP is active on.
-
-To achieve this, we use a _colocation constraint_ that indicates it is
-mandatory for WebSite to run on the same node as ClusterIP. The
-"mandatory" part of the colocation constraint is indicated by using a
-score of INFINITY. The INFINITY score also means that if ClusterIP is not
-active anywhere, WebSite will not be permitted to run.
-
-[NOTE]
-=======
-If ClusterIP is not active anywhere, WebSite will not be permitted to run
-anywhere.
-=======
-
-[IMPORTANT]
-===========
-Colocation constraints are "directional", in that they imply certain
-things about the order in which the two resources will have a location
-chosen. In this case, we're saying that *WebSite* needs to be placed on the
-same machine as *ClusterIP*, which implies that the cluster must know the
-location of *ClusterIP* before choosing a location for *WebSite*.
-===========
-
------
-[root@pcmk-1 ~]# pcs constraint colocation add WebSite with ClusterIP INFINITY
-[root@pcmk-1 ~]# pcs constraint
-Location Constraints:
-Ordering Constraints:
-Colocation Constraints:
- WebSite with ClusterIP (score:INFINITY)
-Ticket Constraints:
-[root@pcmk-1 ~]# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: pcmk-2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Mon Sep 10 17:08:54 2018
-Last change: Mon Sep 10 17:08:27 2018 by root via cibadmin on pcmk-1
-
-2 nodes configured
-2 resources configured
-
-Online: [ pcmk-1 pcmk-2 ]
-
-Full list of resources:
-
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-2
- WebSite (ocf::heartbeat:apache): Started pcmk-2
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
------
-
-== Ensure Resources Start and Stop in Order ==
-
-Like many services, Apache can be configured to bind to specific
-IP addresses on a host or to the wildcard IP address. If Apache
-binds to the wildcard, it doesn't matter whether an IP address
-is added before or after Apache starts; Apache will respond on
-that IP just the same. However, if Apache binds only to certain IP
-address(es), the order matters: If the address is added after Apache
-starts, Apache won't respond on that address.
-
-To be sure our WebSite responds regardless of Apache's address configuration,
-we need to make sure ClusterIP not only runs on the same node,
-but starts before WebSite. A colocation constraint only ensures the
-resources run together, not the order in which they are started and stopped.
-
-We do this by adding an ordering constraint. By default, all order constraints
-are mandatory, which means that the recovery of ClusterIP will also trigger the
-recovery of WebSite.
-
------
-[root@pcmk-1 ~]# pcs constraint order ClusterIP then WebSite
-Adding ClusterIP WebSite (kind: Mandatory) (Options: first-action=start then-action=start)
-[root@pcmk-1 ~]# pcs constraint
-Location Constraints:
-Ordering Constraints:
- start ClusterIP then start WebSite (kind:Mandatory)
-Colocation Constraints:
- WebSite with ClusterIP (score:INFINITY)
-Ticket Constraints:
------
-
-== Prefer One Node Over Another ==
-
-Pacemaker does not rely on any sort of hardware symmetry between nodes,
-so it may well be that one machine is more powerful than the other.
-
-In such cases, you may want to host the resources on the more powerful node
-when it is available, to have the best performance -- or you may want to host
-the resources on the _less_ powerful node when it's available, so you don't
-have to worry about whether you can handle the load after a failover.
-
-To do this, we create a location constraint.
-
-In the location constraint below, we are saying the WebSite resource
-prefers the node pcmk-1 with a score of 50. Here, the score indicates
-how strongly we'd like the resource to run at this location.
-
------
-[root@pcmk-1 ~]# pcs constraint location WebSite prefers pcmk-1=50
-[root@pcmk-1 ~]# pcs constraint
-Location Constraints:
- Resource: WebSite
- Enabled on: pcmk-1 (score:50)
-Ordering Constraints:
- start ClusterIP then start WebSite (kind:Mandatory)
-Colocation Constraints:
- WebSite with ClusterIP (score:INFINITY)
-Ticket Constraints:
-[root@pcmk-1 ~]# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: pcmk-2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Mon Sep 10 17:21:41 2018
-Last change: Mon Sep 10 17:21:14 2018 by root via cibadmin on pcmk-1
-
-2 nodes configured
-2 resources configured
-
-Online: [ pcmk-1 pcmk-2 ]
-
-Full list of resources:
-
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-2
- WebSite (ocf::heartbeat:apache): Started pcmk-2
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
------
-
-Wait a minute, the resources are still on pcmk-2!
-
-Even though WebSite now prefers to run on pcmk-1, that preference is
-(intentionally) less than the resource stickiness (how much we
-preferred not to have unnecessary downtime).
-
-To see the current placement scores, you can use a tool called crm_simulate.
-
-----
-[root@pcmk-1 ~]# crm_simulate -sL
-
-Current cluster status:
-Online: [ pcmk-1 pcmk-2 ]
-
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-2
- WebSite (ocf::heartbeat:apache): Started pcmk-2
-
-Allocation scores:
-native_color: ClusterIP allocation score on pcmk-1: 50
-native_color: ClusterIP allocation score on pcmk-2: 200
-native_color: WebSite allocation score on pcmk-1: -INFINITY
-native_color: WebSite allocation score on pcmk-2: 100
-
-Transition Summary:
-----
-
-== Move Resources Manually ==
-
-There are always times when an administrator needs to override the
-cluster and force resources to move to a specific location. In this example,
-we will force the WebSite to move to pcmk-1.
-
-We will use the *pcs resource move* command to create a temporary constraint
-with a score of INFINITY. While we could update our existing constraint,
-using *move* allows to easily get rid of the temporary constraint later.
-If desired, we could even give a lifetime for the constraint, so it would
-expire automatically -- but we don't that in this example.
-
------
-[root@pcmk-1 ~]# pcs resource move WebSite pcmk-1
-[root@pcmk-1 ~]# pcs constraint
-Location Constraints:
- Resource: WebSite
- Enabled on: pcmk-1 (score:50)
- Enabled on: pcmk-1 (score:INFINITY) (role: Started)
-Ordering Constraints:
- start ClusterIP then start WebSite (kind:Mandatory)
-Colocation Constraints:
- WebSite with ClusterIP (score:INFINITY)
-Ticket Constraints:
-[root@pcmk-1 ~]# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: pcmk-2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Mon Sep 10 17:28:55 2018
-Last change: Mon Sep 10 17:28:27 2018 by root via crm_resource on pcmk-1
-
-2 nodes configured
-2 resources configured
-
-Online: [ pcmk-1 pcmk-2 ]
-
-Full list of resources:
-
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
- WebSite (ocf::heartbeat:apache): Started pcmk-1
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
------
-
-Once we've finished whatever activity required us to move the
-resources to pcmk-1 (in our case nothing), we can then allow the cluster
-to resume normal operation by removing the new constraint. Due to our first
-location constraint and our default stickiness, the resources will remain on
-pcmk-1.
-
-We will use the *pcs resource clear* command, which removes all temporary
-constraints previously created by *pcs resource move* or *pcs resource ban*.
------
-[root@pcmk-1 ~]# pcs resource clear WebSite
-[root@pcmk-1 ~]# pcs constraint
-Location Constraints:
- Resource: WebSite
- Enabled on: pcmk-1 (score:50)
-Ordering Constraints:
- start ClusterIP then start WebSite (kind:Mandatory)
-Colocation Constraints:
- WebSite with ClusterIP (score:INFINITY)
-Ticket Constraints:
------
-
-Note that the INFINITY location constraint is now gone. If we check the cluster
-status, we can also see that (as expected) the resources are still active
-on pcmk-1.
-
------
-[root@pcmk-1 ~]# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: pcmk-2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Mon Sep 10 17:31:47 2018
-Last change: Mon Sep 10 17:31:04 2018 by root via crm_resource on pcmk-1
-
-2 nodes configured
-2 resources configured
-
-Online: [ pcmk-1 pcmk-2 ]
-
-Full list of resources:
-
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
- WebSite (ocf::heartbeat:apache): Started pcmk-1
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
------
-
-To remove the constraint with the score of 50, we would first get the
-constraint's ID using *pcs constraint --full*, then remove it with
-*pcs constraint remove* and the ID. We won't show those steps here,
-but feel free to try it on your own, with the help of the pcs man page
-if necessary.
diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Cluster-Setup.txt b/doc/Clusters_from_Scratch/en-US/Ch-Cluster-Setup.txt
deleted file mode 100644
index 9cf6fbcce0..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Ch-Cluster-Setup.txt
+++ /dev/null
@@ -1,333 +0,0 @@
-:compat-mode: legacy
-= Set up a Cluster =
-
-== Simplify Administration With a Cluster Shell ==
-
-In the dark past, configuring Pacemaker required the administrator to
-read and write XML. In true UNIX style, there were also a number of
-different commands that specialized in different aspects of querying
-and updating the cluster.
-
-In addition, the various components of the cluster stack (corosync, pacemaker,
-etc.) had to be configured separately, with different configuration tools and
-formats.
-
-All of that has been greatly simplified with the creation of higher-level tools,
-whether command-line or GUIs, that hide all the mess underneath.
-
-Command-line cluster shells take all the individual aspects required for
-managing and configuring a cluster, and pack them into one simple-to-use
-command-line tool.
-
-They even allow you to queue up several changes at once and commit
-them all at once.
-
-Two popular command-line shells are `pcs` and `crmsh`. Clusters from Scratch is
-based on `pcs` because it comes with CentOS, but both have similar
-functionality. Choosing a shell or GUI is a matter of personal preference and
-what comes with (and perhaps is supported by) your choice of operating system.
-
-
-== Install the Cluster Software ==
-
-Fire up a shell on both nodes and run the following to install pacemaker, pcs,
-and some other command-line tools that will make our lives easier:
-----
-# yum install -y pacemaker pcs psmisc policycoreutils-python
-----
-
-[IMPORTANT]
-===========
-This document will show commands that need to be executed on both nodes
-with a simple `#` prompt. Be sure to run them on each node individually.
-===========
-
-[NOTE]
-===========
-This document uses `pcs` for cluster management. Other alternatives,
-such as `crmsh`, are available, but their syntax
-will differ from the examples used here.
-===========
-
-== Configure the Cluster Software ==
-
-=== Allow cluster services through firewall ===
-
-On each node, allow cluster-related services through the local firewall:
-----
-# firewall-cmd --permanent --add-service=high-availability
-success
-# firewall-cmd --reload
-success
-----
-
-[NOTE]
-======
-If you are using iptables directly, or some other firewall solution besides
-firewalld, simply open the following ports, which can be used by various
-clustering components: TCP ports 2224, 3121, and 21064, and UDP port 5405.
-
-If you run into any problems during testing, you might want to disable
-the firewall and SELinux entirely until you have everything working.
-This may create significant security issues and should not be performed on
-machines that will be exposed to the outside world, but may be appropriate
-during development and testing on a protected host.
-
-To disable security measures:
-----
-[root@pcmk-1 ~]# setenforce 0
-[root@pcmk-1 ~]# sed -i.bak "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/selinux/config
-[root@pcmk-1 ~]# systemctl mask firewalld.service
-[root@pcmk-1 ~]# systemctl stop firewalld.service
-[root@pcmk-1 ~]# iptables --flush
-----
-======
-
-=== Enable pcs Daemon ===
-
-Before the cluster can be configured, the pcs daemon must be started and enabled
-to start at boot time on each node. This daemon works with the pcs command-line interface
-to manage synchronizing the corosync configuration across all nodes in the cluster.
-
-Start and enable the daemon by issuing the following commands on each node:
-
-----
-# systemctl start pcsd.service
-# systemctl enable pcsd.service
-Created symlink from /etc/systemd/system/multi-user.target.wants/pcsd.service to /usr/lib/systemd/system/pcsd.service.
-----
-
-The installed packages will create a *hacluster* user with a disabled password.
-While this is fine for running `pcs` commands locally,
-the account needs a login password in order to perform such tasks as syncing
-the corosync configuration, or starting and stopping the cluster on other nodes.
-
-This tutorial will make use of such commands,
-so now we will set a password for the *hacluster* user, using the same password
-on both nodes:
-
-----
-# passwd hacluster
-Changing password for user hacluster.
-New password:
-Retype new password:
-passwd: all authentication tokens updated successfully.
-----
-
-[NOTE]
-===========
-Alternatively, to script this process or set the password on a
-different machine from the one you're logged into, you can use
-the `--stdin` option for `passwd`:
-
-----
-[root@pcmk-1 ~]# ssh pcmk-2 -- 'echo mysupersecretpassword | passwd --stdin hacluster'
-----
-===========
-
-=== Configure Corosync ===
-
-On either node, use `pcs cluster auth` to authenticate as the *hacluster* user:
-
-----
-[root@pcmk-1 ~]# pcs cluster auth pcmk-1 pcmk-2
-Username: hacluster
-Password:
-pcmk-2: Authorized
-pcmk-1: Authorized
-----
-
-.Note
-[NOTE]
-====
-In Fedora 29 and CentOS 8.0, the command has been changed to `pcs host auth`:
-----
-[root@pcmk-1 ~]# pcs host auth pcmk-1 pcmk-2
-Username: hacluster
-Password:
-pcmk-2: Authorized
-pcmk-1: Authorized
-----
-====
-
-Next, use `pcs cluster setup` on the same node to generate and synchronize the
-corosync configuration:
-----
-[root@pcmk-1 ~]# pcs cluster setup --name mycluster pcmk-1 pcmk-2
-Destroying cluster on nodes: pcmk-1, pcmk-2...
-pcmk-2: Stopping Cluster (pacemaker)...
-pcmk-1: Stopping Cluster (pacemaker)...
-pcmk-1: Successfully destroyed cluster
-pcmk-2: Successfully destroyed cluster
-
-Sending 'pacemaker_remote authkey' to 'pcmk-1', 'pcmk-2'
-pcmk-2: successful distribution of the file 'pacemaker_remote authkey'
-pcmk-1: successful distribution of the file 'pacemaker_remote authkey'
-Sending cluster config files to the nodes...
-pcmk-1: Succeeded
-pcmk-2: Succeeded
-
-Synchronizing pcsd certificates on nodes pcmk-1, pcmk-2...
-pcmk-2: Success
-pcmk-1: Success
-Restarting pcsd on the nodes in order to reload the certificates...
-pcmk-2: Success
-pcmk-1: Success
-----
-
-.Note
-[NOTE]
-====
-In Fedora 29 and CentOS 8.0, the syntax has been changed and the +--name+ option
-has been dropped:
-----
-[root@pcmk-1 ~]# pcs cluster setup mycluster pcmk-1 pcmk-2
-No addresses specified for host 'pcmk-1', using 'pcmk-1'
-No addresses specified for host 'pcmk-2', using 'pcmk-2'
-Destroying cluster on hosts: 'pcmk-1', 'pcmk-2'...
-pcmk-1: Successfully destroyed cluster
-pcmk-2: Successfully destroyed cluster
-Requesting remove 'pcsd settings' from 'pcmk-1', 'pcmk-2'
-pcmk-1: successful removal of the file 'pcsd settings'
-pcmk-2: successful removal of the file 'pcsd settings'
-Sending 'corosync authkey', 'pacemaker authkey' to 'pcmk-1', 'pcmk-2'
-pcmk-2: successful distribution of the file 'corosync authkey'
-pcmk-2: successful distribution of the file 'pacemaker authkey'
-pcmk-1: successful distribution of the file 'corosync authkey'
-pcmk-1: successful distribution of the file 'pacemaker authkey'
-Synchronizing pcsd SSL certificates on nodes 'pcmk-1', 'pcmk-2'...
-pcmk-1: Success
-pcmk-2: Success
-Sending 'corosync.conf' to 'pcmk-1', 'pcmk-2'
-pcmk-2: successful distribution of the file 'corosync.conf'
-pcmk-1: successful distribution of the file 'corosync.conf'
-Cluster has been successfully set up.
-----
-====
-
-If you received an authorization error for either of those commands, make
-sure you configured the *hacluster* user account on each node
-with the same password.
-
-[NOTE]
-======
-If you are not using `pcs` for cluster administration,
-follow whatever procedures are appropriate for your tools
-to create a corosync.conf and copy it to all nodes.
-
-The `pcs` command will configure corosync to use UDP unicast transport; if you
-choose to use multicast instead, choose a multicast address carefully.
-footnote:[For some subtle issues, see
-http://web.archive.org/web/20101211210054/http://29west.com/docs/THPM/multicast-address-assignment.html[Topics
-in High-Performance Messaging: Multicast Address Assignment] or the more detailed treatment in
-https://www.cisco.com/c/dam/en/us/support/docs/ip/ip-multicast/ipmlt_wp.pdf[Cisco's
-Guidelines for Enterprise IP Multicast Address Allocation].]
-======
-
-The final corosync.conf configuration on each node should look
-something like the sample in <<ap-corosync-conf>>.
-
-== Explore pcs ==
-
-Start by taking some time to familiarize yourself with what `pcs` can do.
-
-----
-[root@pcmk-1 ~]# pcs
-
-Usage: pcs [-f file] [-h] [commands]...
-Control and configure pacemaker and corosync.
-
-Options:
- -h, --help Display usage and exit.
- -f file Perform actions on file instead of active CIB.
- --debug Print all network traffic and external commands run.
- --version Print pcs version information. List pcs capabilities if
- --full is specified.
- --request-timeout Timeout for each outgoing request to another node in
- seconds. Default is 60s.
- --force Override checks and errors, the exact behavior depends on
- the command. WARNING: Using the --force option is
- strongly discouraged unless you know what you are doing.
-
-Commands:
- cluster Configure cluster options and nodes.
- resource Manage cluster resources.
- stonith Manage fence devices.
- constraint Manage resource constraints.
- property Manage pacemaker properties.
- acl Manage pacemaker access control lists.
- qdevice Manage quorum device provider on the local host.
- quorum Manage cluster quorum settings.
- booth Manage booth (cluster ticket manager).
- status View cluster status.
- config View and manage cluster configuration.
- pcsd Manage pcs daemon.
- node Manage cluster nodes.
- alert Manage pacemaker alerts.
-
-----
-
-As you can see, the different aspects of cluster management are separated
-into categories. To discover the functionality available in each of these
-categories, one can issue the command +pcs pass:[<replaceable>category</replaceable>] help+. Below
-is an example of all the options available under the status category.
-
-----
-[root@pcmk-1 ~]# pcs status help
-
-Usage: pcs status [commands]...
-View current cluster and resource status
-Commands:
- [status] [--full | --hide-inactive]
- View all information about the cluster and resources (--full provides
- more details, --hide-inactive hides inactive resources).
-
- resources [<resource id> | --full | --groups | --hide-inactive]
- Show all currently configured resources or if a resource is specified
- show the options for the configured resource. If --full is specified,
- all configured resource options will be displayed. If --groups is
- specified, only show groups (and their resources). If --hide-inactive
- is specified, only show active resources.
-
- groups
- View currently configured groups and their resources.
-
- cluster
- View current cluster status.
-
- corosync
- View current membership information as seen by corosync.
-
- quorum
- View current quorum status.
-
- qdevice <device model> [--full] [<cluster name>]
- Show runtime status of specified model of quorum device provider. Using
- --full will give more detailed output. If <cluster name> is specified,
- only information about the specified cluster will be displayed.
-
- nodes [corosync | both | config]
- View current status of nodes from pacemaker. If 'corosync' is
- specified, view current status of nodes from corosync instead. If
- 'both' is specified, view current status of nodes from both corosync &
- pacemaker. If 'config' is specified, print nodes from corosync &
- pacemaker configuration.
-
- pcsd [<node>]...
- Show current status of pcsd on nodes specified, or on all nodes
- configured in the local cluster if no nodes are specified.
-
- xml
- View xml version of status (output from crm_mon -r -1 -X).
-
-----
-
-Additionally, if you are interested in the version and
-supported cluster stack(s) available with your Pacemaker
-installation, run:
-
-----
-[root@pcmk-1 ~]# pacemakerd --features
-Pacemaker 1.1.18-11.el7_5.3 (Build: 2b07d5c5a9)
- Supporting v3.0.14: generated-manpages agent-manpages ncurses libqb-logging libqb-ipc systemd nagios corosync-native atomic-attrd acls
-----
diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Fencing.txt b/doc/Clusters_from_Scratch/en-US/Ch-Fencing.txt
deleted file mode 100644
index 6987c69460..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Ch-Fencing.txt
+++ /dev/null
@@ -1,210 +0,0 @@
-:compat-mode: legacy
-= Configure Fencing =
-
-== What is Fencing? ==
-
-Fencing protects your data from being corrupted, and your application from
-becoming unavailable, due to unintended concurrent access by rogue nodes.
-
-Just because a node is unresponsive doesn't mean it has stopped
-accessing your data. The only way to be 100% sure that your data is
-safe, is to use fencing to ensure that the node is truly
-offline before allowing the data to be accessed from another node.
-
-Fencing also has a role to play in the event that a clustered service
-cannot be stopped. In this case, the cluster uses fencing to force the
-whole node offline, thereby making it safe to start the service
-elsewhere.
-
-Fencing is also known as STONITH, an acronym for "Shoot The Other Node In The
-Head", since the most popular form of fencing is cutting a host's power.
-
-In order to guarantee the safety of your data,
-footnote:[If the data is corrupt, there is little point in continuing to make it available]
-fencing is enabled by default.
-
-[NOTE]
-====
-It is possible to tell the cluster not to use fencing, by setting the
-*stonith-enabled* cluster option to false:
-----
-[root@pcmk-1 ~]# pcs property set stonith-enabled=false
-[root@pcmk-1 ~]# crm_verify -L
-----
-
-However, this is completely inappropriate for a production cluster. It tells
-the cluster to simply pretend that failed nodes are safely powered off. Some
-vendors will refuse to support clusters that have fencing disabled. Even
-disabling it for a test cluster means you won't be able to test real failure
-scenarios.
-====
-
-== Choose a Fence Device ==
-
-The two broad categories of fence device are power fencing, which cuts off
-power to the target, and fabric fencing, which cuts off the target's access to
-some critical resource, such as a shared disk or access to the local network.
-
-Power fencing devices include:
-
-* Intelligent power switches
-* IPMI
-* Hardware watchdog device (alone, or in combination with shared storage used
- as a "poison pill" mechanism)
-
-Fabric fencing devices include:
-
-* Shared storage that can be cut off for a target host by another host (for
- example, an external storage device that supports SCSI-3 persistent
- reservations)
-* Intelligent network switches
-
-Using IPMI as a power fencing device may seem like a good choice. However,
-if the IPMI shares power and/or network access with the host (such as most
-onboard IPMI controllers), a power or network failure will cause both the
-host and its fencing device to fail. The cluster will be unable to recover,
-and must stop all resources to avoid a possible split-brain situation.
-
-Likewise, any device that relies on the machine being active (such as
-SSH-based "devices" sometimes used during testing) is inappropriate,
-because fencing will be required when the node is completely unresponsive.
-
-== Configure the Cluster for Fencing ==
-
-. Install the fence agent(s). To see what packages are available, run `yum
- search fence-`. Be sure to install the package(s) on all cluster nodes.
-
-. Configure the fence device itself to be able to fence your nodes and accept
- fencing requests. This includes any necessary configuration on the device and
- on the nodes, and any firewall or SELinux changes needed. Test the
- communication between the device and your nodes.
-
-. Find the name of the correct fence agent: `pcs stonith list`
-
-. Find the parameters associated with the device:
- +pcs stonith describe pass:[<replaceable>agent_name</replaceable>]+
-
-. Create a local copy of the CIB: `pcs cluster cib stonith_cfg`
-
-. Create the fencing resource: +pcs -f stonith_cfg stonith create pass:[<replaceable>stonith_id
- stonith_device_type &#91;stonith_device_options&#93;</replaceable>]+
-+
-Any flags that do not take arguments, such as +--ssl+, should be passed as +ssl=1+.
-
-. Enable fencing in the cluster: `pcs -f stonith_cfg property set stonith-enabled=true`
-
-. If the device does not know how to fence nodes based on their cluster node
- name, you may also need to set the special *pcmk_host_map* parameter. See
- `man pacemaker-fenced` for details.
-
-. If the device does not support the *list* command, you may also need
- to set the special *pcmk_host_list* and/or *pcmk_host_check*
- parameters. See `man pacemaker-fenced` for details.
-
-. If the device does not expect the victim to be specified with the
- *port* parameter, you may also need to set the special
- *pcmk_host_argument* parameter. See `man pacemaker-fenced` for details.
-
-. Commit the new configuration: `pcs cluster cib-push stonith_cfg`
-
-. Once the fence device resource is running, test it (you might want to stop
- the cluster on that machine first):
- +stonith_admin --reboot pass:[<replaceable>nodename</replaceable>]+
-
-== Example ==
-
-For this example, assume we have a chassis containing four nodes
-and a separately powered IPMI device active on 10.0.0.1. Following the steps
-above would go something like this:
-
-Step 1: Install the *fence-agents-ipmilan* package on both nodes.
-
-Step 2: Configure the IP address, authentication credentials, etc. in the IPMI device itself.
-
-Step 3: Choose the *fence_ipmilan* STONITH agent.
-
-Step 4: Obtain the agent's possible parameters:
-----
-[root@pcmk-1 ~]# pcs stonith describe fence_ipmilan
-fence_ipmilan - Fence agent for IPMI
-
-fence_ipmilan is an I/O Fencing agentwhich can be used with machines controlled by IPMI.This agent calls support software ipmitool (http://ipmitool.sf.net/). WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.
-
-Stonith options:
- ipport: TCP/UDP port to use for connection with device
- hexadecimal_kg: Hexadecimal-encoded Kg key for IPMIv2 authentication
- port: IP address or hostname of fencing device (together with --port-as-ip)
- inet6_only: Forces agent to use IPv6 addresses only
- ipaddr: IP Address or Hostname
- passwd_script: Script to retrieve password
- method: Method to fence (onoff|cycle)
- inet4_only: Forces agent to use IPv4 addresses only
- passwd: Login password or passphrase
- lanplus: Use Lanplus to improve security of connection
- auth: IPMI Lan Auth type.
- cipher: Ciphersuite to use (same as ipmitool -C parameter)
- target: Bridge IPMI requests to the remote target address
- privlvl: Privilege level on IPMI device
- timeout: Timeout (sec) for IPMI operation
- login: Login Name
- verbose: Verbose mode
- debug: Write debug information to given file
- power_wait: Wait X seconds after issuing ON/OFF
- login_timeout: Wait X seconds for cmd prompt after login
- delay: Wait X seconds before fencing is started
- power_timeout: Test X seconds for status change after ON/OFF
- ipmitool_path: Path to ipmitool binary
- shell_timeout: Wait X seconds for cmd prompt after issuing command
- port_as_ip: Make "port/plug" to be an alias to IP address
- retry_on: Count of attempts to retry power on
- sudo: Use sudo (without password) when calling 3rd party sotfware.
- priority: The priority of the stonith resource. Devices are tried in order of highest priority to lowest.
- pcmk_host_map: A mapping of host names to ports numbers for devices that do not support host names. Eg. node1:1;node2:2,3 would tell the cluster to use port 1 for node1 and ports 2 and
- 3 for node2
- pcmk_host_list: A list of machines controlled by this device (Optional unless pcmk_host_check=static-list).
- pcmk_host_check: How to determine which machines are controlled by the device. Allowed values: dynamic-list (query the device), static-list (check the pcmk_host_list attribute), none
- (assume every device can fence every machine)
- pcmk_delay_max: Enable a random delay for stonith actions and specify the maximum of random delay. This prevents double fencing when using slow devices such as sbd. Use this to enable a
- random delay for stonith actions. The overall delay is derived from this random delay value adding a static delay so that the sum is kept below the maximum delay.
- pcmk_delay_base: Enable a base delay for stonith actions and specify base delay value. This prevents double fencing when different delays are configured on the nodes. Use this to enable
- a static delay for stonith actions. The overall delay is derived from a random delay value adding this static delay so that the sum is kept below the maximum delay.
- pcmk_action_limit: The maximum number of actions can be performed in parallel on this device Pengine property concurrent-fencing=true needs to be configured first. Then use this to
- specify the maximum number of actions can be performed in parallel on this device. -1 is unlimited.
-
-Default operations:
- monitor: interval=60s
-----
-
-Step 5: `pcs cluster cib stonith_cfg`
-
-Step 6: Here are example parameters for creating our fence device resource:
-----
-[root@pcmk-1 ~]# pcs -f stonith_cfg stonith create ipmi-fencing fence_ipmilan \
- pcmk_host_list="pcmk-1 pcmk-2" ipaddr=10.0.0.1 login=testuser \
- passwd=acd123 op monitor interval=60s
-[root@pcmk-1 ~]# pcs -f stonith_cfg stonith
- ipmi-fencing (stonith:fence_ipmilan): Stopped
-----
-
-Steps 7-10: Enable fencing in the cluster:
-----
-[root@pcmk-1 ~]# pcs -f stonith_cfg property set stonith-enabled=true
-[root@pcmk-1 ~]# pcs -f stonith_cfg property
-Cluster Properties:
- cluster-infrastructure: corosync
- cluster-name: mycluster
- dc-version: 1.1.18-11.el7_5.3-2b07d5c5a9
- have-watchdog: false
- stonith-enabled: true
-----
-
-Step 11: `pcs cluster cib-push stonith_cfg --config`
-
-Step 12: Test:
-----
-[root@pcmk-1 ~]# pcs cluster stop pcmk-2
-[root@pcmk-1 ~]# stonith_admin --reboot pcmk-2
-----
-
-After a successful test, login to any rebooted nodes, and start the cluster
-(with `pcs cluster start`).
diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Installation.txt b/doc/Clusters_from_Scratch/en-US/Ch-Installation.txt
deleted file mode 100644
index a91824ac32..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Ch-Installation.txt
+++ /dev/null
@@ -1,358 +0,0 @@
-:compat-mode: legacy
-= Installation =
-
-== Install &DISTRO; &DISTRO_VERSION; ==
-
-=== Boot the Install Image ===
-
-Download the 4GB
-http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1804.iso[&DISTRO;
-&DISTRO_VERSION; DVD ISO]. Use the image to boot a virtual machine, or
-burn it to a DVD or USB drive and boot a physical server from that.
-
-After starting the installation, select your language and keyboard layout at
-the welcome screen.
-
-.&DISTRO; &DISTRO_VERSION; Installation Welcome Screen
-image::images/Welcome.png["Welcome to &DISTRO; &DISTRO_VERSION;",align="center",scaledwidth="100%"]
-
-=== Installation Options ===
-
-At this point, you get a chance to tweak the default installation options.
-
-.&DISTRO; &DISTRO_VERSION; Installation Summary Screen
-image::images/Installer.png["&DISTRO; &DISTRO_VERSION; Installation Summary",align="center",scaledwidth="100%"]
-
-Ignore the *SOFTWARE SELECTION* section (try saying that 10 times quickly). The
-*Infrastructure Server* environment does have add-ons with much of the software
-we need, but we will leave it as a *Minimal Install* here, so that we can see
-exactly what software is required later.
-
-=== Configure Network ===
-
-In the *NETWORK & HOSTNAME* section:
-
-- Edit *Host Name:* as desired. For this example, we will use
- *pcmk-1.localdomain*.
-- Select your network device, press *Configure...*, and manually assign a fixed
- IP address. For this example, we'll use 192.168.122.101 under *IPv4 Settings*
- (with an appropriate netmask, gateway and DNS server).
-- Flip the switch to turn your network device on, and press *Done*.
-
-.&DISTRO; &DISTRO_VERSION; Network Interface Screen
-image::images/Editing-eth0.png["&DISTRO; &DISTRO_VERSION; Editing eth0",align="center",scaledwidth="100%"]
-
-[IMPORTANT]
-===========
-Do not accept the default network settings.
-Cluster machines should never obtain an IP address via DHCP, because
-DHCP's periodic address renewal will interfere with corosync.
-===========
-
-=== Configure Disk ===
-
-By default, the installer's automatic partitioning will use LVM (which allows
-us to dynamically change the amount of space allocated to a given partition).
-However, it allocates all free space to the +/+ (aka. *root*) partition, which
-cannot be reduced in size later (dynamic increases are fine).
-
-In order to follow the DRBD and GFS2 portions of this guide, we need to reserve
-space on each machine for a replicated volume.
-
-Enter the *INSTALLATION DESTINATION* section, ensure the hard drive you want to
-install to is selected, select *I will configure partitioning*, and press *Done*.
-
-In the *MANUAL PARTITIONING* screen that comes next, click the option to create
-mountpoints automatically. Select the +/+ mountpoint, and reduce the desired
-capacity by 1GiB or so. Select *Modify...* by the volume group name, and change
-the *Size policy:* to *As large as possible*, to make the reclaimed space
-available inside the LVM volume group. We'll add the additional volume later.
-
-.&DISTRO; &DISTRO_VERSION; Manual Partitioning Screen
-image::images/Partitioning.png["&DISTRO; &DISTRO_VERSION; Partitioning",align="center",scaledwidth="100%"]
-
-Press *Done*, then *Accept changes*.
-
-=== Configure Time Synchronization ===
-
-It is highly recommended to enable NTP on your cluster nodes. Doing so
-ensures all nodes agree on the current time and makes reading log files
-significantly easier.
-
-&DISTRO; will enable NTP automatically. If you want to change any time-related
-settings (such as time zone or NTP server), you can do this in the
-*TIME & DATE* section.
-
-=== Finish Install ===
-
-Select *Begin Installation*. Once it completes, set a root password, and reboot
-as instructed. For the purposes of this document, it is not necessary to create
-any additional users. After the node reboots, you'll see a login prompt on
-the console. Login using *root* and the password you created earlier.
-
-.&DISTRO; &DISTRO_VERSION; Console Prompt
-image::images/Console.png["&DISTRO; &DISTRO_VERSION; Console",align="center",scaledwidth="100%"]
-
-[NOTE]
-======
-
-From here on, we're going to be working exclusively from the terminal.
-
-======
-
-== Configure the OS ==
-
-=== Verify Networking ===
-
-Ensure that the machine has the static IP address you configured earlier.
-
------
-[root@pcmk-1 ~]# ip addr
-1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- inet 127.0.0.1/8 scope host lo
- valid_lft forever preferred_lft forever
- inet6 ::1/128 scope host
- valid_lft forever preferred_lft forever
-2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
- link/ether 52:54:00:8e:eb:41 brd ff:ff:ff:ff:ff:ff
- inet 192.168.122.101/24 brd 192.168.122.255 scope global noprefixroute eth0
- valid_lft forever preferred_lft forever
- inet6 fe80::e45:c99b:34c0:c657/64 scope link noprefixroute
- valid_lft forever preferred_lft forever
------
-
-[NOTE]
-=====
-If you ever need to change the node's IP address from the command line, follow
-these instructions, replacing *${device}* with the name of your network device:
-
-....
-[root@pcmk-1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-${device} # manually edit as desired
-[root@pcmk-1 ~]# nmcli dev disconnect ${device}
-[root@pcmk-1 ~]# nmcli con reload ${device}
-[root@pcmk-1 ~]# nmcli con up ${device}
-....
-
-This makes *NetworkManager* aware that a change was made on the config file.
-
-=====
-
-Next, ensure that the routes are as expected:
-
------
-[root@pcmk-1 ~]# ip route
-default via 192.168.122.1 dev eth0 proto static metric 100
-192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.101 metric 100
------
-
-If there is no line beginning with *default via*, then you may need to add a line such as
-
-[source,Bash]
-GATEWAY="192.168.122.1"
-
-to the device configuration using the same process as described above for
-changing the IP address.
-
-Now, check for connectivity to the outside world. Start small by
-testing whether we can reach the gateway we configured.
-
------
-[root@pcmk-1 ~]# ping -c 1 192.168.122.1
-PING 192.168.122.1 (192.168.122.1) 56(84) bytes of data.
-64 bytes from 192.168.122.1: icmp_seq=1 ttl=64 time=0.254 ms
-
---- 192.168.122.1 ping statistics ---
-1 packets transmitted, 1 received, 0% packet loss, time 0ms
-rtt min/avg/max/mdev = 0.254/0.254/0.254/0.000 ms
------
-
-Now try something external; choose a location you know should be available.
-
------
-[root@pcmk-1 ~]# ping -c 1 www.clusterlabs.org
-PING oss-uk-1.clusterlabs.org (109.74.197.241) 56(84) bytes of data.
-64 bytes from oss-uk-1.clusterlabs.org (109.74.197.241): icmp_seq=1 ttl=49 time=333 ms
-
---- oss-uk-1.clusterlabs.org ping statistics ---
-1 packets transmitted, 1 received, 0% packet loss, time 0ms
-rtt min/avg/max/mdev = 333.204/333.204/333.204/0.000 ms
------
-
-=== Login Remotely ===
-
-The console isn't a very friendly place to work from, so we will now
-switch to accessing the machine remotely via SSH where we can
-use copy and paste, etc.
-
-From another host, check whether we can see the new host at all:
-
------
-beekhof@f16 ~ # ping -c 1 192.168.122.101
-PING 192.168.122.101 (192.168.122.101) 56(84) bytes of data.
-64 bytes from 192.168.122.101: icmp_req=1 ttl=64 time=1.01 ms
-
---- 192.168.122.101 ping statistics ---
-1 packets transmitted, 1 received, 0% packet loss, time 0ms
-rtt min/avg/max/mdev = 1.012/1.012/1.012/0.000 ms
------
-
-Next, login as root via SSH.
-
------
-beekhof@f16 ~ # ssh -l root 192.168.122.101
-The authenticity of host '192.168.122.101 (192.168.122.101)' can't be established.
-ECDSA key fingerprint is 6e:b7:8f:e2:4c:94:43:54:a8:53:cc:20:0f:29:a4:e0.
-Are you sure you want to continue connecting (yes/no)? yes
-Warning: Permanently added '192.168.122.101' (ECDSA) to the list of known hosts.
-root@192.168.122.101's password:
-Last login: Tue Aug 11 13:14:39 2015
-[root@pcmk-1 ~]#
------
-
-=== Apply Updates ===
-
-Apply any package updates released since your installation image was created:
-----
-[root@pcmk-1 ~]# yum update
-----
-
-=== Use Short Node Names ===
-
-During installation, we filled in the machine's fully qualified domain
-name (FQDN), which can be rather long when it appears in cluster logs and
-status output. See for yourself how the machine identifies itself:
-(((Nodes, short name)))
-
-----
-[root@pcmk-1 ~]# uname -n
-pcmk-1.localdomain
-----
-(((Nodes, Domain name (Query))))
-
-We can use the `hostnamectl` tool to strip off the domain name:
-----
-[root@pcmk-1 ~]# hostnamectl set-hostname $(uname -n | sed s/\\..*//)
-----
-(((Nodes, Domain name (Remove from host name))))
-
-Now, check that the machine is using the correct name:
-----
-[root@pcmk-1 ~]# uname -n
-pcmk-1
-----
-
-You may want to reboot to ensure all updates take effect.
-
-== Repeat for Second Node ==
-
-Repeat the Installation steps so far, so that you have two
-nodes ready to have the cluster software installed.
-
-For the purposes of this document, the additional node is called
-pcmk-2 with address 192.168.122.102.
-
-== Configure Communication Between Nodes ==
-
-=== Configure Host Name Resolution ===
-
-Confirm that you can communicate between the two new nodes:
-
-----
-[root@pcmk-1 ~]# ping -c 3 192.168.122.102
-PING 192.168.122.102 (192.168.122.102) 56(84) bytes of data.
-64 bytes from 192.168.122.102: icmp_seq=1 ttl=64 time=0.343 ms
-64 bytes from 192.168.122.102: icmp_seq=2 ttl=64 time=0.402 ms
-64 bytes from 192.168.122.102: icmp_seq=3 ttl=64 time=0.558 ms
-
---- 192.168.122.102 ping statistics ---
-3 packets transmitted, 3 received, 0% packet loss, time 2000ms
-rtt min/avg/max/mdev = 0.343/0.434/0.558/0.092 ms
-----
-
-Now we need to make sure we can communicate with the machines by their
-name. If you have a DNS server, add additional entries for the two
-machines. Otherwise, you'll need to add the machines to +/etc/hosts+
-on both nodes. Below are the entries for my cluster nodes:
-
-----
-[root@pcmk-1 ~]# grep pcmk /etc/hosts
-192.168.122.101 pcmk-1.clusterlabs.org pcmk-1
-192.168.122.102 pcmk-2.clusterlabs.org pcmk-2
-----
-
-We can now verify the setup by again using ping:
-
-----
-[root@pcmk-1 ~]# ping -c 3 pcmk-2
-PING pcmk-2.clusterlabs.org (192.168.122.101) 56(84) bytes of data.
-64 bytes from pcmk-1.clusterlabs.org (192.168.122.101): icmp_seq=1 ttl=64 time=0.164 ms
-64 bytes from pcmk-1.clusterlabs.org (192.168.122.101): icmp_seq=2 ttl=64 time=0.475 ms
-64 bytes from pcmk-1.clusterlabs.org (192.168.122.101): icmp_seq=3 ttl=64 time=0.186 ms
-
---- pcmk-2.clusterlabs.org ping statistics ---
-3 packets transmitted, 3 received, 0% packet loss, time 2001ms
-rtt min/avg/max/mdev = 0.164/0.275/0.475/0.141 ms
-----
-
-=== Configure SSH ===
-
-SSH is a convenient and secure way to copy files and perform commands
-remotely. For the purposes of this guide, we will create a key without a
-password (using the -N option) so that we can perform remote actions
-without being prompted.
-
-(((SSH)))
-
-[WARNING]
-=========
-Unprotected SSH keys (those without a password) are not recommended for servers exposed to the outside world.
-We use them here only to simplify the demo.
-=========
-
-Create a new key and allow anyone with that key to log in:
-
-.Creating and Activating a new SSH Key
-----
-[root@pcmk-1 ~]# ssh-keygen -t dsa -f ~/.ssh/id_dsa -N ""
-Generating public/private dsa key pair.
-Your identification has been saved in /root/.ssh/id_dsa.
-Your public key has been saved in /root/.ssh/id_dsa.pub.
-The key fingerprint is:
-91:09:5c:82:5a:6a:50:08:4e:b2:0c:62:de:cc:74:44 root@pcmk-1.clusterlabs.org
-The key's randomart image is:
-+--[ DSA 1024]----+
-|==.ooEo.. |
-|X O + .o o |
-| * A + |
-| + . |
-| . S |
-| |
-| |
-| |
-| |
-+-----------------+
-[root@pcmk-1 ~]# cp ~/.ssh/id_dsa.pub ~/.ssh/authorized_keys
-----
-(((Creating and Activating a new SSH Key)))
-
-Install the key on the other node:
-----
-[root@pcmk-1 ~]# scp -r ~/.ssh pcmk-2:
-The authenticity of host 'pcmk-2 (192.168.122.102)' can't be established.
-ECDSA key fingerprint is SHA256:63xNPkPYq98rYznf3T9QYJAzlaGiAsSgFVNHOZjPWqc.
-ECDSA key fingerprint is MD5:d9:bf:6e:32:88:be:47:3d:96:f1:96:27:65:05:0b:c3.
-Are you sure you want to continue connecting (yes/no)? yes
-Warning: Permanently added 'pcmk-2,192.168.122.102' (ECDSA) to the list of known hosts.
-root@pcmk-2's password:
-id_dsa
-id_dsa.pub
-authorized_keys
-known_hosts
-----
-
-Test that you can now run commands remotely, without being prompted:
-----
-[root@pcmk-1 ~]# ssh pcmk-2 -- uname -n
-pcmk-2
-----
diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Intro.txt b/doc/Clusters_from_Scratch/en-US/Ch-Intro.txt
deleted file mode 100644
index 60ca19e900..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Ch-Intro.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-:compat-mode: legacy
-= Read-Me-First =
-
-== The Scope of this Document ==
-
-Computer clusters can be used to provide highly available services or
-resources. The redundancy of multiple machines is used to guard
-against failures of many types.
-
-This document will walk through the installation and setup of simple
-clusters using the &DISTRO; distribution, version &DISTRO_VERSION;.
-
-The clusters described here will use Pacemaker and Corosync to provide
-resource management and messaging. Required packages and modifications
-to their configuration files are described along with the use of the
-Pacemaker command line tool for generating the XML used for cluster
-control.
-
-Pacemaker is a central component and provides the resource management
-required in these systems. This management includes detecting and
-recovering from the failure of various nodes, resources and services
-under its control.
-
-When more in-depth information is required, and for real-world usage,
-please refer to the
-https://www.clusterlabs.org/pacemaker/doc/[Pacemaker Explained] manual.
-
-include::../../shared/en-US/pacemaker-intro.txt[]
diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Shared-Storage.txt b/doc/Clusters_from_Scratch/en-US/Ch-Shared-Storage.txt
deleted file mode 100644
index f9287da3cf..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Ch-Shared-Storage.txt
+++ /dev/null
@@ -1,614 +0,0 @@
-:compat-mode: legacy
-= Replicate Storage Using DRBD =
-
-Even if you're serving up static websites, having to manually synchronize
-the contents of that website to all the machines in the cluster is not
-ideal. For dynamic websites, such as a wiki, it's not even an option. Not
-everyone care afford network-attached storage, but somehow the data needs
-to be kept in sync.
-
-Enter DRBD, which can be thought of as network-based RAID-1.
-footnote:[See http://www.drbd.org/ for details.]
-
-== Install the DRBD Packages ==
-
-DRBD itself is included in the upstream kernel,footnote:[Since version 2.6.33]
-but we do need some utilities to use it effectively.
-
-CentOS does not ship these utilities, so we need to enable a third-party
-repository to get them. Supported packages for many OSes are available from
-DRBD's maker http://www.linbit.com/[LINBIT], but here we'll use the free
-http://elrepo.org/[ELRepo] repository.
-
-On both nodes, import the ELRepo package signing key, and enable the
-repository:
-----
-# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
-# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
-Retrieving http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
-Preparing... ################################# [100%]
-Updating / installing...
- 1:elrepo-release-7.0-3.el7.elrepo ################################# [100%]
-----
-
-Now, we can install the DRBD kernel module and utilities:
-----
-# yum install -y kmod-drbd84 drbd84-utils
-----
-
-DRBD will not be able to run under the default SELinux security policies.
-If you are familiar with SELinux, you can modify the policies in a more
-fine-grained manner, but here we will simply exempt DRBD processes from SELinux
-control:
-----
-# semanage permissive -a drbd_t
-----
-
-We will configure DRBD to use port 7789, so allow that port from each host to
-the other:
-----
-[root@pcmk-1 ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" \
- source address="192.168.122.102" port port="7789" protocol="tcp" accept'
-success
-[root@pcmk-1 ~]# firewall-cmd --reload
-success
-----
-----
-[root@pcmk-2 ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" \
- source address="192.168.122.101" port port="7789" protocol="tcp" accept'
-success
-[root@pcmk-2 ~]# firewall-cmd --reload
-success
-----
-
-[NOTE]
-======
-In this example, we have only two nodes, and all network traffic is on the same LAN.
-In production, it is recommended to use a dedicated, isolated network for cluster-related traffic,
-so the firewall configuration would likely be different; one approach would be to
-add the dedicated network interfaces to the trusted zone.
-======
-
-== Allocate a Disk Volume for DRBD ==
-
-DRBD will need its own block device on each node. This can be
-a physical disk partition or logical volume, of whatever size
-you need for your data. For this document, we will use a 512MiB logical volume,
-which is more than sufficient for a single HTML file and (later) GFS2 metadata.
-
-----
-[root@pcmk-1 ~]# vgdisplay | grep -e Name -e Free
- VG Name centos_pcmk-1
- Free PE / Size 255 / 1020.00 MiB
-[root@pcmk-1 ~]# lvcreate --name drbd-demo --size 512M centos_pcmk-1
- Logical volume "drbd-demo" created.
-[root@pcmk-1 ~]# lvs
- LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
- drbd-demo centos_pcmk-1 -wi-a----- 512.00m
- root centos_pcmk-1 -wi-ao---- 3.00g
- swap centos_pcmk-1 -wi-ao---- 1.00g
-----
-
-Repeat for the second node, making sure to use the same size:
-
-----
-[root@pcmk-1 ~]# ssh pcmk-2 -- lvcreate --name drbd-demo --size 512M centos_pcmk-2
- Logical volume "drbd-demo" created.
-----
-
-== Configure DRBD ==
-
-There is no series of commands for building a DRBD configuration, so simply
-run this on both nodes to use this sample configuration:
-
-----
-# cat <<END >/etc/drbd.d/wwwdata.res
-resource wwwdata {
- protocol C;
- meta-disk internal;
- device /dev/drbd1;
- syncer {
- verify-alg sha1;
- }
- net {
- allow-two-primaries;
- }
- on pcmk-1 {
- disk /dev/centos_pcmk-1/drbd-demo;
- address 192.168.122.101:7789;
- }
- on pcmk-2 {
- disk /dev/centos_pcmk-2/drbd-demo;
- address 192.168.122.102:7789;
- }
-}
-END
-----
-
-[IMPORTANT]
-=========
-Edit the file to use the hostnames, IP addresses and logical volume paths
-of your nodes if they differ from the ones used in this guide.
-=========
-
-[NOTE]
-=======
-Detailed information on the directives used in this configuration (and
-other alternatives) is available in the
-https://docs.linbit.com/docs/users-guide-8.4/#ch-configure[DRBD User's Guide].
-The *allow-two-primaries* option would not normally be used in
-an active/passive cluster. We are adding it here for the convenience
-of changing to an active/active cluster later.
-=======
-
-== Initialize DRBD ==
-
-With the configuration in place, we can now get DRBD running.
-
-These commands create the local metadata for the DRBD resource,
-ensure the DRBD kernel module is loaded, and bring up the DRBD resource.
-Run them on one node:
-
-----
-[root@pcmk-1 ~]# drbdadm create-md wwwdata
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- --== Thank you for participating in the global usage survey ==--
-The server's response is:
-
-you are the 2147th user to install this version
-initializing activity log
-initializing bitmap (16 KB) to all zero
-Writing meta data...
-New drbd meta data block successfully created.
-success
-[root@pcmk-1 ~]# modprobe drbd
-[root@pcmk-1 ~]# drbdadm up wwwdata
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- --== Thank you for participating in the global usage survey ==--
-The server's response is:
-
-----
-
-We can confirm DRBD's status on this node:
-
-----
-[root@pcmk-1 ~]# cat /proc/drbd
-version: 8.4.11-1 (api:1/proto:86-101)
-GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-04-26 12:10:42
-
- 1: cs:WFConnection ro:Secondary/Unknown ds:Inconsistent/DUnknown C r----s
- ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:524236
-----
-
-Because we have not yet initialized the data, this node's data
-is marked as *Inconsistent*. Because we have not yet initialized
-the second node, the local state is *WFConnection* (waiting for connection),
-and the partner node's status is marked as *Unknown*.
-
-Now, repeat the above commands on the second node, starting with creating
-wwwdata.res. After giving it time to connect, when we check the status, it
-shows:
-
-----
-[root@pcmk-2 ~]# cat /proc/drbd
-version: 8.4.11-1 (api:1/proto:86-101)
-GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-04-26 12:10:42
-
- 1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
- ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:524236
-----
-
-You can see the state has changed to *Connected*, meaning the two DRBD nodes
-are communicating properly, and both nodes are in *Secondary* role
-with *Inconsistent* data.
-
-To make the data consistent, we need to tell DRBD which node should be
-considered to have the correct data. In this case, since we are creating
-a new resource, both have garbage, so we'll just pick pcmk-1
-and run this command on it:
-
-----
-[root@pcmk-1 ~]# drbdadm primary --force wwwdata
-----
-
-[NOTE]
-======
-If you are using a different version of DRBD, the required syntax may be different.
-See the documentation for your version for how to perform these commands.
-======
-
-If we check the status immediately, we'll see something like this:
-----
-[root@pcmk-1 ~]# cat /proc/drbd
-version: 8.4.11-1 (api:1/proto:86-101)
-GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-04-26 12:10:42
-
- 1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
- ns:43184 nr:0 dw:0 dr:45312 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:481052
- [>...................] sync'ed: 8.6% (481052/524236)K
- finish: 0:01:51 speed: 4,316 (4,316) K/sec
-----
-
-We can see that this node has the *Primary* role, the partner node has
-the *Secondary* role, this node's data is now considered *UpToDate*,
-the partner node's data is still *Inconsistent*, and a progress bar
-shows how far along the partner node is in synchronizing the data.
-
-After a while, the sync should finish, and you'll see something like:
-----
-[root@pcmk-1 ~]# cat /proc/drbd
-version: 8.4.11-1 (api:1/proto:86-101)
-GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-04-26 12:10:42
-
- 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
- ns:524236 nr:0 dw:0 dr:526364 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
-----
-
-Both sets of data are now *UpToDate*, and we can proceed to creating
-and populating a filesystem for our WebSite resource's documents.
-
-== Populate the DRBD Disk ==
-
-On the node with the primary role (pcmk-1 in this example),
-create a filesystem on the DRBD device:
-
-----
-[root@pcmk-1 ~]# mkfs.xfs /dev/drbd1
-meta-data=/dev/drbd1 isize=512 agcount=4, agsize=32765 blks
- = sectsz=512 attr=2, projid32bit=1
- = crc=1 finobt=0, sparse=0
-data = bsize=4096 blocks=131059, imaxpct=25
- = sunit=0 swidth=0 blks
-naming =version 2 bsize=4096 ascii-ci=0 ftype=1
-log =internal log bsize=4096 blocks=855, version=2
- = sectsz=512 sunit=0 blks, lazy-count=1
-realtime =none extsz=4096 blocks=0, rtextents=0
-----
-
-[NOTE]
-====
-In this example, we create an xfs filesystem with no special options.
-In a production environment, you should choose a filesystem type and
-options that are suitable for your application.
-====
-
-Mount the newly created filesystem, populate it with our web document,
-give it the same SELinux policy as the web document root,
-then unmount it (the cluster will handle mounting and unmounting it later):
-
-----
-[root@pcmk-1 ~]# mount /dev/drbd1 /mnt
-[root@pcmk-1 ~]# cat <<-END >/mnt/index.html
- <html>
- <body>My Test Site - DRBD</body>
- </html>
-END
-[root@pcmk-1 ~]# chcon -R --reference=/var/www/html /mnt
-[root@pcmk-1 ~]# umount /dev/drbd1
-----
-
-== Configure the Cluster for the DRBD device ==
-
-One handy feature `pcs` has is the ability to queue up several changes
-into a file and commit those changes all at once. To do this, start by
-populating the file with the current raw XML config from the CIB.
-
-----
-[root@pcmk-1 ~]# pcs cluster cib drbd_cfg
-----
-
-Using pcs's `-f` option, make changes to the configuration saved
-in the +drbd_cfg+ file. These changes will not be seen by the cluster until
-the +drbd_cfg+ file is pushed into the live cluster's CIB later.
-
-Here, we create a cluster resource for the DRBD device, and an additional _clone_
-resource to allow the resource to run on both nodes at the same time.
-
-----
-[root@pcmk-1 ~]# pcs -f drbd_cfg resource create WebData ocf:linbit:drbd \
- drbd_resource=wwwdata op monitor interval=60s
-[root@pcmk-1 ~]# pcs -f drbd_cfg resource master WebDataClone WebData \
- master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 \
- notify=true
-[root@pcmk-1 ~]# pcs -f drbd_cfg resource show
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
- WebSite (ocf::heartbeat:apache): Started pcmk-1
- Master/Slave Set: WebDataClone [WebData]
- Stopped: [ pcmk-1 pcmk-2 ]
-----
-
-.Note
-[NOTE]
-====
-In Fedora 29 and CentOS 8.0, 'master' resources have been renamed to
-'promotable clone' resources and the `pcs` command has been changed
-accordingly:
-----
-[root@pcmk-1 ~]# pcs -f drbd_cfg resource promotable WebData \
- promoted-max=1 promoted-node-max=1 clone-max=2 clone-node-max=1 \
- notify=true
-----
-The new command does not allow to set a custom name for the resulting
-promotable resource. `Pcs` automatically creates a name for the resource in
-the form of *pass:[<replaceable>resource_name</replaceable>]-clone*, that is
-*WebData-clone* in this case.
-
-To avoid confusion whether the +pcs resource show+ command displays resources'
-status or configuration, the command has been deprecated in Fedora 29 and
-CentOS 8.0. Two new commands have been introduced for displaying resources'
-status and configuration: `pcs resource status` and `pcs resource config`,
-respectively.
-====
-
-After you are satisfied with all the changes, you can commit
-them all at once by pushing the drbd_cfg file into the live CIB.
-
-----
-[root@pcmk-1 ~]# pcs cluster cib-push drbd_cfg --config
-CIB updated
-----
-
-Let's see what the cluster did with the new configuration:
-----
-[root@pcmk-1 ~]# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: pcmk-2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Mon Sep 10 17:58:07 2018
-Last change: Mon Sep 10 17:57:53 2018 by root via cibadmin on pcmk-1
-
-2 nodes configured
-4 resources configured
-
-Online: [ pcmk-1 pcmk-2 ]
-
-Full list of resources:
-
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
- WebSite (ocf::heartbeat:apache): Started pcmk-1
- Master/Slave Set: WebDataClone [WebData]
- Masters: [ pcmk-1 ]
- Slaves: [ pcmk-2 ]
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-We can see that *WebDataClone* (our DRBD device) is running as master (DRBD's
-primary role) on *pcmk-1* and slave (DRBD's secondary role) on *pcmk-2*.
-
-[IMPORTANT]
-====
-The resource agent should load the DRBD module when needed if it's not already
-loaded. If that does not happen, configure your operating system to load the
-module at boot time. For &DISTRO; &DISTRO_VERSION;, you would run this on both
-nodes:
-----
-# echo drbd >/etc/modules-load.d/drbd.conf
-----
-====
-
-== Configure the Cluster for the Filesystem ==
-
-Now that we have a working DRBD device, we need to mount its filesystem.
-
-In addition to defining the filesystem, we also need to
-tell the cluster where it can be located (only on the DRBD Primary)
-and when it is allowed to start (after the Primary was promoted).
-
-We are going to take a shortcut when creating the resource this time.
-Instead of explicitly saying we want the *ocf:heartbeat:Filesystem* script, we
-are only going to ask for *Filesystem*. We can do this because we know there is only
-one resource script named *Filesystem* available to pacemaker, and that pcs is smart
-enough to fill in the *ocf:heartbeat:* portion for us correctly in the configuration.
-If there were multiple *Filesystem* scripts from different OCF providers, we would need
-to specify the exact one we wanted.
-
-Once again, we will queue our changes to a file and then push the
-new configuration to the cluster as the final step.
-
-----
-[root@pcmk-1 ~]# pcs cluster cib fs_cfg
-[root@pcmk-1 ~]# pcs -f fs_cfg resource create WebFS Filesystem \
- device="/dev/drbd1" directory="/var/www/html" fstype="xfs"
-Assumed agent name 'ocf:heartbeat:Filesystem' (deduced from 'Filesystem')
-[root@pcmk-1 ~]# pcs -f fs_cfg constraint colocation add \
- WebFS with WebDataClone INFINITY with-rsc-role=Master
-[root@pcmk-1 ~]# pcs -f fs_cfg constraint order \
- promote WebDataClone then start WebFS
-Adding WebDataClone WebFS (kind: Mandatory) (Options: first-action=promote then-action=start)
-----
-
-We also need to tell the cluster that Apache needs to run on the same
-machine as the filesystem and that it must be active before Apache can
-start.
-
-----
-[root@pcmk-1 ~]# pcs -f fs_cfg constraint colocation add WebSite with WebFS INFINITY
-[root@pcmk-1 ~]# pcs -f fs_cfg constraint order WebFS then WebSite
-Adding WebFS WebSite (kind: Mandatory) (Options: first-action=start then-action=start)
-----
-
-Review the updated configuration.
-
-----
-[root@pcmk-1 ~]# pcs -f fs_cfg constraint
-Location Constraints:
- Resource: WebSite
- Enabled on: pcmk-1 (score:50)
-Ordering Constraints:
- start ClusterIP then start WebSite (kind:Mandatory)
- promote WebDataClone then start WebFS (kind:Mandatory)
- start WebFS then start WebSite (kind:Mandatory)
-Colocation Constraints:
- WebSite with ClusterIP (score:INFINITY)
- WebFS with WebDataClone (score:INFINITY) (with-rsc-role:Master)
- WebSite with WebFS (score:INFINITY)
-Ticket Constraints:
-[root@pcmk-1 ~]# pcs -f fs_cfg resource show
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
- WebSite (ocf::heartbeat:apache): Started pcmk-1
- Master/Slave Set: WebDataClone [WebData]
- Masters: [ pcmk-1 ]
- Slaves: [ pcmk-2 ]
- WebFS (ocf::heartbeat:Filesystem): Stopped
-----
-
-After reviewing the new configuration, upload it and watch the
-cluster put it into effect.
-
-----
-[root@pcmk-1 ~]# pcs cluster cib-push fs_cfg --config
-CIB updated
-[root@pcmk-1 ~]# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: pcmk-2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Mon Sep 10 18:02:24 2018
-Last change: Mon Sep 10 18:02:14 2018 by root via cibadmin on pcmk-1
-
-2 nodes configured
-5 resources configured
-
-Online: [ pcmk-1 pcmk-2 ]
-
-Full list of resources:
-
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
- WebSite (ocf::heartbeat:apache): Started pcmk-1
- Master/Slave Set: WebDataClone [WebData]
- Masters: [ pcmk-1 ]
- Slaves: [ pcmk-2 ]
- WebFS (ocf::heartbeat:Filesystem): Started pcmk-1
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-== Test Cluster Failover ==
-
-Previously, we used `pcs cluster stop pcmk-1` to stop all cluster
-services on *pcmk-1*, failing over the cluster resources, but there is another
-way to safely simulate node failure.
-
-We can put the node into _standby mode_. Nodes in this state continue to
-run corosync and pacemaker but are not allowed to run resources. Any resources
-found active there will be moved elsewhere. This feature can be particularly
-useful when performing system administration tasks such as updating packages
-used by cluster resources.
-
-Put the active node into standby mode, and observe the cluster move all
-the resources to the other node. The node's status will change to indicate that
-it can no longer host resources, and eventually all the resources will move.
-
-----
-[root@pcmk-1 ~]# pcs cluster standby pcmk-1
-[root@pcmk-1 ~]# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: pcmk-2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Mon Sep 10 18:04:22 2018
-Last change: Mon Sep 10 18:03:43 2018 by root via cibadmin on pcmk-1
-
-2 nodes configured
-5 resources configured
-
-Node pcmk-1: standby
-Online: [ pcmk-2 ]
-
-Full list of resources:
-
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-2
- WebSite (ocf::heartbeat:apache): Started pcmk-2
- Master/Slave Set: WebDataClone [WebData]
- Masters: [ pcmk-2 ]
- Stopped: [ pcmk-1 ]
- WebFS (ocf::heartbeat:Filesystem): Started pcmk-2
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-Once we've done everything we needed to on pcmk-1 (in this case nothing,
-we just wanted to see the resources move), we can allow the node to be a
-full cluster member again.
-
-----
-[root@pcmk-1 ~]# pcs cluster unstandby pcmk-1
-[root@pcmk-1 ~]# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: pcmk-2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Mon Sep 10 18:05:22 2018
-Last change: Mon Sep 10 18:05:21 2018 by root via cibadmin on pcmk-1
-
-2 nodes configured
-5 resources configured
-
-Online: [ pcmk-1 pcmk-2 ]
-
-Full list of resources:
-
- ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-2
- WebSite (ocf::heartbeat:apache): Started pcmk-2
- Master/Slave Set: WebDataClone [WebData]
- Masters: [ pcmk-2 ]
- Slaves: [ pcmk-1 ]
- WebFS (ocf::heartbeat:Filesystem): Started pcmk-2
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-Notice that *pcmk-1* is back to the *Online* state, and that the cluster resources
-stay where they are due to our resource stickiness settings configured earlier.
-
-.Note
-[NOTE]
-====
-Since Fedora 29 and CentOS 8.0, the commands for controlling standby mode are
-`pcs node standby` and `pcs node unstandby`.
-====
diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Verification.txt b/doc/Clusters_from_Scratch/en-US/Ch-Verification.txt
deleted file mode 100644
index e21688dbc0..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Ch-Verification.txt
+++ /dev/null
@@ -1,210 +0,0 @@
-:compat-mode: legacy
-= Start and Verify Cluster =
-
-== Start the Cluster ==
-
-Now that corosync is configured, it is time to start the cluster.
-The command below will start corosync and pacemaker on both nodes
-in the cluster. If you are issuing the start command from a different
-node than the one you ran the `pcs cluster auth` command on earlier, you
-must authenticate on the current node you are logged into before you will
-be allowed to start the cluster.
-
-----
-[root@pcmk-1 ~]# pcs cluster start --all
-pcmk-1: Starting Cluster...
-pcmk-2: Starting Cluster...
-----
-
-[NOTE]
-======
-An alternative to using the `pcs cluster start --all` command
-is to issue either of the below command sequences on each node in the
-cluster separately:
-
-----
-# pcs cluster start
-Starting Cluster...
-----
-
-or
-
-----
-# systemctl start corosync.service
-# systemctl start pacemaker.service
-----
-======
-
-[IMPORTANT]
-====
-In this example, we are not enabling the corosync and pacemaker services
-to start at boot. If a cluster node fails or is rebooted, you will need to run
-+pcs cluster start pass:[<replaceable>nodename</replaceable>]+ (or `--all`) to start the cluster on it.
-While you could enable the services to start at boot, requiring a manual
-start of cluster services gives you the opportunity to do a post-mortem investigation
-of a node failure before returning it to the cluster.
-====
-
-== Verify Corosync Installation ==
-
-First, use `corosync-cfgtool` to check whether cluster communication is happy:
-
-----
-[root@pcmk-1 ~]# corosync-cfgtool -s
-Printing ring status.
-Local node ID 1
-RING ID 0
- id = 192.168.122.101
- status = ring 0 active with no faults
-----
-
-We can see here that everything appears normal with our fixed IP
-address (not a 127.0.0.x loopback address) listed as the *id*, and *no
-faults* for the status.
-
-If you see something different, you might want to start by checking
-the node's network, firewall and SELinux configurations.
-
-Next, check the membership and quorum APIs:
-
-----
-[root@pcmk-1 ~]# corosync-cmapctl | grep members
-runtime.totem.pg.mrp.srp.members.1.config_version (u64) = 0
-runtime.totem.pg.mrp.srp.members.1.ip (str) = r(0) ip(192.168.122.101)
-runtime.totem.pg.mrp.srp.members.1.join_count (u32) = 1
-runtime.totem.pg.mrp.srp.members.1.status (str) = joined
-runtime.totem.pg.mrp.srp.members.2.config_version (u64) = 0
-runtime.totem.pg.mrp.srp.members.2.ip (str) = r(0) ip(192.168.122.102)
-runtime.totem.pg.mrp.srp.members.2.join_count (u32) = 1
-runtime.totem.pg.mrp.srp.members.2.status (str) = joined
-
-[root@pcmk-1 ~]# pcs status corosync
-
-Membership information
-\----------------------
- Nodeid Votes Name
- 1 1 pcmk-1 (local)
- 2 1 pcmk-2
-----
-
-You should see both nodes have joined the cluster.
-
-== Verify Pacemaker Installation ==
-
-Now that we have confirmed that Corosync is functional, we can check
-the rest of the stack. Pacemaker has already been started, so verify
-the necessary processes are running:
-
-----
-[root@pcmk-1 ~]# ps axf
- PID TTY STAT TIME COMMAND
- 2 ? S 0:00 [kthreadd]
-...lots of processes...
-11635 ? SLsl 0:03 corosync
-11642 ? Ss 0:00 /usr/sbin/pacemakerd -f
-11643 ? Ss 0:00 \_ /usr/libexec/pacemaker/cib
-11644 ? Ss 0:00 \_ /usr/libexec/pacemaker/stonithd
-11645 ? Ss 0:00 \_ /usr/libexec/pacemaker/lrmd
-11646 ? Ss 0:00 \_ /usr/libexec/pacemaker/attrd
-11647 ? Ss 0:00 \_ /usr/libexec/pacemaker/pengine
-11648 ? Ss 0:00 \_ /usr/libexec/pacemaker/crmd
-----
-
-If that looks OK, check the `pcs status` output:
-
-----
-[root@pcmk-1 ~]# pcs status
-Cluster name: mycluster
-WARNING: no stonith devices and stonith-enabled is not false
-Stack: corosync
-Current DC: pcmk-2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
-Last updated: Mon Sep 10 16:37:34 2018
-Last change: Mon Sep 10 16:30:53 2018 by hacluster via crmd on pcmk-2
-
-2 nodes configured
-0 resources configured
-
-Online: [ pcmk-1 pcmk-2 ]
-
-No resources
-
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-Finally, ensure there are no start-up errors from corosync or pacemaker (aside
-from messages relating to not having STONITH configured, which are OK at this
-point):
-----
-[root@pcmk-1 ~]# journalctl -b | grep -i error
-----
-
-[NOTE]
-======
-Other operating systems may report startup errors in other locations,
-for example +/var/log/messages+.
-======
-
-Repeat these checks on the other node. The results should be the same.
-
-== Explore the Existing Configuration ==
-
-For those who are not of afraid of XML, you can see the raw cluster
-configuration and status by using the `pcs cluster cib` command.
-
-.The last XML you'll see in this document
-======
-----
-[root@pcmk-1 ~]# pcs cluster cib
-----
-[source,XML]
-----
-<cib crm_feature_set="3.0.14" validate-with="pacemaker-2.10" epoch="5" num_updates="4" admin_epoch="0" cib-last-written="Mon Sep 10 16:30:53 2018" update-origin="pcmk-2" update-client="crmd" update-user="hacluster" have-quorum="1" dc-uuid="2">
- <configuration>
- <crm_config>
- <cluster_property_set id="cib-bootstrap-options">
- <nvpair id="cib-bootstrap-options-have-watchdog" name="have-watchdog" value="false"/>
- <nvpair id="cib-bootstrap-options-dc-version" name="dc-version" value="1.1.18-11.el7_5.3-2b07d5c5a9"/>
- <nvpair id="cib-bootstrap-options-cluster-infrastructure" name="cluster-infrastructure" value="corosync"/>
- <nvpair id="cib-bootstrap-options-cluster-name" name="cluster-name" value="mycluster"/>
- </cluster_property_set>
- </crm_config>
- <nodes>
- <node id="1" uname="pcmk-1"/>
- <node id="2" uname="pcmk-2"/>
- </nodes>
- <resources/>
- <constraints/>
- </configuration>
- <status>
- <node_state id="1" uname="pcmk-1" in_ccm="true" crmd="online" crm-debug-origin="do_state_transition" join="member" expected="member">
- <lrm id="1">
- <lrm_resources/>
- </lrm>
- </node_state>
- <node_state id="2" uname="pcmk-2" in_ccm="true" crmd="online" crm-debug-origin="do_state_transition" join="member" expected="member">
- <lrm id="2">
- <lrm_resources/>
- </lrm>
- </node_state>
- </status>
-</cib>
-----
-======
-
-Before we make any changes, it's a good idea to check the validity of
-the configuration.
-
-----
-[root@pcmk-1 ~]# crm_verify -L -V
- error: unpack_resources: Resource start-up disabled since no STONITH resources have been defined
- error: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option
- error: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity
-Errors found during check: config not valid
-----
-
-As you can see, the tool has found some errors. The cluster will not start any
-resources until we configure STONITH.
diff --git a/doc/Clusters_from_Scratch/en-US/Clusters_from_Scratch.ent b/doc/Clusters_from_Scratch/en-US/Clusters_from_Scratch.ent
deleted file mode 100644
index ce8d7d1838..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Clusters_from_Scratch.ent
+++ /dev/null
@@ -1,6 +0,0 @@
-<!ENTITY PRODUCT "Pacemaker">
-<!ENTITY BOOKID "Clusters_from_Scratch">
-<!ENTITY YEAR "2009-2018">
-<!ENTITY HOLDER "The Pacemaker project contributors">
-<!ENTITY DISTRO "CentOS">
-<!ENTITY DISTRO_VERSION "7.5">
diff --git a/doc/Clusters_from_Scratch/en-US/Clusters_from_Scratch.xml b/doc/Clusters_from_Scratch/en-US/Clusters_from_Scratch.xml
deleted file mode 100644
index d69f167134..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Clusters_from_Scratch.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-<!ENTITY % BOOK_ENTITIES SYSTEM "Clusters_from_Scratch.ent">
-%BOOK_ENTITIES;
-]>
-<book>
- <xi:include href="Book_Info.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Preface.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Intro.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Installation.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Cluster-Setup.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Verification.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Fencing.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Active-Passive.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Apache.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Shared-Storage.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Active-Active.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ap-Configuration.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ap-Corosync-Conf.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ap-Reading.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Revision_History.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <index />
-</book>
-
diff --git a/doc/Clusters_from_Scratch/en-US/Preface.xml b/doc/Clusters_from_Scratch/en-US/Preface.xml
deleted file mode 100644
index 678b160af3..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Preface.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-<!ENTITY % BOOK_ENTITIES SYSTEM "Clusters_from_Scratch.ent">
-%BOOK_ENTITIES;
-]>
-<preface><title>Preface</title>
- <xi:include href="Common_Content/Conventions.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude">
- <xi:fallback xmlns:xi="http://www.w3.org/2001/XInclude">
- <xi:include href="Common_Content/Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- </xi:fallback>
- </xi:include>
-</preface>
diff --git a/doc/Clusters_from_Scratch/en-US/Revision_History.xml b/doc/Clusters_from_Scratch/en-US/Revision_History.xml
deleted file mode 100644
index 8a61d586e7..0000000000
--- a/doc/Clusters_from_Scratch/en-US/Revision_History.xml
+++ /dev/null
@@ -1,219 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-<!ENTITY % BOOK_ENTITIES SYSTEM "Clusters_from_Scratch.ent">
-%BOOK_ENTITIES;
-]>
-<appendix id="appe-Clusters_from_Scratch-Revision_History">
- <!-- see comment in Book_Info.xml for revision numbering -->
- <title>Revision History</title>
- <simpara>
- <revhistory>
- <revision>
- <revnumber>1-0</revnumber>
- <date>Mon May 17 2010</date>
- <author>
- <firstname>Andrew</firstname><surname>Beekhof</surname>
- <email>andrew@beekhof.net</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Import from Pages.app</member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>2-0</revnumber>
- <date>Wed Sep 22 2010</date>
- <author>
- <firstname>Raoul</firstname><surname>Scarazzini</surname>
- <email>rasca@miamammausalinux.org</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Italian translation</member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>3-0</revnumber>
- <date>Wed Feb 9 2011</date>
- <author>
- <firstname>Andrew</firstname>
- <surname>Beekhof</surname>
- <email>andrew@beekhof.net</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Updated for Fedora 13</member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>4-0</revnumber>
- <date>Wed Oct 5 2011</date>
- <author>
- <firstname>Andrew</firstname>
- <surname>Beekhof</surname>
- <email>andrew@beekhof.net</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Update the GFS2 section to use CMAN</member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>5-0</revnumber>
- <date>Fri Feb 10 2012</date>
- <author>
- <firstname>Andrew</firstname>
- <surname>Beekhof</surname>
- <email>andrew@beekhof.net</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Generate docbook content from asciidoc sources</member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>6-0</revnumber>
- <date>Tues July 3 2012</date>
- <author>
- <firstname>Andrew</firstname><surname>Beekhof</surname>
- <email>andrew@beekhof.net</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Updated for Fedora 17</member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>7-0</revnumber>
- <date>Fri Sept 14 2012</date>
- <author>
- <firstname>David</firstname><surname>Vossel</surname>
- <email>davidvossel@gmail.com</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Updated for pcs</member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>8-0</revnumber>
- <date>Mon Jan 05 2015</date>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Updated for Fedora 21</member>
- </simplelist></revdescription>
- </revision>
- <revision>
- <revnumber>8-1</revnumber>
- <date>Thu Jan 08 2015</date>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Minor corrections, plus use include file for intro</member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>9-0</revnumber>
- <date>Fri Aug 14 2015</date>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Update for CentOS 7.1 and leaving firewalld/SELinux enabled</member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>10-0</revnumber>
- <date>Fri Jan 12 2018</date>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Update banner for Pacemaker 2.0 and content for CentOS 7.4 with Pacemaker 1.1.16</member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>10-1</revnumber>
- <date>Wed Sep 5 2018</date>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Update for CentOS 7.5 with Pacemaker 1.1.18</member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>10-2</revnumber>
- <date>Fri Dec 7 2018</date>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <author>
- <firstname>Jan</firstname><surname>Pokorný</surname>
- <email>jpokorny@redhat.com</email>
- </author>
- <author>
- <firstname>Chris</firstname><surname>Lumens</surname>
- <email>clumens@redhat.com</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Minor clarifications and formatting changes</member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>11-0</revnumber>
- <date>Thu Jul 18 2019</date>
- <author>
- <firstname>Tomas</firstname><surname>Jelinek</surname>
- <email>tojeline@redhat.com</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Note differences in pcs 0.10</member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>11-1</revnumber>
- <date>Thu Nov 21 2019</date>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Remove references to obsolete cloned IP usage, and
- reorganize chapters a bit</member>
- </simplelist>
- </revdescription>
- </revision>
- </revhistory>
- </simpara>
-</appendix>
diff --git a/doc/Clusters_from_Scratch/en-US/images b/doc/Clusters_from_Scratch/en-US/images
deleted file mode 120000
index 963300dd95..0000000000
--- a/doc/Clusters_from_Scratch/en-US/images
+++ /dev/null
@@ -1 +0,0 @@
-../../shared/en-US/images
\ No newline at end of file
diff --git a/doc/Clusters_from_Scratch/publican.cfg.in b/doc/Clusters_from_Scratch/publican.cfg.in
deleted file mode 100644
index 816267d7e0..0000000000
--- a/doc/Clusters_from_Scratch/publican.cfg.in
+++ /dev/null
@@ -1,14 +0,0 @@
-# Config::Simple 4.59
-# Fri Apr 23 15:33:52 2010
-
-docname: Clusters_from_Scratch
-xml_lang: en-US
-#edition: 1
-type: Book
-version: @PACKAGE_SERIES@
-brand: @PUBLICAN_BRAND@
-product: Pacemaker
-
-chunk_first: 0
-chunk_section_depth: 3
-generate_section_toc_level: 4
diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in
index bc449dfb76..7f9720e616 100644
--- a/doc/Doxyfile.in
+++ b/doc/Doxyfile.in
@@ -1,2280 +1,2280 @@
# Doxyfile 1.8.5
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project.
#
# All text after a double hash (##) is considered a comment and is placed in
# front of the TAG it is preceding.
#
# All text after a single hash (#) is considered a comment and will be ignored.
# The format is:
# TAG = value [value, ...]
# For lists, items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (\" \").
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
# This tag specifies the encoding used for all characters in the config file
# that follow. The default is UTF-8 which is also the encoding used for all text
# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
# for the list of possible encodings.
# The default value is: UTF-8.
DOXYFILE_ENCODING = UTF-8
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
# double-quotes, unless you are using Doxywizard) that should identify the
# project for which the documentation is generated. This name is used in the
# title of most generated pages and in a few other places.
# The default value is: My Project.
PROJECT_NAME = @PACKAGE_NAME@
# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
# could be handy for archiving the generated documentation or if some version
# control system is used.
PROJECT_NUMBER = @PACKAGE_VERSION@-@BUILD_VERSION@
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
# quick idea about the purpose of the project. Keep the description short.
PROJECT_BRIEF = "Scalable High-Availability cluster resource manager"
# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
# the documentation. The maximum height of the logo should not exceed 55 pixels
# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
# to the output directory.
-PROJECT_LOGO = publican-clusterlabs/en-US/images/title_logo.png
+#PROJECT_LOGO =
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
# into which the generated documentation will be written. If a relative path is
# entered, it will be relative to the location where doxygen was started. If
# left blank the current directory will be used.
OUTPUT_DIRECTORY = api/
# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
# directories (in 2 levels) under the output directory of each output format and
# will distribute the generated files over these directories. Enabling this
# option can be useful when feeding doxygen a huge amount of source files, where
# putting all generated files in the same directory would otherwise causes
# performance problems for the file system.
# The default value is: NO.
CREATE_SUBDIRS = NO
# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
# Possible values are: Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-
# Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, Farsi,
# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en,
# Korean, Korean-en, Latvian, Norwegian, Macedonian, Persian, Polish,
# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish,
# Turkish, Ukrainian and Vietnamese.
# The default value is: English.
OUTPUT_LANGUAGE = English
# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
# descriptions after the members that are listed in the file and class
# documentation (similar to Javadoc). Set to NO to disable this.
# The default value is: YES.
BRIEF_MEMBER_DESC = YES
# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
# description of a member or function before the detailed description
#
# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
# brief descriptions will be completely suppressed.
# The default value is: YES.
REPEAT_BRIEF = YES
# This tag implements a quasi-intelligent brief description abbreviator that is
# used to form the text in various listings. Each string in this list, if found
# as the leading text of the brief description, will be stripped from the text
# and the result, after processing the whole list, is used as the annotated
# text. Otherwise, the brief description is used as-is. If left blank, the
# following values are used ($name is automatically replaced with the name of
# the entity):The $name class, The $name widget, The $name file, is, provides,
# specifies, contains, represents, a, an and the.
ABBREVIATE_BRIEF =
# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
# doxygen will generate a detailed section even if there is only a brief
# description.
# The default value is: NO.
ALWAYS_DETAILED_SEC = NO
# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
# inherited members of a class in the documentation of that class as if those
# members were ordinary class members. Constructors, destructors and assignment
# operators of the base classes will not be shown.
# The default value is: NO.
INLINE_INHERITED_MEMB = NO
# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
# before files name in the file list and in the header files. If set to NO the
# shortest path that makes the file name unique will be used
# The default value is: YES.
FULL_PATH_NAMES = YES
# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
# Stripping is only done if one of the specified strings matches the left-hand
# part of the path. The tag can be used to show relative paths in the file list.
# If left blank the directory from which doxygen is run is used as the path to
# strip.
#
# Note that you can specify absolute paths here, but also relative paths, which
# will be relative from the directory where doxygen is started.
# This tag requires that the tag FULL_PATH_NAMES is set to YES.
STRIP_FROM_PATH = ..
# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
# path mentioned in the documentation of a class, which tells the reader which
# header file to include in order to use a class. If left blank only the name of
# the header file containing the class definition is used. Otherwise one should
# specify the list of include paths that are normally passed to the compiler
# using the -I flag.
STRIP_FROM_INC_PATH = ..
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
# less readable) file names. This can be useful is your file systems doesn't
# support long names like on DOS, Mac, or CD-ROM.
# The default value is: NO.
SHORT_NAMES = NO
# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
# first line (until the first dot) of a Javadoc-style comment as the brief
# description. If set to NO, the Javadoc-style will behave just like regular Qt-
# style comments (thus requiring an explicit @brief command for a brief
# description.)
# The default value is: NO.
JAVADOC_AUTOBRIEF = NO
# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
# line (until the first dot) of a Qt-style comment as the brief description. If
# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
# requiring an explicit \brief command for a brief description.)
# The default value is: NO.
QT_AUTOBRIEF = NO
# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
# a brief description. This used to be the default behavior. The new default is
# to treat a multi-line C++ comment block as a detailed description. Set this
# tag to YES if you prefer the old behavior instead.
#
# Note that setting this tag to YES also means that rational rose comments are
# not recognized any more.
# The default value is: NO.
MULTILINE_CPP_IS_BRIEF = NO
# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
# documentation from any documented member that it re-implements.
# The default value is: YES.
INHERIT_DOCS = YES
# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
# new page for each member. If set to NO, the documentation of a member will be
# part of the file/class/namespace that contains it.
# The default value is: NO.
SEPARATE_MEMBER_PAGES = NO
# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
# uses this value to replace tabs by spaces in code fragments.
# Minimum value: 1, maximum value: 16, default value: 4.
TAB_SIZE = 4
# This tag can be used to specify a number of aliases that act as commands in
# the documentation. An alias has the form:
# name=value
# For example adding
# "sideeffect=@par Side Effects:\n"
# will allow you to put the command \sideeffect (or @sideeffect) in the
# documentation, which will result in a user-defined paragraph with heading
# "Side Effects:". You can put \n's in the value part of an alias to insert
# newlines.
ALIASES =
# This tag can be used to specify a number of word-keyword mappings (TCL only).
# A mapping has the form "name=value". For example adding "class=itcl::class"
# will allow you to use the command class in the itcl::class meaning.
TCL_SUBST =
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C. For
# instance, some of the names that are used will be different. The list of all
# members will be omitted, etc.
# The default value is: NO.
OPTIMIZE_OUTPUT_FOR_C = YES
# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
# Python sources only. Doxygen will then generate output that is more tailored
# for that language. For instance, namespaces will be presented as packages,
# qualified scopes will look different, etc.
# The default value is: NO.
OPTIMIZE_OUTPUT_JAVA = NO
# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
# sources. Doxygen will then generate output that is tailored for Fortran.
# The default value is: NO.
OPTIMIZE_FOR_FORTRAN = NO
# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
# sources. Doxygen will then generate output that is tailored for VHDL.
# The default value is: NO.
OPTIMIZE_OUTPUT_VHDL = NO
# Doxygen selects the parser to use depending on the extension of the files it
# parses. With this tag you can assign which parser to use for a given
# extension. Doxygen has a built-in mapping, but you can override or extend it
# using this tag. The format is ext=language, where ext is a file extension, and
# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
# (default is Fortran), use: inc=Fortran f=C.
#
# Note For files without extension you can use no_extension as a placeholder.
#
# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
# the files are not read by doxygen.
EXTENSION_MAPPING =
# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
# according to the Markdown format, which allows for more readable
# documentation. See http://daringfireball.net/projects/markdown/ for details.
# The output of markdown processing is further processed by doxygen, so you can
# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
# case of backward compatibilities issues.
# The default value is: YES.
MARKDOWN_SUPPORT = YES
# When enabled doxygen tries to link words that correspond to documented
# classes, or namespaces to their corresponding documentation. Such a link can
# be prevented in individual cases by by putting a % sign in front of the word
# or globally by setting AUTOLINK_SUPPORT to NO.
# The default value is: YES.
AUTOLINK_SUPPORT = YES
# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
# to include (a tag file for) the STL sources as input, then you should set this
# tag to YES in order to let doxygen match functions declarations and
# definitions whose arguments contain STL classes (e.g. func(std::string);
# versus func(std::string) {}). This also make the inheritance and collaboration
# diagrams that involve STL classes more complete and accurate.
# The default value is: NO.
BUILTIN_STL_SUPPORT = NO
# If you use Microsoft's C++/CLI language, you should set this option to YES to
# enable parsing support.
# The default value is: NO.
CPP_CLI_SUPPORT = NO
# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
# will parse them like normal C++ but will assume all classes use public instead
# of private inheritance when no explicit protection keyword is present.
# The default value is: NO.
SIP_SUPPORT = NO
# For Microsoft's IDL there are propget and propput attributes to indicate
# getter and setter methods for a property. Setting this option to YES will make
# doxygen to replace the get and set methods by a property in the documentation.
# This will only work if the methods are indeed getting or setting a simple
# type. If this is not the case, or you want to show the methods anyway, you
# should set this option to NO.
# The default value is: YES.
IDL_PROPERTY_SUPPORT = YES
# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
# tag is set to YES, then doxygen will reuse the documentation of the first
# member in the group (if any) for the other members of the group. By default
# all members of a group must be documented explicitly.
# The default value is: NO.
DISTRIBUTE_GROUP_DOC = YES
# Set the SUBGROUPING tag to YES to allow class member groups of the same type
# (for instance a group of public functions) to be put as a subgroup of that
# type (e.g. under the Public Functions section). Set it to NO to prevent
# subgrouping. Alternatively, this can be done per class using the
# \nosubgrouping command.
# The default value is: YES.
SUBGROUPING = YES
# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
# are shown inside the group in which they are included (e.g. using \ingroup)
# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
# and RTF).
#
# Note that this feature does not work in combination with
# SEPARATE_MEMBER_PAGES.
# The default value is: NO.
INLINE_GROUPED_CLASSES = NO
# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
# with only public data fields or simple typedef fields will be shown inline in
# the documentation of the scope in which they are defined (i.e. file,
# namespace, or group documentation), provided this scope is documented. If set
# to NO, structs, classes, and unions are shown on a separate page (for HTML and
# Man pages) or section (for LaTeX and RTF).
# The default value is: NO.
INLINE_SIMPLE_STRUCTS = NO
# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
# enum is documented as struct, union, or enum with the name of the typedef. So
# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
# with name TypeT. When disabled the typedef will appear as a member of a file,
# namespace, or class. And the struct will be named TypeS. This can typically be
# useful for C code in case the coding convention dictates that all compound
# types are typedef'ed and only the typedef is referenced, never the tag name.
# The default value is: NO.
TYPEDEF_HIDES_STRUCT = NO
# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
# cache is used to resolve symbols given their name and scope. Since this can be
# an expensive process and often the same symbol appears multiple times in the
# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
# doxygen will become slower. If the cache is too large, memory is wasted. The
# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
# symbols. At the end of a run doxygen will report the cache usage and suggest
# the optimal cache size from a speed point of view.
# Minimum value: 0, maximum value: 9, default value: 0.
LOOKUP_CACHE_SIZE = 0
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
# documentation are documented, even if no documentation was available. Private
# class members and static file members will be hidden unless the
# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
# Note: This will also disable the warnings about undocumented members that are
# normally produced when WARNINGS is set to YES.
# The default value is: NO.
EXTRACT_ALL = YES
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
# be included in the documentation.
# The default value is: NO.
EXTRACT_PRIVATE = NO
# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
# scope will be included in the documentation.
# The default value is: NO.
EXTRACT_PACKAGE = NO
# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
# included in the documentation.
# The default value is: NO.
EXTRACT_STATIC = NO
# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
# locally in source files will be included in the documentation. If set to NO
# only classes defined in header files are included. Does not have any effect
# for Java sources.
# The default value is: YES.
EXTRACT_LOCAL_CLASSES = NO
# This flag is only useful for Objective-C code. When set to YES local methods,
# which are defined in the implementation section but not in the interface are
# included in the documentation. If set to NO only methods in the interface are
# included.
# The default value is: NO.
EXTRACT_LOCAL_METHODS = NO
# If this flag is set to YES, the members of anonymous namespaces will be
# extracted and appear in the documentation as a namespace called
# 'anonymous_namespace{file}', where file will be replaced with the base name of
# the file that contains the anonymous namespace. By default anonymous namespace
# are hidden.
# The default value is: NO.
EXTRACT_ANON_NSPACES = NO
# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
# undocumented members inside documented classes or files. If set to NO these
# members will be included in the various overviews, but no documentation
# section is generated. This option has no effect if EXTRACT_ALL is enabled.
# The default value is: NO.
HIDE_UNDOC_MEMBERS = NO
# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy. If set
# to NO these classes will be included in the various overviews. This option has
# no effect if EXTRACT_ALL is enabled.
# The default value is: NO.
HIDE_UNDOC_CLASSES = NO
# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
# (class|struct|union) declarations. If set to NO these declarations will be
# included in the documentation.
# The default value is: NO.
HIDE_FRIEND_COMPOUNDS = NO
# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
# documentation blocks found inside the body of a function. If set to NO these
# blocks will be appended to the function's detailed documentation block.
# The default value is: NO.
HIDE_IN_BODY_DOCS = NO
# The INTERNAL_DOCS tag determines if documentation that is typed after a
# \internal command is included. If the tag is set to NO then the documentation
# will be excluded. Set it to YES to include the internal documentation.
# The default value is: NO.
INTERNAL_DOCS = NO
# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
# names in lower-case letters. If set to YES upper-case letters are also
# allowed. This is useful if you have classes or files whose names only differ
# in case and if your file system supports case sensitive file names. Windows
# and Mac users are advised to set this option to NO.
# The default value is: system dependent.
CASE_SENSE_NAMES = YES
# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
# their full class and namespace scopes in the documentation. If set to YES the
# scope will be hidden.
# The default value is: NO.
HIDE_SCOPE_NAMES = NO
# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
# the files that are included by a file in the documentation of that file.
# The default value is: YES.
SHOW_INCLUDE_FILES = YES
# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
# files with double quotes in the documentation rather than with sharp brackets.
# The default value is: NO.
FORCE_LOCAL_INCLUDES = NO
# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
# documentation for inline members.
# The default value is: YES.
INLINE_INFO = YES
# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
# (detailed) documentation of file and class members alphabetically by member
# name. If set to NO the members will appear in declaration order.
# The default value is: YES.
SORT_MEMBER_DOCS = YES
# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
# descriptions of file, namespace and class members alphabetically by member
# name. If set to NO the members will appear in declaration order.
# The default value is: NO.
SORT_BRIEF_DOCS = NO
# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
# (brief and detailed) documentation of class members so that constructors and
# destructors are listed first. If set to NO the constructors will appear in the
# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
# member documentation.
# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
# detailed member documentation.
# The default value is: NO.
SORT_MEMBERS_CTORS_1ST = YES
# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
# of group names into alphabetical order. If set to NO the group names will
# appear in their defined order.
# The default value is: NO.
SORT_GROUP_NAMES = NO
# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
# fully-qualified names, including namespaces. If set to NO, the class list will
# be sorted only by class name, not including the namespace part.
# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
# Note: This option applies only to the class list, not to the alphabetical
# list.
# The default value is: NO.
SORT_BY_SCOPE_NAME = NO
# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
# type resolution of all parameters of a function it will reject a match between
# the prototype and the implementation of a member function even if there is
# only one candidate or it is obvious which candidate to choose by doing a
# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
# accept a match between prototype and implementation in such cases.
# The default value is: NO.
STRICT_PROTO_MATCHING = NO
# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
# todo list. This list is created by putting \todo commands in the
# documentation.
# The default value is: YES.
GENERATE_TODOLIST = YES
# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
# test list. This list is created by putting \test commands in the
# documentation.
# The default value is: YES.
GENERATE_TESTLIST = YES
# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
# list. This list is created by putting \bug commands in the documentation.
# The default value is: YES.
GENERATE_BUGLIST = YES
# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
# the deprecated list. This list is created by putting \deprecated commands in
# the documentation.
# The default value is: YES.
GENERATE_DEPRECATEDLIST= YES
# The ENABLED_SECTIONS tag can be used to enable conditional documentation
# sections, marked by \if <section_label> ... \endif and \cond <section_label>
# ... \endcond blocks.
ENABLED_SECTIONS =
# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
# initial value of a variable or macro / define can have for it to appear in the
# documentation. If the initializer consists of more lines than specified here
# it will be hidden. Use a value of 0 to hide initializers completely. The
# appearance of the value of individual variables and macros / defines can be
# controlled using \showinitializer or \hideinitializer command in the
# documentation regardless of this setting.
# Minimum value: 0, maximum value: 10000, default value: 30.
MAX_INITIALIZER_LINES = 30
# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
# the bottom of the documentation of classes and structs. If set to YES the list
# will mention the files that were used to generate the documentation.
# The default value is: YES.
SHOW_USED_FILES = YES
# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
# will remove the Files entry from the Quick Index and from the Folder Tree View
# (if specified).
# The default value is: YES.
SHOW_FILES = YES
# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
# page. This will remove the Namespaces entry from the Quick Index and from the
# Folder Tree View (if specified).
# The default value is: YES.
SHOW_NAMESPACES = YES
# The FILE_VERSION_FILTER tag can be used to specify a program or script that
# doxygen should invoke to get the current version for each file (typically from
# the version control system). Doxygen will invoke the program by executing (via
# popen()) the command command input-file, where command is the value of the
# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
# by doxygen. Whatever the program writes to standard output is used as the file
# version. For an example see the documentation.
FILE_VERSION_FILTER =
# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
# by doxygen. The layout file controls the global structure of the generated
# output files in an output format independent way. To create the layout file
# that represents doxygen's defaults, run doxygen with the -l option. You can
# optionally specify a file name after the option, if omitted DoxygenLayout.xml
# will be used as the name of the layout file.
#
# Note that if you run doxygen from a directory containing a file called
# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
# tag is left empty.
LAYOUT_FILE =
# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
# the reference definitions. This must be a list of .bib files. The .bib
# extension is automatically appended if omitted. This requires the bibtex tool
# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
# For LaTeX the style of the bibliography can be controlled using
# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
# search path. Do not use file names with spaces, bibtex cannot handle them. See
# also \cite for info how to create references.
CITE_BIB_FILES =
#---------------------------------------------------------------------------
# Configuration options related to warning and progress messages
#---------------------------------------------------------------------------
# The QUIET tag can be used to turn on/off the messages that are generated to
# standard output by doxygen. If QUIET is set to YES this implies that the
# messages are off.
# The default value is: NO.
QUIET = NO
# The WARNINGS tag can be used to turn on/off the warning messages that are
# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
# this implies that the warnings are on.
#
# Tip: Turn warnings on while writing the documentation.
# The default value is: YES.
WARNINGS = YES
# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
# will automatically be disabled.
# The default value is: YES.
WARN_IF_UNDOCUMENTED = YES
# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
# potential errors in the documentation, such as not documenting some parameters
# in a documented function, or documenting parameters that don't exist or using
# markup commands wrongly.
# The default value is: YES.
WARN_IF_DOC_ERROR = YES
# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
# are documented, but have no documentation for their parameters or return
# value. If set to NO doxygen will only warn about wrong or incomplete parameter
# documentation, but not about the absence of documentation.
# The default value is: NO.
WARN_NO_PARAMDOC = NO
# The WARN_FORMAT tag determines the format of the warning messages that doxygen
# can produce. The string should contain the $file, $line, and $text tags, which
# will be replaced by the file and line number from which the warning originated
# and the warning text. Optionally the format may contain $version, which will
# be replaced by the version of the file (if it could be obtained via
# FILE_VERSION_FILTER)
# The default value is: $file:$line: $text.
WARN_FORMAT = "$file:$line: $text"
# The WARN_LOGFILE tag can be used to specify a file to which warning and error
# messages should be written. If left blank the output is written to standard
# error (stderr).
WARN_LOGFILE =
#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------
# The INPUT tag is used to specify the files and/or directories that contain
# documented source files. You may enter file names like myfile.cpp or
# directories like /usr/src/myproject. Separate the files or directories with
# spaces.
# Note: If this tag is empty the current directory is searched.
INPUT = ../include ../lib
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
# documentation (see: http://www.gnu.org/software/libiconv) for the list of
# possible encodings.
# The default value is: UTF-8.
INPUT_ENCODING = UTF-8
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
# *.h) to filter out the source-files in the directories. If left blank the
# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
# *.qsf, *.as and *.js.
FILE_PATTERNS =
# The RECURSIVE tag can be used to specify whether or not subdirectories should
# be searched for input files as well.
# The default value is: NO.
RECURSIVE = YES
# The EXCLUDE tag can be used to specify files and/or directories that should be
# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.
#
# Note that relative paths are relative to the directory from which doxygen is
# run.
EXCLUDE =
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded
# from the input.
# The default value is: NO.
EXCLUDE_SYMLINKS = NO
# If the value of the INPUT tag contains directories, you can use the
# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
# certain files from those directories.
#
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories for example use the pattern */test/*
EXCLUDE_PATTERNS =
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
# (namespaces, classes, functions, etc.) that should be excluded from the
# output. The symbol name can be a fully qualified name, a word, or if the
# wildcard * is used, a substring. Examples: ANamespace, AClass,
# AClass::ANamespace, ANamespace::*Test
#
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories use the pattern */test/*
EXCLUDE_SYMBOLS =
# The EXAMPLE_PATH tag can be used to specify one or more files or directories
# that contain example code fragments that are included (see the \include
# command).
EXAMPLE_PATH = .
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
# *.h) to filter out the source-files in the directories. If left blank all
# files are included.
EXAMPLE_PATTERNS =
# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
# searched for input files to be used with the \include or \dontinclude commands
# irrespective of the value of the RECURSIVE tag.
# The default value is: NO.
EXAMPLE_RECURSIVE = YES
# The IMAGE_PATH tag can be used to specify one or more files or directories
# that contain images that are to be included in the documentation (see the
# \image command).
IMAGE_PATH =
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
# by executing (via popen()) the command:
#
# <filter> <input-file>
#
# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
# name of an input file. Doxygen will then use the output that the filter
# program writes to standard output. If FILTER_PATTERNS is specified, this tag
# will be ignored.
#
# Note that the filter must not add or remove lines; it is applied before the
# code is scanned, but not when the output code is generated. If lines are added
# or removed, the anchors will not be placed correctly.
INPUT_FILTER =
# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
# basis. Doxygen will compare the file name with each pattern and apply the
# filter if there is a match. The filters are a list of the form: pattern=filter
# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
# patterns match the file name, INPUT_FILTER is applied.
FILTER_PATTERNS =
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
# INPUT_FILTER ) will also be used to filter the input files that are used for
# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
# The default value is: NO.
FILTER_SOURCE_FILES = NO
# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
# it is also possible to disable source filtering for a specific pattern using
# *.ext= (so without naming a filter).
# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
FILTER_SOURCE_PATTERNS =
# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
# is part of the input, its contents will be placed on the main page
# (index.html). This can be useful if you have a project on for instance GitHub
# and want to reuse the introduction page also for the doxygen output.
USE_MDFILE_AS_MAINPAGE =
#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------
# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
# generated. Documented entities will be cross-referenced with these sources.
#
# Note: To get rid of all source code in the generated output, make sure that
# also VERBATIM_HEADERS is set to NO.
# The default value is: NO.
SOURCE_BROWSER = YES
# Setting the INLINE_SOURCES tag to YES will include the body of functions,
# classes and enums directly into the documentation.
# The default value is: NO.
INLINE_SOURCES = NO
# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
# special comment blocks from generated source code fragments. Normal C, C++ and
# Fortran comments will always remain visible.
# The default value is: YES.
STRIP_CODE_COMMENTS = YES
# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
# function all documented functions referencing it will be listed.
# The default value is: NO.
REFERENCED_BY_RELATION = NO
# If the REFERENCES_RELATION tag is set to YES then for each documented function
# all documented entities called/used by that function will be listed.
# The default value is: NO.
REFERENCES_RELATION = NO
# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
# link to the documentation.
# The default value is: YES.
REFERENCES_LINK_SOURCE = YES
# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
# source code will show a tooltip with additional information such as prototype,
# brief description and links to the definition and documentation. Since this
# will make the HTML file larger and loading of large files a bit slower, you
# can opt to disable this feature.
# The default value is: YES.
# This tag requires that the tag SOURCE_BROWSER is set to YES.
SOURCE_TOOLTIPS = YES
# If the USE_HTAGS tag is set to YES then the references to source code will
# point to the HTML generated by the htags(1) tool instead of doxygen built-in
# source browser. The htags tool is part of GNU's global source tagging system
# (see http://www.gnu.org/software/global/global.html). You will need version
# 4.8.6 or higher.
#
# To use it do the following:
# - Install the latest version of global
# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
# - Make sure the INPUT points to the root of the source tree
# - Run doxygen as normal
#
# Doxygen will invoke htags (and that will in turn invoke gtags), so these
# tools must be available from the command line (i.e. in the search path).
#
# The result: instead of the source browser generated by doxygen, the links to
# source code will now point to the output of htags.
# The default value is: NO.
# This tag requires that the tag SOURCE_BROWSER is set to YES.
USE_HTAGS = NO
# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
# verbatim copy of the header file for each class for which an include is
# specified. Set to NO to disable this.
# See also: Section \class.
# The default value is: YES.
VERBATIM_HEADERS = YES
#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
# compounds will be generated. Enable this if the project contains a lot of
# classes, structs, unions or interfaces.
# The default value is: YES.
ALPHABETICAL_INDEX = YES
# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
# which the alphabetical index list will be split.
# Minimum value: 1, maximum value: 20, default value: 5.
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
COLS_IN_ALPHA_INDEX = 5
# In case all classes in a project start with a common prefix, all classes will
# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
# can be used to specify a prefix (or a list of prefixes) that should be ignored
# while generating the index headers.
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the HTML output
#---------------------------------------------------------------------------
# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
# The default value is: YES.
GENERATE_HTML = YES
# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it.
# The default directory is: html.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_OUTPUT = html
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
# generated HTML page (for example: .htm, .php, .asp).
# The default value is: .html.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_FILE_EXTENSION = .html
# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
# each generated HTML page. If the tag is left blank doxygen will generate a
# standard header.
#
# To get valid HTML the header file that includes any scripts and style sheets
# that doxygen needs, which is dependent on the configuration options used (e.g.
# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
# default header using
# doxygen -w html new_header.html new_footer.html new_stylesheet.css
# YourConfigFile
# and then modify the file new_header.html. See also section "Doxygen usage"
# for information on how to generate the default header that doxygen normally
# uses.
# Note: The header is subject to change so you typically have to regenerate the
# default header when upgrading to a newer version of doxygen. For a description
# of the possible markers and block names see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_HEADER =
# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
# generated HTML page. If the tag is left blank doxygen will generate a standard
# footer. See HTML_HEADER for more information on how to generate a default
# footer and what special commands can be used inside the footer. See also
# section "Doxygen usage" for information on how to generate the default footer
# that doxygen normally uses.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_FOOTER =
# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
# sheet that is used by each HTML page. It can be used to fine-tune the look of
# the HTML output. If left blank doxygen will generate a default style sheet.
# See also section "Doxygen usage" for information on how to generate the style
# sheet that doxygen normally uses.
# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
# it is more robust and this tag (HTML_STYLESHEET) will in the future become
# obsolete.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_STYLESHEET =
# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
# defined cascading style sheet that is included after the standard style sheets
# created by doxygen. Using this option one can overrule certain style aspects.
# This is preferred over using HTML_STYLESHEET since it does not replace the
# standard style sheet and is therefor more robust against future updates.
# Doxygen will copy the style sheet file to the output directory. For an example
# see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_EXTRA_STYLESHEET =
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the HTML output directory. Note
# that these files will be copied to the base HTML output directory. Use the
# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
# files will be copied as-is; there are no commands or markers available.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_EXTRA_FILES =
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the stylesheet and background images according to
# this color. Hue is specified as an angle on a colorwheel, see
# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
# purple, and 360 is red again.
# Minimum value: 0, maximum value: 359, default value: 220.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_COLORSTYLE_HUE = 220
# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
# in the HTML output. For a value of 0 the output will use grayscales only. A
# value of 255 will produce the most vivid colors.
# Minimum value: 0, maximum value: 255, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_COLORSTYLE_SAT = 100
# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
# luminance component of the colors in the HTML output. Values below 100
# gradually make the output lighter, whereas values above 100 make the output
# darker. The value divided by 100 is the actual gamma applied, so 80 represents
# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
# change the gamma.
# Minimum value: 40, maximum value: 240, default value: 80.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_COLORSTYLE_GAMMA = 80
# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
# page will contain the date and time when the page was generated. Setting this
# to NO can help when comparing the output of multiple runs.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_TIMESTAMP = YES
# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
# documentation will contain sections that can be hidden and shown after the
# page has loaded.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_DYNAMIC_SECTIONS = NO
# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
# shown in the various tree structured indices initially; the user can expand
# and collapse entries dynamically later on. Doxygen will expand the tree to
# such a level that at most the specified number of entries are visible (unless
# a fully collapsed tree already exceeds this amount). So setting the number of
# entries 1 will produce a full collapsed tree by default. 0 is a special value
# representing an infinite number of entries and will result in a full expanded
# tree by default.
# Minimum value: 0, maximum value: 9999, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_INDEX_NUM_ENTRIES = 100
# If the GENERATE_DOCSET tag is set to YES, additional index files will be
# generated that can be used as input for Apple's Xcode 3 integrated development
# environment (see: http://developer.apple.com/tools/xcode/), introduced with
# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
# Makefile in the HTML output directory. Running make will produce the docset in
# that directory and running make install will install the docset in
# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
# for more information.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
GENERATE_DOCSET = NO
# This tag determines the name of the docset feed. A documentation feed provides
# an umbrella under which multiple documentation sets from a single provider
# (such as a company or product suite) can be grouped.
# The default value is: Doxygen generated docs.
# This tag requires that the tag GENERATE_DOCSET is set to YES.
DOCSET_FEEDNAME = "Doxygen generated docs"
# This tag specifies a string that should uniquely identify the documentation
# set bundle. This should be a reverse domain-name style string, e.g.
# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_DOCSET is set to YES.
DOCSET_BUNDLE_ID = org.doxygen.Pacemaker
# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
# the documentation publisher. This should be a reverse domain-name style
# string, e.g. com.mycompany.MyDocSet.documentation.
# The default value is: org.doxygen.Publisher.
# This tag requires that the tag GENERATE_DOCSET is set to YES.
DOCSET_PUBLISHER_ID = org.doxygen.ClusterLabs
# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
# The default value is: Publisher.
# This tag requires that the tag GENERATE_DOCSET is set to YES.
DOCSET_PUBLISHER_NAME = ClusterLabs
# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
# Windows.
#
# The HTML Help Workshop contains a compiler that can convert all HTML output
# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
# files are now used as the Windows 98 help format, and will replace the old
# Windows help format (.hlp) on all Windows platforms in the future. Compressed
# HTML files also contain an index, a table of contents, and you can search for
# words in the documentation. The HTML workshop also contains a viewer for
# compressed HTML files.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
GENERATE_HTMLHELP = NO
# The CHM_FILE tag can be used to specify the file name of the resulting .chm
# file. You can add a path in front of the file if the result should not be
# written to the html output directory.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
CHM_FILE =
# The HHC_LOCATION tag can be used to specify the location (absolute path
# including file name) of the HTML help compiler ( hhc.exe). If non-empty
# doxygen will try to run the HTML help compiler on the generated index.hhp.
# The file has to be specified with full path.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
HHC_LOCATION =
# The GENERATE_CHI flag controls if a separate .chi index file is generated (
# YES) or that it should be included in the master .chm file ( NO).
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
GENERATE_CHI = NO
# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
# and project file content.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
CHM_INDEX_ENCODING =
# The BINARY_TOC flag controls whether a binary table of contents is generated (
# YES) or a normal table of contents ( NO) in the .chm file.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
BINARY_TOC = NO
# The TOC_EXPAND flag can be set to YES to add extra items for group members to
# the table of contents of the HTML help documentation and to the tree view.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
TOC_EXPAND = NO
# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
# (.qch) of the generated HTML documentation.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
GENERATE_QHP = NO
# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
# the file name of the resulting .qch file. The path specified is relative to
# the HTML output folder.
# This tag requires that the tag GENERATE_QHP is set to YES.
QCH_FILE =
# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
# Project output. For more information please see Qt Help Project / Namespace
# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_NAMESPACE = org.doxygen.Project
# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
# Help Project output. For more information please see Qt Help Project / Virtual
# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
# folders).
# The default value is: doc.
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_VIRTUAL_FOLDER = doc
# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
# filter to add. For more information please see Qt Help Project / Custom
# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
# filters).
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_CUST_FILTER_NAME =
# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
# custom filter to add. For more information please see Qt Help Project / Custom
# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
# filters).
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_CUST_FILTER_ATTRS =
# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
# project's filter section matches. Qt Help Project / Filter Attributes (see:
# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_SECT_FILTER_ATTRS =
# The QHG_LOCATION tag can be used to specify the location of Qt's
# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
# generated .qhp file.
# This tag requires that the tag GENERATE_QHP is set to YES.
QHG_LOCATION =
# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
# generated, together with the HTML files, they form an Eclipse help plugin. To
# install this plugin and make it available under the help contents menu in
# Eclipse, the contents of the directory containing the HTML and XML files needs
# to be copied into the plugins directory of eclipse. The name of the directory
# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
# After copying Eclipse needs to be restarted before the help appears.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
GENERATE_ECLIPSEHELP = NO
# A unique identifier for the Eclipse help plugin. When installing the plugin
# the directory name containing the HTML and XML files should also have this
# name. Each documentation set should have its own identifier.
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
ECLIPSE_DOC_ID = org.doxygen.Project
# If you want full control over the layout of the generated HTML pages it might
# be necessary to disable the index and replace it with your own. The
# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
# of each HTML page. A value of NO enables the index and the value YES disables
# it. Since the tabs in the index contain the same information as the navigation
# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
DISABLE_INDEX = NO
# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
# structure should be generated to display hierarchical information. If the tag
# value is set to YES, a side panel will be generated containing a tree-like
# index structure (just like the one that is generated for HTML Help). For this
# to work a browser that supports JavaScript, DHTML, CSS and frames is required
# (i.e. any modern browser). Windows users are probably better off using the
# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
# further fine-tune the look of the index. As an example, the default style
# sheet generated by doxygen has an example that shows how to put an image at
# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
# the same information as the tab index, you could consider setting
# DISABLE_INDEX to YES when enabling this option.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
GENERATE_TREEVIEW = NO
# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
# doxygen will group on one line in the generated HTML documentation.
#
# Note that a value of 0 will completely suppress the enum values from appearing
# in the overview section.
# Minimum value: 0, maximum value: 20, default value: 4.
# This tag requires that the tag GENERATE_HTML is set to YES.
ENUM_VALUES_PER_LINE = 4
# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
# to set the initial width (in pixels) of the frame in which the tree is shown.
# Minimum value: 0, maximum value: 1500, default value: 250.
# This tag requires that the tag GENERATE_HTML is set to YES.
TREEVIEW_WIDTH = 250
# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
# external symbols imported via tag files in a separate window.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
EXT_LINKS_IN_WINDOW = NO
# Use this tag to change the font size of LaTeX formulas included as images in
# the HTML documentation. When you change the font size after a successful
# doxygen run you need to manually remove any form_*.png images from the HTML
# output directory to force them to be regenerated.
# Minimum value: 8, maximum value: 50, default value: 10.
# This tag requires that the tag GENERATE_HTML is set to YES.
FORMULA_FONTSIZE = 10
# Use the FORMULA_TRANPARENT tag to determine whether or not the images
# generated for formulas are transparent PNGs. Transparent PNGs are not
# supported properly for IE 6.0, but are supported on all modern browsers.
#
# Note that when changing this option you need to delete any form_*.png files in
# the HTML output directory before the changes have effect.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.
FORMULA_TRANSPARENT = YES
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
# http://www.mathjax.org) which uses client side Javascript for the rendering
# instead of using prerendered bitmaps. Use this if you do not have LaTeX
# installed or if you want to formulas look prettier in the HTML output. When
# enabled you may also need to install MathJax separately and configure the path
# to it using the MATHJAX_RELPATH option.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
USE_MATHJAX = NO
# When MathJax is enabled you can set the default output format to be used for
# the MathJax output. See the MathJax site (see:
# http://docs.mathjax.org/en/latest/output.html) for more details.
# Possible values are: HTML-CSS (which is slower, but has the best
# compatibility), NativeMML (i.e. MathML) and SVG.
# The default value is: HTML-CSS.
# This tag requires that the tag USE_MATHJAX is set to YES.
MATHJAX_FORMAT = HTML-CSS
# When MathJax is enabled you need to specify the location relative to the HTML
# output directory using the MATHJAX_RELPATH option. The destination directory
# should contain the MathJax.js script. For instance, if the mathjax directory
# is located at the same level as the HTML output directory, then
# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
# Content Delivery Network so you can quickly see the result without installing
# MathJax. However, it is strongly recommended to install a local copy of
# MathJax from http://www.mathjax.org before deployment.
# The default value is: http://cdn.mathjax.org/mathjax/latest.
# This tag requires that the tag USE_MATHJAX is set to YES.
MATHJAX_RELPATH = http://www.mathjax.org/mathjax
# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
# extension names that should be enabled during MathJax rendering. For example
# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
# This tag requires that the tag USE_MATHJAX is set to YES.
MATHJAX_EXTENSIONS =
# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
# of code that will be used on startup of the MathJax code. See the MathJax site
# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
# example see the documentation.
# This tag requires that the tag USE_MATHJAX is set to YES.
MATHJAX_CODEFILE =
# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
# the HTML output. The underlying search engine uses javascript and DHTML and
# should work on any modern browser. Note that when using HTML help
# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
# there is already a search function so this one should typically be disabled.
# For large projects the javascript based search engine can be slow, then
# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
# search using the keyboard; to jump to the search box use <access key> + S
# (what the <access key> is depends on the OS and browser, but it is typically
# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
# key> to jump into the search results window, the results can be navigated
# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
# the search. The filter options can be selected when the cursor is inside the
# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
# to select a filter and <Enter> or <escape> to activate or cancel the filter
# option.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.
SEARCHENGINE = YES
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
# implemented using a web server instead of a web client using Javascript. There
# are two flavours of web server based searching depending on the
# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
# searching and an index file used by the script. When EXTERNAL_SEARCH is
# enabled the indexing and searching needs to be provided by external tools. See
# the section "External Indexing and Searching" for details.
# The default value is: NO.
# This tag requires that the tag SEARCHENGINE is set to YES.
SERVER_BASED_SEARCH = NO
# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
# script for searching. Instead the search results are written to an XML file
# which needs to be processed by an external indexer. Doxygen will invoke an
# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
# search results.
#
# Doxygen ships with an example indexer ( doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
# Xapian (see: http://xapian.org/).
#
# See the section "External Indexing and Searching" for details.
# The default value is: NO.
# This tag requires that the tag SEARCHENGINE is set to YES.
EXTERNAL_SEARCH = NO
# The SEARCHENGINE_URL should point to a search engine hosted by a web server
# which will return the search results when EXTERNAL_SEARCH is enabled.
#
# Doxygen ships with an example indexer ( doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
# Xapian (see: http://xapian.org/). See the section "External Indexing and
# Searching" for details.
# This tag requires that the tag SEARCHENGINE is set to YES.
SEARCHENGINE_URL =
# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
# search data is written to a file for indexing by an external tool. With the
# SEARCHDATA_FILE tag the name of this file can be specified.
# The default file is: searchdata.xml.
# This tag requires that the tag SEARCHENGINE is set to YES.
SEARCHDATA_FILE = searchdata.xml
# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
# projects and redirect the results back to the right project.
# This tag requires that the tag SEARCHENGINE is set to YES.
EXTERNAL_SEARCH_ID =
# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
# projects other than the one defined by this configuration file, but that are
# all added to the same external search index. Each project needs to have a
# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
# to a relative location where the documentation can be found. The format is:
# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
# This tag requires that the tag SEARCHENGINE is set to YES.
EXTRA_SEARCH_MAPPINGS =
#---------------------------------------------------------------------------
# Configuration options related to the LaTeX output
#---------------------------------------------------------------------------
# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
# The default value is: YES.
GENERATE_LATEX = NO
# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it.
# The default directory is: latex.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_OUTPUT = latex
# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
# invoked.
#
# Note that when enabling USE_PDFLATEX this option is only used for generating
# bitmaps for formulas in the HTML output, but not in the Makefile that is
# written to the output directory.
# The default file is: latex.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_CMD_NAME = latex
# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
# index for LaTeX.
# The default file is: makeindex.
# This tag requires that the tag GENERATE_LATEX is set to YES.
MAKEINDEX_CMD_NAME = makeindex
# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
# documents. This may be useful for small projects and may help to save some
# trees in general.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.
COMPACT_LATEX = NO
# The PAPER_TYPE tag can be used to set the paper type that is used by the
# printer.
# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
# 14 inches) and executive (7.25 x 10.5 inches).
# The default value is: a4.
# This tag requires that the tag GENERATE_LATEX is set to YES.
PAPER_TYPE = a4
# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
# that should be included in the LaTeX output. To get the times font for
# instance you can specify
# EXTRA_PACKAGES=times
# If left blank no extra packages will be included.
# This tag requires that the tag GENERATE_LATEX is set to YES.
EXTRA_PACKAGES =
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
# generated LaTeX document. The header should contain everything until the first
# chapter. If it is left blank doxygen will generate a standard header. See
# section "Doxygen usage" for information on how to let doxygen write the
# default header to a separate file.
#
# Note: Only use a user-defined header if you know what you are doing! The
# following commands have a special meaning inside the header: $title,
# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will
# replace them by respectively the title of the page, the current date and time,
# only the current date, the version number of doxygen, the project name (see
# PROJECT_NAME), or the project number (see PROJECT_NUMBER).
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_HEADER =
# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
# generated LaTeX document. The footer should contain everything after the last
# chapter. If it is left blank doxygen will generate a standard footer.
#
# Note: Only use a user-defined footer if you know what you are doing!
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_FOOTER =
# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the LATEX_OUTPUT output
# directory. Note that the files will be copied as-is; there are no commands or
# markers available.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_EXTRA_FILES =
# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
# contain links (just like the HTML output) instead of page references. This
# makes the output suitable for online browsing using a PDF viewer.
# The default value is: YES.
# This tag requires that the tag GENERATE_LATEX is set to YES.
PDF_HYPERLINKS = YES
# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
# the PDF file directly from the LaTeX files. Set this option to YES to get a
# higher quality PDF documentation.
# The default value is: YES.
# This tag requires that the tag GENERATE_LATEX is set to YES.
USE_PDFLATEX = YES
# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
# command to the generated LaTeX files. This will instruct LaTeX to keep running
# if errors occur, instead of asking the user for help. This option is also used
# when generating formulas in HTML.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_BATCHMODE = NO
# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
# index chapters (such as File Index, Compound Index, etc.) in the output.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_HIDE_INDICES = NO
# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
# code with syntax highlighting in the LaTeX output.
#
# Note that which sources are shown also depends on other settings such as
# SOURCE_BROWSER.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_SOURCE_CODE = NO
# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
# bibliography, e.g. plainnat, or ieeetr. See
# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
# The default value is: plain.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_BIB_STYLE = plain
#---------------------------------------------------------------------------
# Configuration options related to the RTF output
#---------------------------------------------------------------------------
# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
# RTF output is optimized for Word 97 and may not look too pretty with other RTF
# readers/editors.
# The default value is: NO.
GENERATE_RTF = NO
# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it.
# The default directory is: rtf.
# This tag requires that the tag GENERATE_RTF is set to YES.
RTF_OUTPUT = rtf
# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
# documents. This may be useful for small projects and may help to save some
# trees in general.
# The default value is: NO.
# This tag requires that the tag GENERATE_RTF is set to YES.
COMPACT_RTF = NO
# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
# contain hyperlink fields. The RTF file will contain links (just like the HTML
# output) instead of page references. This makes the output suitable for online
# browsing using Word or some other Word compatible readers that support those
# fields.
#
# Note: WordPad (write) and others do not support links.
# The default value is: NO.
# This tag requires that the tag GENERATE_RTF is set to YES.
RTF_HYPERLINKS = NO
# Load stylesheet definitions from file. Syntax is similar to doxygen's config
# file, i.e. a series of assignments. You only have to provide replacements,
# missing definitions are set to their default value.
#
# See also section "Doxygen usage" for information on how to generate the
# default style sheet that doxygen normally uses.
# This tag requires that the tag GENERATE_RTF is set to YES.
RTF_STYLESHEET_FILE =
# Set optional variables used in the generation of an RTF document. Syntax is
# similar to doxygen's config file. A template extensions file can be generated
# using doxygen -e rtf extensionFile.
# This tag requires that the tag GENERATE_RTF is set to YES.
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# Configuration options related to the man page output
#---------------------------------------------------------------------------
# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
# classes and files.
# The default value is: NO.
GENERATE_MAN = NO
# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it. A directory man3 will be created inside the directory specified by
# MAN_OUTPUT.
# The default directory is: man.
# This tag requires that the tag GENERATE_MAN is set to YES.
MAN_OUTPUT = man
# The MAN_EXTENSION tag determines the extension that is added to the generated
# man pages. In case the manual section does not start with a number, the number
# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
# optional.
# The default value is: .3.
# This tag requires that the tag GENERATE_MAN is set to YES.
MAN_EXTENSION = .3
# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
# will generate one additional man file for each entity documented in the real
# man page(s). These additional files only source the real man page, but without
# them the man command would be unable to find the correct page.
# The default value is: NO.
# This tag requires that the tag GENERATE_MAN is set to YES.
MAN_LINKS = NO
#---------------------------------------------------------------------------
# Configuration options related to the XML output
#---------------------------------------------------------------------------
# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
# captures the structure of the code including all documentation.
# The default value is: NO.
GENERATE_XML = NO
# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it.
# The default directory is: xml.
# This tag requires that the tag GENERATE_XML is set to YES.
XML_OUTPUT = xml
# The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a
# validating XML parser to check the syntax of the XML files.
# This tag requires that the tag GENERATE_XML is set to YES.
XML_SCHEMA =
# The XML_DTD tag can be used to specify a XML DTD, which can be used by a
# validating XML parser to check the syntax of the XML files.
# This tag requires that the tag GENERATE_XML is set to YES.
XML_DTD =
# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
# listings (including syntax highlighting and cross-referencing information) to
# the XML output. Note that enabling this will significantly increase the size
# of the XML output.
# The default value is: YES.
# This tag requires that the tag GENERATE_XML is set to YES.
XML_PROGRAMLISTING = YES
#---------------------------------------------------------------------------
# Configuration options related to the DOCBOOK output
#---------------------------------------------------------------------------
# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
# that can be used to generate PDF.
# The default value is: NO.
GENERATE_DOCBOOK = NO
# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
# front of it.
# The default directory is: docbook.
# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
DOCBOOK_OUTPUT = docbook
#---------------------------------------------------------------------------
# Configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
# Definitions (see http://autogen.sf.net) file that captures the structure of
# the code including all documentation. Note that this feature is still
# experimental and incomplete at the moment.
# The default value is: NO.
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# Configuration options related to the Perl module output
#---------------------------------------------------------------------------
# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
# file that captures the structure of the code including all documentation.
#
# Note that this feature is still experimental and incomplete at the moment.
# The default value is: NO.
GENERATE_PERLMOD = NO
# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
# output from the Perl module output.
# The default value is: NO.
# This tag requires that the tag GENERATE_PERLMOD is set to YES.
PERLMOD_LATEX = NO
# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
# formatted so it can be parsed by a human reader. This is useful if you want to
# understand what is going on. On the other hand, if this tag is set to NO the
# size of the Perl module output will be much smaller and Perl will parse it
# just the same.
# The default value is: YES.
# This tag requires that the tag GENERATE_PERLMOD is set to YES.
PERLMOD_PRETTY = YES
# The names of the make variables in the generated doxyrules.make file are
# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
# so different doxyrules.make files included by the same Makefile don't
# overwrite each other's variables.
# This tag requires that the tag GENERATE_PERLMOD is set to YES.
PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
# C-preprocessor directives found in the sources and include files.
# The default value is: YES.
ENABLE_PREPROCESSING = YES
# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
# in the source code. If set to NO only conditional compilation will be
# performed. Macro expansion can be done in a controlled way by setting
# EXPAND_ONLY_PREDEF to YES.
# The default value is: NO.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
MACRO_EXPANSION = NO
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
# the macro expansion is limited to the macros specified with the PREDEFINED and
# EXPAND_AS_DEFINED tags.
# The default value is: NO.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
EXPAND_ONLY_PREDEF = NO
# If the SEARCH_INCLUDES tag is set to YES the includes files in the
# INCLUDE_PATH will be searched if a #include is found.
# The default value is: YES.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
SEARCH_INCLUDES = YES
# The INCLUDE_PATH tag can be used to specify one or more directories that
# contain include files that are not input files but should be processed by the
# preprocessor.
# This tag requires that the tag SEARCH_INCLUDES is set to YES.
INCLUDE_PATH =
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
# patterns (like *.h and *.hpp) to filter out the header-files in the
# directories. If left blank, the patterns specified with FILE_PATTERNS will be
# used.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
INCLUDE_FILE_PATTERNS =
# The PREDEFINED tag can be used to specify one or more macro names that are
# defined before the preprocessor is started (similar to the -D option of e.g.
# gcc). The argument of the tag is a list of macros of the form: name or
# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
# is assumed. To prevent a macro definition from being undefined via #undef or
# recursively expanded use the := operator instead of the = operator.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
PREDEFINED =
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
# tag can be used to specify a list of macro names that should be expanded. The
# macro definition that is found in the sources will be used. Use the PREDEFINED
# tag if you want to use a different macro definition that overrules the
# definition found in the source code.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
EXPAND_AS_DEFINED =
# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
# remove all refrences to function-like macros that are alone on a line, have an
# all uppercase name, and do not end with a semicolon. Such function macros are
# typically used for boiler-plate code, and will confuse the parser if not
# removed.
# The default value is: YES.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration options related to external references
#---------------------------------------------------------------------------
# The TAGFILES tag can be used to specify one or more tag files. For each tag
# file the location of the external documentation should be added. The format of
# a tag file without this location is as follows:
# TAGFILES = file1 file2 ...
# Adding location for the tag files is done as follows:
# TAGFILES = file1=loc1 "file2 = loc2" ...
# where loc1 and loc2 can be relative or absolute paths or URLs. See the
# section "Linking to external documentation" for more information about the use
# of tag files.
# Note: Each tag file must have an unique name (where the name does NOT include
# the path). If a tag file is not located in the directory in which doxygen is
# run, you must also specify the path to the tagfile here.
TAGFILES =
# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
# tag file that is based on the input files it reads. See section "Linking to
# external documentation" for more information about the usage of tag files.
GENERATE_TAGFILE =
# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
# class index. If set to NO only the inherited external classes will be listed.
# The default value is: NO.
ALLEXTERNALS = NO
# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
# the modules index. If set to NO, only the current project's groups will be
# listed.
# The default value is: YES.
EXTERNAL_GROUPS = YES
# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
# the related pages index. If set to NO, only the current project's pages will
# be listed.
# The default value is: YES.
EXTERNAL_PAGES = YES
# The PERL_PATH should be the absolute path and name of the perl script
# interpreter (i.e. the result of 'which perl').
# The default file (with absolute path) is: /usr/bin/perl.
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
# NO turns the diagrams off. Note that this option also works with HAVE_DOT
# disabled, but it is recommended to install and use dot, since it yields more
# powerful graphs.
# The default value is: YES.
CLASS_DIAGRAMS = YES
# You can define message sequence charts within doxygen comments using the \msc
# command. Doxygen will then run the mscgen tool (see:
# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
# documentation. The MSCGEN_PATH tag allows you to specify the directory where
# the mscgen tool resides. If left empty the tool is assumed to be found in the
# default search path.
MSCGEN_PATH =
# If set to YES, the inheritance and collaboration graphs will hide inheritance
# and usage relations if the target is undocumented or is not a class.
# The default value is: YES.
HIDE_UNDOC_RELATIONS = YES
# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz (see:
# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
# Bell Labs. The other options in this section have no effect if this option is
# set to NO
# The default value is: NO.
HAVE_DOT = YES
# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
# to run in parallel. When set to 0 doxygen will base this on the number of
# processors available in the system. You can set it explicitly to a value
# larger than 0 to get control over the balance between CPU load and processing
# speed.
# Minimum value: 0, maximum value: 32, default value: 0.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_NUM_THREADS = 0
# When you want a differently looking font n the dot files that doxygen
# generates you can specify the font name using DOT_FONTNAME. You need to make
# sure dot is able to find the font, which can be done by putting it in a
# standard location or by setting the DOTFONTPATH environment variable or by
# setting DOT_FONTPATH to the directory containing the font.
# The default value is: Helvetica.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_FONTNAME = Helvetica
# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
# dot graphs.
# Minimum value: 4, maximum value: 24, default value: 10.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_FONTSIZE = 10
# By default doxygen will tell dot to use the default font as specified with
# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
# the path where dot can find it using this tag.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_FONTPATH =
# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
# each documented class showing the direct and indirect inheritance relations.
# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
CLASS_GRAPH = YES
# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
# graph for each documented class showing the direct and indirect implementation
# dependencies (inheritance, containment, and class references variables) of the
# class with other documented classes.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
COLLABORATION_GRAPH = YES
# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
# groups, showing the direct groups dependencies.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
GROUP_GRAPHS = YES
# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
# collaboration diagrams in a style similar to the OMG's Unified Modeling
# Language.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
UML_LOOK = NO
# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
# class node. If there are many fields or methods and many nodes the graph may
# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
# number of items for each type to make the size more manageable. Set this to 0
# for no limit. Note that the threshold may be exceeded by 50% before the limit
# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
# but if the number exceeds 15, the total amount of fields shown is limited to
# 10.
# Minimum value: 0, maximum value: 100, default value: 10.
# This tag requires that the tag HAVE_DOT is set to YES.
UML_LIMIT_NUM_FIELDS = 10
# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
# collaboration graphs will show the relations between templates and their
# instances.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
TEMPLATE_RELATIONS = NO
# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
# YES then doxygen will generate a graph for each documented file showing the
# direct and indirect include dependencies of the file with other documented
# files.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
INCLUDE_GRAPH = YES
# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
# set to YES then doxygen will generate a graph for each documented file showing
# the direct and indirect include dependencies of the file with other documented
# files.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
INCLUDED_BY_GRAPH = YES
# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
# dependency graph for every global function or class method.
#
# Note that enabling this option will significantly increase the time of a run.
# So in most cases it will be better to enable call graphs for selected
# functions only using the \callgraph command.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
CALL_GRAPH = NO
# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
# dependency graph for every global function or class method.
#
# Note that enabling this option will significantly increase the time of a run.
# So in most cases it will be better to enable caller graphs for selected
# functions only using the \callergraph command.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
CALLER_GRAPH = NO
# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
# hierarchy of all classes instead of a textual one.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
GRAPHICAL_HIERARCHY = YES
# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
# dependencies a directory has on other directories in a graphical way. The
# dependency relations are determined by the #include relations between the
# files in the directories.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
DIRECTORY_GRAPH = YES
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
# generated by dot.
# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
# to make the SVG files visible in IE 9+ (other browsers do not have this
# requirement).
# Possible values are: png, jpg, gif and svg.
# The default value is: png.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_IMAGE_FORMAT = png
# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
# enable generation of interactive SVG images that allow zooming and panning.
#
# Note that this requires a modern browser other than Internet Explorer. Tested
# and working are Firefox, Chrome, Safari, and Opera.
# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
# the SVG files visible. Older versions of IE do not have SVG support.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
INTERACTIVE_SVG = NO
# The DOT_PATH tag can be used to specify the path where the dot tool can be
# found. If left blank, it is assumed the dot tool can be found in the path.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_PATH =
# The DOTFILE_DIRS tag can be used to specify one or more directories that
# contain dot files that are included in the documentation (see the \dotfile
# command).
# This tag requires that the tag HAVE_DOT is set to YES.
DOTFILE_DIRS =
# The MSCFILE_DIRS tag can be used to specify one or more directories that
# contain msc files that are included in the documentation (see the \mscfile
# command).
MSCFILE_DIRS =
# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
# that will be shown in the graph. If the number of nodes in a graph becomes
# larger than this value, doxygen will truncate the graph, which is visualized
# by representing a node as a red box. Note that doxygen if the number of direct
# children of the root node in a graph is already larger than
# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
# Minimum value: 0, maximum value: 10000, default value: 50.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_GRAPH_MAX_NODES = 50
# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
# generated by dot. A depth value of 3 means that only nodes reachable from the
# root by following a path via at most 3 edges will be shown. Nodes that lay
# further from the root node will be omitted. Note that setting this option to 1
# or 2 may greatly reduce the computation time needed for large code bases. Also
# note that the size of a graph can be further restricted by
# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
# Minimum value: 0, maximum value: 1000, default value: 0.
# This tag requires that the tag HAVE_DOT is set to YES.
MAX_DOT_GRAPH_DEPTH = 0
# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
# background. This is disabled by default, because dot on Windows does not seem
# to support this out of the box.
#
# Warning: Depending on the platform used, enabling this option may lead to
# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
# read).
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_TRANSPARENT = NO
# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
# files in one run (i.e. multiple -o and -T options on the command line). This
# makes dot run faster, but since only newer versions of dot (>1.8.10) support
# this, this feature is disabled by default.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_MULTI_TARGETS = NO
# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
# explaining the meaning of the various boxes and arrows in the dot generated
# graphs.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
GENERATE_LEGEND = YES
# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
# files that are used to generate the various graphs.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_CLEANUP = YES
diff --git a/doc/Makefile.am b/doc/Makefile.am
index a37554f7de..da05015e93 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -1,408 +1,131 @@
#
# Copyright 2003-2020 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.
#
include $(top_srcdir)/mk/common.mk
# Deprecated plaintext documents (dynamically converted to HTML)
DEPRECATED_ORIGINAL = crm_fencing.txt
DEPRECATED_GENERATED =
if BUILD_ASCIIDOC
DEPRECATED_GENERATED += $(DEPRECATED_ORIGINAL:%.txt=%.html)
endif
DEPRECATED_ALL = $(DEPRECATED_ORIGINAL) $(DEPRECATED_GENERATED)
-# Current documentation based on asciidoc, DocBook, and pandoc
-BOOKS =
-
doc_DATA = $(DEPRECATED_ALL)
noinst_SCRIPTS = abi-check
# The sphinx docs are not yet built by default, but we still want to distribute
# them so configure can build the Makefile in a distribution.
DIST_SUBDIRS = sphinx
-EXTRA_DIST = $(DEPRECATED_ORIGINAL) $(SHARED_TXT)
-EXTRA_DIST += $(CFS_TXT) $(CFS_XML_ONLY)
-EXTRA_DIST += $(PA_TXT) $(PA_XML_ONLY)
-EXTRA_DIST += $(PD_TXT) $(PD_XML_ONLY)
-EXTRA_DIST += $(PE_TXT) $(PE_XML_ONLY)
-EXTRA_DIST += $(PR_TXT) $(PR_XML_ONLY)
-EXTRA_DIST += pcs-crmsh-quick-ref.md
+EXTRA_DIST = $(DEPRECATED_ORIGINAL) pcs-crmsh-quick-ref.md
# toplevel rsync destination for www targets (without trailing slash)
RSYNC_DEST ?= root@www.clusterlabs.org:/var/www/html
# recursive, preserve symlinks/permissions/times, verbose, compress,
# don't cross filesystems, sparse, show progress
RSYNC_OPTS = -rlptvzxS --progress
LAST_RELEASE ?= Pacemaker-$(VERSION)
TAG ?= $(shell [ -n "`git tag --points-at HEAD | head -1`" ] \
&& ( git tag --points-at HEAD | head -1 ) \
|| git log --pretty=format:%H -n 1 HEAD)
-# What formats to build by default: pdf,html,html-single,html-desktop,epub
-DOCBOOK_FORMATS := html-desktop
-
-# What languages to build and upload to website by default
-# (currently only en-US because translations are out of date)
-DOCBOOK_LANGS := en-US
-
if IS_ASCIIDOC
ASCIIDOC_HTML_ARGS = --unsafe --backend=xhtml11
ASCIIDOC_DBOOK_ARGS = -b docbook -d book
else
ASCIIDOC_HTML_ARGS = --backend=html5
ASCIIDOC_DBOOK_ARGS = -b docbook45 -d book
endif
%.html: %.txt
$(AM_V_GEN)$(ASCIIDOC_CONV) $(ASCIIDOC_HTML_ARGS) --out-file=$@ $< $(PCMK_quiet)
-#
-# Generate DocBook XML from asciidoc text.
-#
-# Build each chapter as a book (since the numbering isn't right for
-# articles and only books can have appendices) and then strip out the
-# bits we don't want or need.
-#
-# XXX Sequence of tr/sed commands should be replaced with a single XSLT
-#
-%.xml: %.txt
- $(AM_V_at)$(MKDIR_P) $(shell dirname $@) # might not exist in VPATH build
- $(AM_V_at)$(ASCIIDOC_CONV) $(ASCIIDOC_DBOOK_ARGS) -o - $< | tr -d '\036\r' >$@-t # Convert, fix line endings
- $(AM_V_at)sed -i 's/\ lang="en"//' $@-t # Never specify a language in the chapters
- $(AM_V_at)sed -i 's/simpara/para/g' $@-t # publican doesn't correctly render footnotes with simpara
- $(AM_V_at)sed -i 's/.*<date>.*//g' $@-t # Remove dangling tag
- $(AM_V_at)sed -i 's/.*preface>//g' $@-t # Remove preface elements
- $(AM_V_at)sed -i 's:<title></title>::g' $@-t # Remove empty title
- $(AM_V_at)sed -i 's/chapter/section/g' $@-t # Chapters become sections, so that books can become chapters
- $(AM_V_at)sed -i 's/<.*bookinfo.*>//g' $@-t # Strip out bookinfo, we don't need it
- $(AM_V_at)! grep -q "<appendix" $@-t || sed -i \
- 's/.*book>//;tb;bf;:b;N;s/.*<title>.*<\/title>.*//;tb;/<appendix/{:i;n;/<\/appendix/{p;d};bi};bb;:f;p;d' \
- $@-t # We just want the appendix tag (asciidoctor adds non-empty book-level title)
- $(AM_V_at)sed -i 's/book>/chapter>/g' $@-t # Rename to chapter (won't trigger if previous sed did)
- $(AM_V_GEN)mv $@-t $@
-
# For Makefile debugging
.PHONY: vars
vars:
@echo DEPRECATED_ORIGINAL=\'$(DEPRECATED_ORIGINAL)\'
@echo DEPRECATED_GENERATED=\'$(DEPRECATED_GENERATED)\'
- @echo BOOKS=\'$(BOOKS)\'
@echo LAST_RELEASE=\'$(LAST_RELEASE)\'
@echo TAG=\'$(TAG)\'
.PHONY: deprecated-upload
deprecated-upload: $(DEPRECATED_ALL)
rsync $(RSYNC_OPTS) $(DEPRECATED_ALL) "$(RSYNC_DEST)/$(PACKAGE)/doc/"
.PHONY: deprecated-clean
deprecated-clean:
-rm -f $(DEPRECATED_GENERATED)
-# publican-clusterlabs/xsl/{html,html-single,pdf}.xsl refer to URIs
-# requiring Internet access, hence we shadow that with a XML catalog-based
-# redirect to local files brought with Publican installation;
-# this is what newer Publican normally does with the system-wide catalog
-# upon its installation, but let's provide a compatibility for older
-# or badly installed instances (via adding the created file into
-# XML_CATALOG_FILES for libxml2 backing Publican as a fallback);
-# note that nextCatalog arrangement needed so as to overcome
-# https://rt.cpan.org/Public/Bug/Display.html?id=113781
-publican-catalog-fallback:
- @exec >$@-t \
- && echo '<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">' \
- && echo '<rewriteURI uriStartString="https://fedorahosted.org/released/publican/xsl/docbook4/" rewritePrefix="file:///usr/share/publican/xsl/"/>' \
- && echo '</catalog>'
- $(AM_V_GEN)mv $@-t $@
-publican-catalog: publican-catalog-fallback
- @exec >$@-t \
- && echo '<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">' \
- && echo '<nextCatalog catalog="file:///etc/xml/catalog"/>' \
- && echo '<nextCatalog catalog="file://$(CURDIR)/$<"/>' \
- && echo '</catalog>'
- $(AM_V_GEN)mv $@-t $@
-
-COMMON_XML = Author_Group.xml Book_Info.xml Revision_History.xml
-
-SHARED_TXT=$(wildcard shared/en-US/*.txt)
-SHARED_XML=$(SHARED_TXT:%.txt=%.xml)
-
-if PUBLICAN_INTREE_BRAND
-PUBLICAN_INTREE_DEPS = publican-catalog
-PUBLICAN_INTREE_ENV = XML_CATALOG_FILES="$(CURDIR)/publican-catalog"
-PUBLICAN_INTREE_OPT = --brand_dir="$(top_srcdir)/publican-clusterlabs"
-else
-PUBLICAN_INTREE_DEPS =
-PUBLICAN_INTREE_ENV =
-PUBLICAN_INTREE_OPT =
-endif
-
-
-# Clusters From Scratch
-
-CFS_SHARED_TXT = $(addprefix shared/en-US/,pacemaker-intro.txt)
-CFS_SHARED_XML = $(CFS_SHARED_TXT:%.txt=%.xml)
-CFS_TXT = $(wildcard Clusters_from_Scratch/en-US/*.txt)
-CFS_XML_GEN = $(CFS_TXT:%.txt=%.xml)
-CFS_XML_ONLY = $(addprefix $(srcdir)/Clusters_from_Scratch/en-US/,$(COMMON_XML) \
- Clusters_from_Scratch.ent \
- Clusters_from_Scratch.xml \
- Preface.xml)
-CFS_DEPS = $(PNGS) $(CFS_SHARED_XML) $(CFS_XML_ONLY) $(CFS_XML_GEN)
-
-# We have to hardcode the book name
-# With '%' the test for 'newness' fails
-Clusters_from_Scratch.build: $(CFS_DEPS) $(PUBLICAN_INTREE_DEPS)
- @echo "Building $(@:%.build=%) because of $?"
- rm -rf "$(@:%.build=%)/publish"/* "$(@:%.build=%)/tmp"
- $(AM_V_PUB)cd $(@:%.build=%) && RPM_BUILD_DIR="" $(PUBLICAN_INTREE_ENV) \
- $(PUBLICAN) build --src_dir="$(srcdir)" --publish \
- --langs="$(DOCBOOK_LANGS)" --formats="$(DOCBOOK_FORMATS)" \
- $(PUBLICAN_INTREE_OPT) $(PCMK_quiet)
- rm -rf "$(@:%.build=%)/tmp"
- touch "$@"
-
-
-# Pacemaker Administration
-
-PA_TXT = $(wildcard Pacemaker_Administration/en-US/*.txt)
-PA_XML_GEN = $(PA_TXT:%.txt=%.xml)
-PA_XML_ONLY = $(addprefix $(srcdir)/Pacemaker_Administration/en-US/,$(COMMON_XML) \
- Pacemaker_Administration.ent \
- Pacemaker_Administration.xml \
- Preface.xml)
-PA_DEPS = $(PA_XML_ONLY) $(PA_XML_GEN)
-
-# We have to hardcode the book name
-# With '%' the test for 'newness' fails
-Pacemaker_Administration.build: $(PA_DEPS) $(PUBLICAN_INTREE_DEPS)
- @echo Building $(@:%.build=%) because of $?
- rm -rf $(@:%.build=%)/publish/*
- $(AM_V_PUB)cd $(@:%.build=%) && RPM_BUILD_DIR="" $(PUBLICAN_INTREE_ENV) \
- $(PUBLICAN) build --src_dir="$(srcdir)" --publish \
- --langs="$(DOCBOOK_LANGS)" --formats="$(DOCBOOK_FORMATS)" \
- $(PUBLICAN_INTREE_OPT) $(PCMK_quiet)
- rm -rf $(@:%.build=%)/tmp
- touch "$@"
-
-
-# Pacemaker Development
-
-PD_TXT = $(wildcard Pacemaker_Development/en-US/*.txt)
-PD_XML_GEN = $(PD_TXT:%.txt=%.xml)
-PD_XML_ONLY = $(addprefix $(srcdir)/Pacemaker_Development/en-US/,$(COMMON_XML) \
- Pacemaker_Development.ent \
- Pacemaker_Development.xml)
-PD_DEPS = $(PD_XML_ONLY) $(PD_XML_GEN)
-
-# We have to hardcode the book name
-# With '%' the test for 'newness' fails
-Pacemaker_Development.build: $(PD_DEPS) $(PUBLICAN_INTREE_DEPS)
- @echo Building $(@:%.build=%) because of $?
- rm -rf $(@:%.build=%)/publish/* $(@:%.build=%)/tmp
- $(AM_V_PUB)cd $(@:%.build=%) && RPM_BUILD_DIR="" $(PUBLICAN_INTREE_ENV) \
- $(PUBLICAN) build --src_dir="$(srcdir)" --publish \
- --langs="$(DOCBOOK_LANGS)" --formats="$(DOCBOOK_FORMATS)" \
- $(PUBLICAN_INTREE_OPT) $(PCMK_quiet)
- rm -rf $(@:%.build=%)/tmp
- touch "$@"
-
-
-# Pacemaker Explained
-
-PE_SHARED_TXT = $(addprefix shared/en-US/,pacemaker-intro.txt)
-PE_SHARED_XML = $(PE_SHARED_TXT:%.txt=%.xml)
-PE_TXT = $(wildcard Pacemaker_Explained/en-US/*.txt)
-PE_XML_GEN = $(PE_TXT:%.txt=%.xml)
-PE_XML_ONLY = $(addprefix $(srcdir)/Pacemaker_Explained/en-US/,$(COMMON_XML) \
- Pacemaker_Explained.ent \
- Pacemaker_Explained.xml \
- Preface.xml)
-PE_DEPS = $(PNGS) $(PE_SHARED_XML) $(PE_XML_ONLY) $(PE_XML_GEN)
-
-# We have to hardcode the book name
-# With '%' the test for 'newness' fails
-Pacemaker_Explained.build: $(PE_DEPS) $(PUBLICAN_INTREE_DEPS)
- @echo Building $(@:%.build=%) because of $?
- rm -rf $(@:%.build=%)/publish/* $(@:%.build=%)/tmp
- $(AM_V_PUB)cd $(@:%.build=%) && RPM_BUILD_DIR="" $(PUBLICAN_INTREE_ENV) \
- $(PUBLICAN) build --src_dir="$(srcdir)" --publish \
- --langs="$(DOCBOOK_LANGS)" --formats="$(DOCBOOK_FORMATS)" \
- $(PUBLICAN_INTREE_OPT) $(PCMK_quiet)
- rm -rf $(@:%.build=%)/tmp
- touch "$@"
-
-
-# Pacemaker Remote
-
-PR_TXT = $(wildcard Pacemaker_Remote/en-US/*.txt)
-PR_XML_GEN = $(PR_TXT:%.txt=%.xml)
-PR_XML_ONLY = $(addprefix $(srcdir)/Pacemaker_Remote/en-US/,$(COMMON_XML) \
- Pacemaker_Remote.ent \
- Pacemaker_Remote.xml)
-PR_DEPS = $(PNGS) $(PR_XML_ONLY) $(PR_XML_GEN)
-
-# We have to hardcode the book name
-# With '%' the test for 'newness' fails
-Pacemaker_Remote.build: $(PR_DEPS) $(PUBLICAN_INTREE_DEPS)
- @echo Building $(@:%.build=%) because of $?
- rm -rf $(@:%.build=%)/publish/* $(@:%.build=%)/tmp
- $(AM_V_PUB)cd $(@:%.build=%) && RPM_BUILD_DIR="" $(PUBLICAN_INTREE_ENV) \
- $(PUBLICAN) build --src_dir="$(srcdir)" --publish \
- --langs="$(DOCBOOK_LANGS)" --formats="$(DOCBOOK_FORMATS)" \
- $(PUBLICAN_INTREE_OPT) $(PCMK_quiet)
- rm -rf $(@:%.build=%)/tmp
- touch "$@"
-
-
-# Build all books for upload to ClusterLabs
-.PHONY: books
-books: books-clean
-if BUILD_DOCBOOK
- for book in $(BOOKS); do \
- sed -i.sed 's@^brand:.*@brand: clusterlabs@' $$book/publican.cfg; \
- done
- $(MAKE) $(AM_MAKEFLAGS) DOCBOOK_FORMATS="pdf,html,html-single,epub" \
- DOCBOOK_LANGS="$(DOCBOOK_LANGS)" all-local
-endif
-
-.PHONY: books-upload
-books-upload: books
-if BUILD_DOCBOOK
- @echo Uploading current $(PACKAGE_SERIES) documentation set to clusterlabs.org
- @for book in $(BOOKS); do \
- echo Uploading $$book...; \
- echo "Generated on `date` from version: $(shell git log --pretty="format:%h %d" -n 1)" \
- >> $$book/publish/build-$(PACKAGE_SERIES).txt; \
- rsync $(RSYNC_OPTS) $$book/publish/* "$(RSYNC_DEST)/$(PACKAGE)/doc/"; \
- done
-endif
-
-.PHONY: books-clean
-books-clean:
- -for book in $(BOOKS); do \
- rm -rf $$book/tmp $$book/publish; \
- done
- -rm -f $(PNGS_GENERATED) \
- $(SHARED_XML) \
- $(CFS_XML_GEN) \
- $(PA_XML_GEN) \
- $(PD_XML_GEN) \
- $(PE_XML_GEN) \
- $(PR_XML_GEN) \
- publican-catalog-fallback \
- publican-catalog
-
-
-if BUILD_DOCBOOK
-all-local: $(BOOKS:%=%.build) */publican.cfg
-
-install-data-local: all-local
- for book in $(BOOKS); do \
- filelist=`find $$book/publish/* -print`; \
- for f in $$filelist; do \
- p=`echo $$f | sed s:publish/:: | sed s:Pacemaker/::`; \
- if [ -d $$f ]; then \
- $(INSTALL) -d -m 775 $(DESTDIR)$(docdir)/$$p; \
- else \
- $(INSTALL) -m 644 $$f $(DESTDIR)$(docdir)/$$p; \
- fi \
- done; \
- done
-endif
-
-BRAND_DEPS = $(wildcard publican-clusterlabs/en-US/*.png) \
- $(wildcard publican-clusterlabs/en-US/*.xml)
-
-brand-build: $(BRAND_DEPS)
- cd publican-clusterlabs && publican build --formats=xml --langs=all --publish
-
-brand: brand-build
- @echo "Installing branded content..."
- cd publican-clusterlabs && sudo publican install_brand --path=$(datadir)/publican/Common_Content
-
-brand-rpm-clean:
- -find publican-clusterlabs -name "*.noarch.rpm" -exec rm -f \{\} \;
-
-brand-rpm-build: brand-rpm-clean brand-build
- cd publican-clusterlabs && \
- $(PUBLICAN) --src_dir="$(srcdir)" package --binary
-
-brand-rpm-install: brand-rpm-build
- find publican-clusterlabs -name "*.noarch.rpm" -exec sudo rpm -Uvh --force \{\} \;
-
-pdf:
- $(MAKE) $(AM_MAKEFLAGS) DOCBOOK_FORMATS="pdf" all-local
-
# Annotated source code as HTML
global:
$(MAKE) $(AM_MAKEFLAGS) -C .. clean-generic
cd .. && gtags -q && htags -sanhIT doc
global-upload: global
rsync $(RSYNC_OPTS) HTML/ "$(RSYNC_DEST)/$(PACKAGE)/global/$(TAG)/"
global-clean:
-rm -rf HTML
# Man pages as HTML
%.8.html: %.8
groff -mandoc `man -w ./$<` -T html > $@
%.7.html: %.7
groff -mandoc `man -w ./$<` -T html > $@
manhtml:
$(MAKE) $(AM_MAKEFLAGS) -C .. all
find .. -name "[a-z]*.[78]" -exec $(MAKE) $(AM_MAKEFLAGS) \{\}.html \;
manhtml-upload: manhtml
find .. -name "[a-z]*.[78].html" -exec \
rsync $(RSYNC_OPTS) \{\} "$(RSYNC_DEST)/$(PACKAGE)/man/" \;
manhtml-clean:
-find .. -name "[a-z]*.[78].html" -exec rm \{\} \;
# API documentation as HTML
doxygen: Doxyfile
doxygen Doxyfile
doxygen-upload: doxygen
rsync $(RSYNC_OPTS) api/html/ "$(RSYNC_DEST)/$(PACKAGE)/doxygen/$(TAG)/"
doxygen-clean:
-rm -rf api
# ABI compatibility report as HTML
abi: abi-check
./abi-check $(PACKAGE) $(LAST_RELEASE) $(TAG)
abi-www:
export RSYNC_DEST=$(RSYNC_DEST); ./abi-check -u $(PACKAGE) $(LAST_RELEASE) $(TAG)
abi-clean:
-rm -rf abi_dumps compat_reports
# All HTML documentation (except ABI compatibility, which is run separately)
.PHONY: www
-www: clean-local deprecated-upload manhtml-upload global-upload doxygen-upload books-upload
+www: clean-local deprecated-upload manhtml-upload global-upload doxygen-upload
-clean-local: brand-rpm-clean global-clean manhtml-clean doxygen-clean abi-clean books-clean deprecated-clean
+clean-local: global-clean manhtml-clean doxygen-clean abi-clean deprecated-clean
diff --git a/doc/Pacemaker_Administration/en-US/Author_Group.xml b/doc/Pacemaker_Administration/en-US/Author_Group.xml
deleted file mode 100644
index ff907feee5..0000000000
--- a/doc/Pacemaker_Administration/en-US/Author_Group.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<authorgroup>
- <author>
- <affiliation>
- <orgname>Written by the Pacemaker project contributors</orgname>
- </affiliation>
- </author>
-</authorgroup>
diff --git a/doc/Pacemaker_Administration/en-US/Book_Info.xml b/doc/Pacemaker_Administration/en-US/Book_Info.xml
deleted file mode 100644
index e330c74a9c..0000000000
--- a/doc/Pacemaker_Administration/en-US/Book_Info.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE bookinfo PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-<!ENTITY % BOOK_ENTITIES SYSTEM "Pacemaker_Administration.ent">
-%BOOK_ENTITIES;
-]>
-<bookinfo id="book-Pacemaker_Administration-Pacemaker_Administration">
- <title>Pacemaker Administration</title>
- <subtitle>Managing Pacemaker Clusters</subtitle>
- <!--
- EDITION-PUBSNUMBER should match REVNUMBER in Revision_History.xml.
- Increment EDITION when the syntax of the documented software
- changes (OS, pacemaker, corosync, pcs), and PUBSNUMBER for
- simple textual changes (corrections, translations, etc.).
- Changing the revision is only necessary when releasing a new
- version of Pacemaker or publishing the documents to the Web.
- -->
- <edition>2</edition>
- <pubsnumber>1</pubsnumber>
- <abstract>
- <para>
- This document has instructions and tips for system administrators who
- need to manage high-availability clusters using Pacemaker.
- </para>
- </abstract>
- <corpauthor>
- <inlinemediaobject>
- <imageobject>
- <imagedata fileref="Common_Content/images/title_logo.svg" format="SVG" />
- </imageobject>
- </inlinemediaobject>
- </corpauthor>
- <xi:include href="Common_Content/Legal_Notice.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Author_Group.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-</bookinfo>
diff --git a/doc/Pacemaker_Administration/en-US/Ch-Agents.txt b/doc/Pacemaker_Administration/en-US/Ch-Agents.txt
deleted file mode 100644
index 0d8ff1f1fb..0000000000
--- a/doc/Pacemaker_Administration/en-US/Ch-Agents.txt
+++ /dev/null
@@ -1,350 +0,0 @@
-:compat-mode: legacy
-= Resource Agents =
-
-== Resource Agent Actions ==
-
-If one resource depends on another resource via constraints, the cluster will
-interpret an expected result as sufficient to continue with dependent actions.
-This may cause timing issues if the resource agent start returns before the
-service is not only launched but fully ready to perform its function, or if the
-resource agent stop returns before the service has fully released all its
-claims on system resources. At a minimum, the start or stop should not return
-before a status command would return the expected (started or stopped) result.
-
-== OCF Resource Agents ==
-
-=== Location of Custom Scripts ===
-
-indexterm:[OCF Resource Agents]
-OCF Resource Agents are found in +/usr/lib/ocf/resource.d/pass:[<replaceable>provider</replaceable>]+
-
-When creating your own agents, you are encouraged to create a new
-directory under +/usr/lib/ocf/resource.d/+ so that they are not
-confused with (or overwritten by) the agents shipped by existing providers.
-
-So, for example, if you choose the provider name of bigCorp and want
-a new resource named bigApp, you would create a resource agent called
-+/usr/lib/ocf/resource.d/bigCorp/bigApp+ and define a resource:
-
-[source,XML]
-----
-<primitive id="custom-app" class="ocf" provider="bigCorp" type="bigApp"/>
-----
-
-=== Actions ===
-
-All OCF resource agents are required to implement the following actions.
-
-.Required Actions for OCF Agents
-[width="95%",cols="3m,3,7",options="header",align="center"]
-|=========================================================
-|Action
-|Description
-|Instructions
-
-|start
-|Start the resource
-|Return 0 on success and an appropriate error code otherwise. Must not
- report success until the resource is fully active.
- indexterm:[start,OCF Action]
- indexterm:[OCF,Action,start]
-
-|stop
-|Stop the resource
-|Return 0 on success and an appropriate error code otherwise. Must not
- report success until the resource is fully stopped.
- indexterm:[stop,OCF Action]
- indexterm:[OCF,Action,stop]
-
-|monitor
-|Check the resource's state
-
-|Exit 0 if the resource is running, 7 if it is stopped, and anything
- else if it is failed.
- indexterm:[monitor,OCF Action]
- indexterm:[OCF,Action,monitor]
-
-NOTE: The monitor script should test the state of the resource on the local machine only.
-
-|meta-data
-|Describe the resource
-|Provide information about this resource as an XML snippet. Exit with 0.
- indexterm:[meta-data,OCF Action]
- indexterm:[OCF,Action,meta-data]
-
-NOTE: This is _not_ performed as root.
-
-|validate-all
-|Verify the supplied parameters
-|Return 0 if parameters are valid, 2 if not valid, and 6 if resource is not configured.
- indexterm:[validate-all,OCF Action]
- indexterm:[OCF,Action,validate-all]
-
-|=========================================================
-
-Additional requirements (not part of the OCF specification) are placed on
-agents that will be used for advanced concepts such as clone resources.
-
-.Optional Actions for OCF Resource Agents
-[width="95%",cols="2m,6,3",options="header",align="center"]
-|=========================================================
-
-|Action
-|Description
-|Instructions
-
-|promote
-|Promote the local instance of a promotable clone resource to the master (primary) state.
-|Return 0 on success
- indexterm:[promote,OCF Action]
- indexterm:[OCF,Action,promote]
-
-|demote
-|Demote the local instance of a promotable clone resource to the slave (secondary) state.
-|Return 0 on success
- indexterm:[demote,OCF Action]
- indexterm:[OCF,Action,demote]
-
-|notify
-|Used by the cluster to send the agent pre- and post-notification
- events telling the resource what has happened and will happen.
-|Must not fail. Must exit with 0
- indexterm:[notify,OCF Action]
- indexterm:[OCF,Action,notify]
-
-|=========================================================
-
-One action specified in the OCF specs, +recover+, is not currently used by the
-cluster. It is intended to be a variant of the +start+ action that tries to
-recover a resource locally.
-
-[IMPORTANT]
-====
-If you create a new OCF resource agent, use indexterm:[ocf-tester]`ocf-tester`
-to verify that the agent complies with the OCF standard properly.
-====
-
-=== How are OCF Return Codes Interpreted? ===
-
-The first thing the cluster does is to check the return code against
-the expected result. If the result does not match the expected value,
-then the operation is considered to have failed, and recovery action is
-initiated.
-
-There are three types of failure recovery:
-
-.Types of recovery performed by the cluster
-[width="95%",cols="1m,4,4",options="header",align="center"]
-|=========================================================
-
-|Type
-|Description
-|Action Taken by the Cluster
-
-|soft
-|A transient error occurred
-|Restart the resource or move it to a new location
-indexterm:[soft,OCF error]
-indexterm:[OCF,error,soft]
-
-|hard
-|A non-transient error that may be specific to the current node occurred
-|Move the resource elsewhere and prevent it from being retried on the current node
-indexterm:[hard,OCF error]
-indexterm:[OCF,error,hard]
-
-|fatal
-|A non-transient error that will be common to all cluster nodes (e.g. a bad configuration was specified)
-|Stop the resource and prevent it from being started on any cluster node
-indexterm:[fatal,OCF error]
-indexterm:[OCF,error,fatal]
-
-|=========================================================
-
-[[s-ocf-return-codes]]
-=== OCF Return Codes ===
-
-The following table outlines the different OCF return codes and the type of
-recovery the cluster will initiate when a failure code is received.
-Although counterintuitive, even actions that return 0
-(aka. +OCF_SUCCESS+) can be considered to have failed, if 0 was not
-the expected return value.
-
-.OCF Return Codes and their Recovery Types
-[width="95%",cols="1m,<4m,<6,1m",options="header",align="center"]
-|=========================================================
-
-|RC
-|OCF Alias
-|Description
-|RT
-
-|0
-|OCF_SUCCESS
-|Success. The command completed successfully. This is the expected result for all start, stop, promote and demote commands.
-indexterm:[Return Code,OCF_SUCCESS]
-indexterm:[Return Code,0,OCF_SUCCESS]
-|soft
-
-|1
-|OCF_ERR_GENERIC
-|Generic "there was a problem" error code.
-indexterm:[Return Code,OCF_ERR_GENERIC]
-indexterm:[Return Code,1,OCF_ERR_GENERIC]
-|soft
-
-|2
-|OCF_ERR_ARGS
-|The resource's configuration is not valid on this machine. E.g. it refers to a location not found on the node.
-indexterm:[Return Code,OCF_ERR_ARGS]
-indexterm:[Return Code,2,OCF_ERR_ARGS]
-|hard
-
-|3
-|OCF_ERR_UNIMPLEMENTED
-|The requested action is not implemented.
-indexterm:[Return Code,OCF_ERR_UNIMPLEMENTED]
-indexterm:[Return Code,3,OCF_ERR_UNIMPLEMENTED]
-|hard
-
-|4
-|OCF_ERR_PERM
-|The resource agent does not have sufficient privileges to complete the task.
-indexterm:[Return Code,OCF_ERR_PERM]
-indexterm:[Return Code,4,OCF_ERR_PERM]
-|hard
-
-|5
-|OCF_ERR_INSTALLED
-|The tools required by the resource are not installed on this machine.
-indexterm:[Return Code,OCF_ERR_INSTALLED]
-indexterm:[Return Code,5,OCF_ERR_INSTALLED]
-|hard
-
-|6
-|OCF_ERR_CONFIGURED
-|The resource's configuration is invalid. E.g. required parameters are missing.
-indexterm:[Return Code,OCF_ERR_CONFIGURED]
-indexterm:[Return Code,6,OCF_ERR_CONFIGURED]
-|fatal
-
-|7
-|OCF_NOT_RUNNING
-|The resource is safely stopped. The cluster will not attempt to stop a resource that returns this for any action.
-indexterm:[Return Code,OCF_NOT_RUNNING]
-indexterm:[Return Code,7,OCF_NOT_RUNNING]
-|N/A
-
-|8
-|OCF_RUNNING_MASTER
-|The resource is running in master mode.
-indexterm:[Return Code,OCF_RUNNING_MASTER]
-indexterm:[Return Code,8,OCF_RUNNING_MASTER]
-|soft
-
-|9
-|OCF_FAILED_MASTER
-|The resource is in master mode but has failed. The resource will be demoted,
-stopped and then started (and possibly promoted) again.
-indexterm:[Return Code,OCF_FAILED_MASTER]
-indexterm:[Return Code,9,OCF_FAILED_MASTER]
-|soft
-
-|other
-|N/A
-|Custom error code.
-indexterm:[Return Code,other]
-|soft
-
-|=========================================================
-
-Exceptions to the recovery handling described above:
-
-* Probes (non-recurring monitor actions) that find a resource active
- (or in master mode) will not result in recovery action unless it is
- also found active elsewhere.
-* The recovery action taken when a resource is found active more than
- once is determined by the resource's +multiple-active+ property.
-* Recurring actions that return +OCF_ERR_UNIMPLEMENTED+
- do not cause any type of recovery.
-
-== LSB Resource Agents (Init Scripts) ==
-
-=== LSB Compliance ===
-
-The relevant part of the
-http://refspecs.linuxfoundation.org/lsb.shtml[LSB specifications]
-includes a description of all the return codes listed here.
-
-Assuming `some_service` is configured correctly and currently
-inactive, the following sequence will help you determine if it is
-LSB-compatible:
-
-. Start (stopped):
-+
-----
-# /etc/init.d/some_service start ; echo "result: $?"
-----
-+
- .. Did the service start?
- .. Did the echo command print *result: 0* (in addition to the init script's usual output)?
-+
-. Status (running):
-+
-----
-# /etc/init.d/some_service status ; echo "result: $?"
-----
-+
- .. Did the script accept the command?
- .. Did the script indicate the service was running?
- .. Did the echo command print *result: 0* (in addition to the init script's usual output)?
-+
-. Start (running):
-+
-----
-# /etc/init.d/some_service start ; echo "result: $?"
-----
-+
- .. Is the service still running?
- .. Did the echo command print *result: 0* (in addition to the init script's usual output)?
-+
-. Stop (running):
-+
-----
-# /etc/init.d/some_service stop ; echo "result: $?"
-----
-+
- .. Was the service stopped?
- .. Did the echo command print *result: 0* (in addition to the init script's usual output)?
-+
-. Status (stopped):
-+
-----
-# /etc/init.d/some_service status ; echo "result: $?"
-----
-+
- .. Did the script accept the command?
- .. Did the script indicate the service was not running?
- .. Did the echo command print *result: 3* (in addition to the init script's usual output)?
-+
-. Stop (stopped):
-+
-----
-# /etc/init.d/some_service stop ; echo "result: $?"
-----
-+
- .. Is the service still stopped?
- .. Did the echo command print *result: 0* (in addition to the init script's usual output)?
-+
-. Status (failed):
-+
-.. This step is not readily testable and relies on manual inspection of the script.
-+
-The script can use one of the error codes (other than 3) listed in the
-LSB spec to indicate that it is active but failed. This tells the
-cluster that before moving the resource to another node, it needs to
-stop it on the existing one first.
-
-If the answer to any of the above questions is no, then the script is
-not LSB-compliant. Your options are then to either fix the script or
-write an OCF agent based on the existing script.
diff --git a/doc/Pacemaker_Administration/en-US/Ch-Cluster.txt b/doc/Pacemaker_Administration/en-US/Ch-Cluster.txt
deleted file mode 100644
index c346d1ab7f..0000000000
--- a/doc/Pacemaker_Administration/en-US/Ch-Cluster.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-:compat-mode: legacy
-= The Cluster Layer =
-
-== Pacemaker and the Cluster Layer ==
-
-Pacemaker utilizes an underlying cluster layer for two purposes:
-
-* obtaining quorum
-* messaging between nodes
-
-Currently, only Corosync 2 and later is supported for this layer.
-
-== Managing Nodes in a Corosync-Based Cluster ==
-
-=== Adding a New Corosync Node ===
-
-indexterm:[Corosync,Add Cluster Node]
-indexterm:[Add Cluster Node,Corosync]
-
-To add a new node:
-
-. Install Corosync and Pacemaker on the new host.
-. Copy +/etc/corosync/corosync.conf+ and +/etc/corosync/authkey+ (if it exists)
- from an existing node. You may need to modify the *mcastaddr* option to match
- the new node's IP address.
-. Start the cluster software on the new host. If a log message containing
- "Invalid digest" appears from Corosync, the keys are not consistent between
- the machines.
-
-=== Removing a Corosync Node ===
-
-indexterm:[Corosync,Remove Cluster Node]
-indexterm:[Remove Cluster Node,Corosync]
-
-Because the messaging and membership layers are the authoritative
-source for cluster nodes, deleting them from the CIB is not a complete
-solution. First, one must arrange for corosync to forget about the
-node (*pcmk-1* in the example below).
-
-. Stop the cluster on the host to be removed. How to do this will vary with
- your operating system and installed versions of cluster software, for example,
- `pcs cluster stop` if you are using pcs for cluster management.
-. From one of the remaining active cluster nodes, tell Pacemaker to forget
- about the removed host, which will also delete the node from the CIB:
-+
-----
-# crm_node -R pcmk-1
-----
-
-=== Replacing a Corosync Node ===
-
-indexterm:[Corosync,Replace Cluster Node]
-indexterm:[Replace Cluster Node,Corosync]
-
-To replace an existing cluster node:
-
-. Make sure the old node is completely stopped.
-. Give the new machine the same hostname and IP address as the old one.
-. Follow the procedure above for adding a node.
diff --git a/doc/Pacemaker_Administration/en-US/Ch-Configuring.txt b/doc/Pacemaker_Administration/en-US/Ch-Configuring.txt
deleted file mode 100644
index 2f21c088fd..0000000000
--- a/doc/Pacemaker_Administration/en-US/Ch-Configuring.txt
+++ /dev/null
@@ -1,257 +0,0 @@
-:compat-mode: legacy
-= Configuring Pacemaker =
-
-Pacemaker's configuration, the CIB, is stored in XML format. Cluster
-administrators have multiple options for modifying the configuration either via
-the XML, or at a more abstract (and easier for humans to understand) level.
-
-Pacemaker reacts to configuration changes as soon as they are saved.
-Pacemaker's command-line tools and most higher-level tools provide the ability
-to batch changes together and commit them at once, rather than make a series of
-small changes, which could cause avoid unnecessary actions as Pacemaker
-responds to each change individually.
-
-Pacemaker tracks revisions to the configuration and will reject any update
-older than the current revision. Thus, it is a good idea to serialize all
-changes to the configuration. Avoid attempting simultaneous changes, whether on
-the same node or different nodes, and whether manually or using some automated
-configuration tool.
-
-[NOTE]
-====
-It is not necessary to update the configuration on all cluster nodes. Pacemaker
-immediately synchronizes changes to all active members of the cluster. To
-reduce bandwidth, the cluster only broadcasts the incremental updates that
-result from your changes and uses checksums to ensure that each copy is
-consistent.
-====
-
-
-=== Configuration Using Higher-level Tools ===
-
-Most users will benefit from using higher-level tools provided by
-projects separate from Pacemaker. Some of the most commonly used include the
-crm shell, hawk, and pcs. footnote:[For a list, see "Configuration Tools" at
-https://clusterlabs.org/components.html]
-
-See those projects' documentation for details on how to configure Pacemaker
-using them.
-
-=== Configuration Using Pacemaker's Command-Line Tools ===
-
-Pacemaker provides lower-level, command-line tools to manage the cluster. Most
-configuration tasks can be performed with these tools, without needing any XML
-knowledge.
-
-To enable STONITH for example, one could run:
-
-----
-# crm_attribute --name stonith-enabled --update 1
-----
-
-Or, to check whether *node1* is allowed to run resources, there is:
-
-----
-# crm_standby --query --node node1
-----
-
-Or, to change the failure threshold of *my-test-rsc*, one can use:
-
-----
-# crm_resource -r my-test-rsc --set-parameter migration-threshold --parameter-value 3 --meta
-----
-
-Examples of using these tools for specific cases will be given throughout this
-document where appropriate. See the man pages for further details.
-
-See <<s-cibadmin>> for how to edit the CIB using XML.
-
-See <<s-crm_shadow>> for a way to make a series of changes, then commit them
-all at once to the live cluster.
-
-
-== Working with CIB Properties ==
-
-Although these fields can be written to by the user, in
-most cases the cluster will overwrite any values specified by the
-user with the "correct" ones.
-
-To change the ones that can be specified by the user,
-for example +admin_epoch+, one should use:
-----
-# cibadmin --modify --xml-text '<cib admin_epoch="42"/>'
-----
-
-A complete set of CIB properties will look something like this:
-
-.XML attributes set for a cib element
-======
-[source,XML]
--------
-<cib crm_feature_set="3.0.7" validate-with="pacemaker-1.2"
- admin_epoch="42" epoch="116" num_updates="1"
- cib-last-written="Mon Jan 12 15:46:39 2015" update-origin="rhel7-1"
- update-client="crm_attribute" have-quorum="1" dc-uuid="1">
--------
-======
-
-
-== Querying and Setting Cluster Options ==
-
-indexterm:[Querying,Cluster Option]
-indexterm:[Setting,Cluster Option]
-indexterm:[Cluster,Querying Options]
-indexterm:[Cluster,Setting Options]
-
-Cluster options can be queried and modified using the `crm_attribute` tool. To
-get the current value of +cluster-delay+, you can run:
-
-----
-# crm_attribute --query --name cluster-delay
-----
-
-which is more simply written as
-
-----
-# crm_attribute -G -n cluster-delay
-----
-
-If a value is found, you'll see a result like this:
-
-----
-# crm_attribute -G -n cluster-delay
-scope=crm_config name=cluster-delay value=60s
-----
-
-If no value is found, the tool will display an error:
-
-----
-# crm_attribute -G -n clusta-deway
-scope=crm_config name=clusta-deway value=(null)
-Error performing operation: No such device or address
-----
-
-To use a different value (for example, 30 seconds), simply run:
-
-----
-# crm_attribute --name cluster-delay --update 30s
-----
-
-To go back to the cluster's default value, you can delete the value, for example:
-
-----
-# crm_attribute --name cluster-delay --delete
-Deleted crm_config option: id=cib-bootstrap-options-cluster-delay name=cluster-delay
-----
-
-=== When Options are Listed More Than Once ===
-
-If you ever see something like the following, it means that the option you're modifying is present more than once.
-
-.Deleting an option that is listed twice
-=======
-------
-# crm_attribute --name batch-limit --delete
-
-Multiple attributes match name=batch-limit in crm_config:
-Value: 50 (set=cib-bootstrap-options, id=cib-bootstrap-options-batch-limit)
-Value: 100 (set=custom, id=custom-batch-limit)
-Please choose from one of the matches above and supply the 'id' with --id
--------
-=======
-
-In such cases, follow the on-screen instructions to perform the
-requested action. To determine which value is currently being used by
-the cluster, refer to the 'Rules' chapter of 'Pacemaker Explained'.
-
-[[s-remote-connection]]
-== Connecting from a Remote Machine ==
-indexterm:[Cluster,Remote connection]
-indexterm:[Cluster,Remote administration]
-
-Provided Pacemaker is installed on a machine, it is possible to
-connect to the cluster even if the machine itself is not in the same
-cluster. To do this, one simply sets up a number of environment
-variables and runs the same commands as when working on a cluster
-node.
-
-.Environment Variables Used to Connect to Remote Instances of the CIB
-[width="95%",cols="1m,1,<3",options="header",align="center"]
-|=========================================================
-
-|Environment Variable
-|Default
-|Description
-
-|CIB_user
-|$USER
-|The user to connect as. Needs to be part of the +haclient+ group on
- the target host.
- indexterm:[Environment Variable,CIB_user]
-
-|CIB_passwd
-|
-|The user's password. Read from the command line if unset.
- indexterm:[Environment Variable,CIB_passwd]
-
-|CIB_server
-|localhost
-|The host to contact
- indexterm:[Environment Variable,CIB_server]
-
-|CIB_port
-|
-|The port on which to contact the server; required.
- indexterm:[Environment Variable,CIB_port]
-
-|CIB_encrypted
-|TRUE
-|Whether to encrypt network traffic
- indexterm:[Environment Variable,CIB_encrypted]
-
-|=========================================================
-
-So, if *c001n01* is an active cluster node and is listening on port 1234
-for connections, and *someuser* is a member of the *haclient* group,
-then the following would prompt for *someuser*'s password and return
-the cluster's current configuration:
-
-----
-# export CIB_port=1234; export CIB_server=c001n01; export CIB_user=someuser;
-# cibadmin -Q
-----
-
-For security reasons, the cluster does not listen for remote
-connections by default. If you wish to allow remote access, you need
-to set the +remote-tls-port+ (encrypted) or +remote-clear-port+
-(unencrypted) CIB properties (i.e., those kept in the +cib+ tag, like
-+num_updates+ and +epoch+).
-
-.Extra top-level CIB properties for remote access
-[width="95%",cols="1m,1,<3",options="header",align="center"]
-|=========================================================
-
-|Field
-|Default
-|Description
-
-|remote-tls-port
-|_none_
-|Listen for encrypted remote connections on this port.
- indexterm:[remote-tls-port,Remote Connection Option]
- indexterm:[Remote Connection,Option,remote-tls-port]
-
-|remote-clear-port
-|_none_
-|Listen for plaintext remote connections on this port.
- indexterm:[remote-clear-port,Remote Connection Option]
- indexterm:[Remote Connection,Option,remote-clear-port]
-
-|=========================================================
-
-[IMPORTANT]
-====
-The Pacemaker version on the administration host must be the same or greater
-than the version(s) on the cluster nodes. Otherwise, it may not have the schema
-files necessary to validate the CIB.
-====
diff --git a/doc/Pacemaker_Administration/en-US/Ch-Installing.txt b/doc/Pacemaker_Administration/en-US/Ch-Installing.txt
deleted file mode 100644
index 75aa566c2d..0000000000
--- a/doc/Pacemaker_Administration/en-US/Ch-Installing.txt
+++ /dev/null
@@ -1,105 +0,0 @@
-:compat-mode: legacy
-= Installing Cluster Software =
-
-== Installing the Software ==
-
-Most major Linux distributions have pacemaker packages in their standard
-package repositories, or the software can be built from source code.
-See the http://clusterlabs.org/wiki/Install[Install wiki page] for details.
-
-== Enabling Pacemaker ==
-
-=== Enabling Pacemaker For Corosync version 2 and greater ===
-
-High-level cluster management tools are available that can configure
-corosync for you. This document focuses on the lower-level details
-if you want to configure corosync yourself.
-
-Corosync configuration is normally located in
-+/etc/corosync/corosync.conf+.
-
-.Corosync configuration file for two nodes *myhost1* and *myhost2*
-====
-----
-totem {
-version: 2
-secauth: off
-cluster_name: mycluster
-transport: udpu
-}
-
-nodelist {
- node {
- ring0_addr: myhost1
- nodeid: 1
- }
- node {
- ring0_addr: myhost2
- nodeid: 2
- }
-}
-
-quorum {
-provider: corosync_votequorum
-two_node: 1
-}
-
-logging {
-to_syslog: yes
-}
-----
-====
-
-.Corosync configuration file for three nodes *myhost1*, *myhost2* and *myhost3*
-====
-----
-totem {
-version: 2
-secauth: off
-cluster_name: mycluster
-transport: udpu
-}
-
-nodelist {
- node {
- ring0_addr: myhost1
- nodeid: 1
- }
- node {
- ring0_addr: myhost2
- nodeid: 2
- }
- node {
- ring0_addr: myhost3
- nodeid: 3
- }
-}
-
-quorum {
-provider: corosync_votequorum
-
-}
-
-logging {
-to_syslog: yes
-}
-----
-====
-
-In the above examples, the +totem+ section defines what protocol version and
-options (including encryption) to use,
-footnote:[
-Please consult the Corosync website (http://www.corosync.org/) and
-documentation for details on enabling encryption and peer authentication for
-the cluster.
-]
-and gives the cluster a unique name (+mycluster+ in these examples).
-
-The +node+ section lists the nodes in this cluster.
-
-The +quorum+ section defines how the cluster uses quorum.
-The important thing is that two-node clusters must be handled specially,
-so +two_node: 1+ must be defined for two-node clusters (and only for two-node
-clusters).
-
-The +logging+ section should be self-explanatory.
diff --git a/doc/Pacemaker_Administration/en-US/Ch-Intro.txt b/doc/Pacemaker_Administration/en-US/Ch-Intro.txt
deleted file mode 100644
index 2686733e2c..0000000000
--- a/doc/Pacemaker_Administration/en-US/Ch-Intro.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-:compat-mode: legacy
-= Read-Me-First =
-
-== The Scope of this Document ==
-
-The purpose of this document is to help system administrators learn how to
-manage a Pacemaker cluster.
-
-System administrators may be interested in other parts of the
-https://www.clusterlabs.org/pacemaker/doc/[Pacemaker documentation set],
-such as 'Clusters from Scratch', a step-by-step guide to setting up an
-example cluster, and 'Pacemaker Explained', an exhaustive reference for
-cluster configuration.
-
-Multiple higher-level tools (both command-line and GUI) are available to
-simplify cluster management. However, this document focuses on the lower-level
-command-line tools that come with Pacemaker itself. The concepts are applicable
-to the higher-level tools, though the syntax would differ.
-
-include::../../shared/en-US/pacemaker-intro.txt[]
diff --git a/doc/Pacemaker_Administration/en-US/Ch-Tools.txt b/doc/Pacemaker_Administration/en-US/Ch-Tools.txt
deleted file mode 100644
index 085e0a540c..0000000000
--- a/doc/Pacemaker_Administration/en-US/Ch-Tools.txt
+++ /dev/null
@@ -1,541 +0,0 @@
-:compat-mode: legacy
-= Using Pacemaker Command-Line Tools =
-
-[[s-cmdline-output]]
-== Controlling Command Line Output ==
-Some of the pacemaker command line utilities have been converted to a new output
-system. Among these tools are `crm_mon` and `stonith_admin`. This is an ongoing
-project, and more tools will be converted over time. This system lets you
-control the formatting of output with `--output-as=` and the destination of output
-with `--output-to=`.
-
-The available formats vary by tool, but at least plain text, HTML, and XML are
-supported by all tools. The default format is plain text. The default
-destination is stdout but can be redirected to any file. Some formats support
-command line options for changing the style of the output. For instance:
-
-======
--------
-# crm_mon --help-output
-Usage:
- crm_mon [OPTION?]
-
-Provides a summary of cluster's current state.
-
-Outputs varying levels of detail in a number of different formats.
-
-Output Options:
- --output-as=FORMAT Specify output format as one of: console (default), html, text, xml
- --output-to=DEST Specify file name for output (or "-" for stdout)
- --html-cgi Add text needed to use output in a CGI program
- --html-stylesheet=URI Link to an external CSS stylesheet
- --html-title=TITLE Page title
- --text-fancy Use more highly formatted output
--------
-======
-
-[[s-crm_mon]]
-== Monitor a Cluster with crm_mon ==
-indexterm:[Command-line tool,crm_mon]
-
-The `crm_mon` utility displays the current state of an active cluster. It can
-show the cluster status organized by node or by resource, and can be used in
-either single-shot or dynamically updating mode. It can also display operations
-performed and information about failures.
-
-Using this tool, you can examine the state of the cluster for irregularities,
-and see how it responds when you cause or simulate failures.
-
-See the manual page or the output of `crm_mon --help` for a full description of
-its many options.
-
-.Sample output from crm_mon -1
-======
--------
-Cluster Summary:
- * Stack: corosync
- * Current DC: node2 (version 2.0.0-1) - partition with quorum
- * Last updated: Mon Jan 29 12:18:42 2018
- * Last change: Mon Jan 29 12:18:40 2018 by root via crm_attribute on node3
- * 5 nodes configured
- * 2 resources configured
-
-Node List:
- * Online: [ node1 node2 node3 node4 node5 ]
-
-* Active resources:
- * Fencing (stonith:fence_xvm): Started node1
- * IP (ocf:heartbeat:IPaddr2): Started node2
--------
-======
-
-.Sample output from crm_mon -n -1
-======
--------
-Cluster Summary:
- * Stack: corosync
- * Current DC: node2 (version 2.0.0-1) - partition with quorum
- * Last updated: Mon Jan 29 12:21:48 2018
- * Last change: Mon Jan 29 12:18:40 2018 by root via crm_attribute on node3
- * 5 nodes configured
- * 2 resources configured
-
-* Node List:
- * Node node1: online
- * Fencing (stonith:fence_xvm): Started
- * Node node2: online
- * IP (ocf:heartbeat:IPaddr2): Started
- * Node node3: online
- * Node node4: online
- * Node node5: online
--------
-======
-
-As mentioned in an earlier chapter, the DC is the node is where decisions are
-made. The cluster elects a node to be DC as needed. The only significance of
-the choice of DC to an administrator is the fact that its logs will have the
-most information about why decisions were made.
-
-[[s-crm_mon-css]]
-=== Styling crm_mon output ===
-indexterm:[Command-line tool,crm_mon,css]
-
-Various parts of `crm_mon`'s HTML output have a CSS class associated with them.
-Not everything does, but some of the most interesting portions do. In the following
-example, the status of each node has an "online" class and the details of each
-resource have an "rsc-ok" class.
-
-======
--------
-<h2>Node List</h2>
-<ul>
-<li>
-<span>Node: cluster01</span><span class="online"> online</span>
-</li>
-<li><ul><li><span class="rsc-ok">ping (ocf::pacemaker:ping): Started</span></li></ul></li>
-<li>
-<span>Node: cluster02</span><span class="online"> online</span>
-</li>
-<li><ul><li><span class="rsc-ok">ping (ocf::pacemaker:ping): Started</span></li></ul></li>
-</ul>
--------
-======
-
-By default, a stylesheet for styling these classes is included in the head of
-the HTML output. The relevant portions of this stylesheet that would be used
-in the above example is:
-
-======
--------
-<style>
-.online { color: green }
-.rsc-ok { color: green }
-</style>
--------
-======
-
-If you want to override some or all of the styling, simply create your own
-stylesheet, place it on a web server, and pass `--html-stylesheet=<URL>`
-to `crm_mon`. The link is added after the default stylesheet, so your
-changes take precedence. You don't need to duplicate the entire default.
-Only include what you want to change.
-
-[[s-cibadmin]]
-== Edit the CIB XML with cibadmin ==
-indexterm:[Command-line tool,cibadmin]
-
-The most flexible tool for modifying the configuration is Pacemaker's
-`cibadmin` command. With `cibadmin`, you can query, add, remove, update
-or replace any part of the configuration. All changes take effect immediately,
-so there is no need to perform a reload-like operation.
-
-The simplest way of using `cibadmin` is to use it to save the current
-configuration to a temporary file, edit that file with your favorite
-text or XML editor, and then upload the revised configuration.
-
-.Safely using an editor to modify the cluster configuration
-======
---------
-# cibadmin --query > tmp.xml
-# vi tmp.xml
-# cibadmin --replace --xml-file tmp.xml
---------
-======
-
-Some of the better XML editors can make use of a RELAX NG schema to
-help make sure any changes you make are valid. The schema describing
-the configuration can be found in +pacemaker.rng+, which may be
-deployed in a location such as +/usr/share/pacemaker+ depending on your
-operating system distribution and how you installed the software.
-
-If you want to modify just one section of the configuration, you can
-query and replace just that section to avoid modifying any others.
-
-.Safely using an editor to modify only the resources section
-======
---------
-# cibadmin --query --scope resources > tmp.xml
-# vi tmp.xml
-# cibadmin --replace --scope resources --xml-file tmp.xml
---------
-======
-
-To quickly delete a part of the configuration, identify the object you wish to
-delete by XML tag and id. For example, you might search the CIB for all
-STONITH-related configuration:
-
-.Searching for STONITH-related configuration items
-======
-----
-# cibadmin --query | grep stonith
- <nvpair id="cib-bootstrap-options-stonith-action" name="stonith-action" value="reboot"/>
- <nvpair id="cib-bootstrap-options-stonith-enabled" name="stonith-enabled" value="1"/>
- <primitive id="child_DoFencing" class="stonith" type="external/vmware">
- <lrm_resource id="child_DoFencing:0" type="external/vmware" class="stonith">
- <lrm_resource id="child_DoFencing:0" type="external/vmware" class="stonith">
- <lrm_resource id="child_DoFencing:1" type="external/vmware" class="stonith">
- <lrm_resource id="child_DoFencing:0" type="external/vmware" class="stonith">
- <lrm_resource id="child_DoFencing:2" type="external/vmware" class="stonith">
- <lrm_resource id="child_DoFencing:0" type="external/vmware" class="stonith">
- <lrm_resource id="child_DoFencing:3" type="external/vmware" class="stonith">
-----
-======
-
-If you wanted to delete the +primitive+ tag with id +child_DoFencing+,
-you would run:
-
-----
-# cibadmin --delete --xml-text '<primitive id="child_DoFencing"/>'
-----
-
-See the cibadmin man page for more options.
-
-[IMPORTANT]
-====
-Never edit the live +cib.xml+ file directly. Pacemaker will detect such changes
-and refuse to use the configuration.
-====
-
-
-[[s-crm_shadow]]
-== Batch Configuration Changes with crm_shadow ==
-indexterm:[Command-line tool,crm_shadow]
-
-Often, it is desirable to preview the effects of a series of configuration
-changes before updating the live configuration all at once. For this purpose,
-`crm_shadow` creates a "shadow" copy of the configuration and arranges for all
-the command-line tools to use it.
-
-To begin, simply invoke `crm_shadow --create` with a name of your choice,
-and follow the simple on-screen instructions. Shadow copies are identified with
-a name to make it possible to have more than one.
-
-[WARNING]
-====
-Read this section and the on-screen instructions carefully; failure to do so could
-result in destroying the cluster's active configuration!
-====
-
-.Creating and displaying the active sandbox
-======
-----
-# crm_shadow --create test
-Setting up shadow instance
-Type Ctrl-D to exit the crm_shadow shell
-shadow[test]:
-shadow[test] # crm_shadow --which
-test
-----
-======
-
-From this point on, all cluster commands will automatically use the shadow copy
-instead of talking to the cluster's active configuration. Once you have
-finished experimenting, you can either make the changes active via the
-`--commit` option, or discard them using the `--delete` option. Again, be sure
-to follow the on-screen instructions carefully!
-
-For a full list of `crm_shadow` options and commands, invoke it with the
-`--help` option.
-
-.Use sandbox to make multiple changes all at once, discard them, and verify real configuration is untouched
-======
-----
- shadow[test] # crm_failcount -r rsc_c001n01 -G
- scope=status name=fail-count-rsc_c001n01 value=0
- shadow[test] # crm_standby --node c001n02 -v on
- shadow[test] # crm_standby --node c001n02 -G
- scope=nodes name=standby value=on
-
- shadow[test] # cibadmin --erase --force
- shadow[test] # cibadmin --query
- <cib crm_feature_set="3.0.14" validate-with="pacemaker-3.0" epoch="112" num_updates="2" admin_epoch="0" cib-last-written="Mon Jan 8 23:26:47 2018" update-origin="rhel7-1" update-client="crm_node" update-user="root" have-quorum="1" dc-uuid="1">
- <configuration>
- <crm_config/>
- <nodes/>
- <resources/>
- <constraints/>
- </configuration>
- <status/>
- </cib>
- shadow[test] # crm_shadow --delete test --force
- Now type Ctrl-D to exit the crm_shadow shell
- shadow[test] # exit
- # crm_shadow --which
- No active shadow configuration defined
- # cibadmin -Q
- <cib crm_feature_set="3.0.14" validate-with="pacemaker-3.0" epoch="110" num_updates="2" admin_epoch="0" cib-last-written="Mon Jan 8 23:26:47 2018" update-origin="rhel7-1" update-client="crm_node" update-user="root" have-quorum="1">
- <configuration>
- <crm_config>
- <cluster_property_set id="cib-bootstrap-options">
- <nvpair id="cib-bootstrap-1" name="stonith-enabled" value="1"/>
- <nvpair id="cib-bootstrap-2" name="pe-input-series-max" value="30000"/>
-----
-======
-
-See the next section, <<s-crm_simulate>>, for how to test your changes before
-committing them to the live cluster.
-
-
-[[s-crm_simulate]]
-== Simulate Cluster Activity with crm_simulate ==
-indexterm:[Command-line tool,crm_simulate]
-
-The command-line tool `crm_simulate` shows the results of the same logic
-the cluster itself uses to respond to a particular cluster configuration and
-status.
-
-As always, the man page is the primary documentation, and should be consulted
-for further details. This section aims for a better conceptual explanation and
-practical examples.
-
-=== Replaying cluster decision-making logic ===
-
-At any given time, one node in a Pacemaker cluster will be elected DC, and that
-node will run Pacemaker's scheduler to make decisions.
-
-Each time decisions need to be made (a "transition"), the DC will have log
-messages like "Calculated transition ... saving inputs in ..." with a file
-name. You can grab the named file and replay the cluster logic to see why
-particular decisions were made. The file contains the live cluster
-configuration at that moment, so you can also look at it directly to see the
-value of node attributes, etc., at that time.
-
-The simplest usage is (replacing $FILENAME with the actual file name):
-
-.Simulate cluster response to a given CIB
-====
-----
-crm_simulate --simulate --xml-file $FILENAME
-----
-====
-
-That will show the cluster state when the process started, the actions that
-need to be taken ("Transition Summary"), and the resulting cluster state if the
-actions succeed. Most actions will have a brief description of why they were
-required.
-
-The transition inputs may be compressed. `crm_simulate` can handle these
-compressed files directly, though if you want to edit the file, you'll need to
-uncompress it first.
-
-You can do the same simulation for the live cluster configuration at the
-current moment. This is useful mainly when using `crm_shadow` to create a
-sandbox version of the CIB; the `--live-check` option will use the shadow CIB
-if one is in effect.
-
-.Simulate cluster response to current live CIB or shadow CIB
-====
-----
-crm_simulate --simulate --live-check
-----
-====
-
-
-=== Why decisions were made ===
-
-To get further insight into the "why", it gets user-unfriendly very quickly. If
-you add the `--show-scores` option, you will also see all the scores that went
-into the decision-making. The node with the highest cumulative score for a
-resource will run it. You can look for +-INFINITY+ scores in particular to see
-where complete bans came into effect.
-
-You can also add `-VVVV` to get more detailed messages about what's happening
-under the hood. You can add up to two more V's even, but that's usually useful
-only if you're a masochist or tracing through the source code.
-
-=== Visualizing the action sequence ===
-
-Another handy feature is the ability to generate a visual graph of the actions
-needed, using the `--dot-file` option. This relies on the separate Graphviz
-footnote:[Graph visualization software. See http://www.graphviz.org/ for details.]
-project.
-
-.Generate a visual graph of cluster actions from a saved CIB
-====
-----
-crm_simulate --simulate --xml-file $FILENAME --dot-file $FILENAME.dot
-dot $FILENAME.dot -Tsvg > $FILENAME.svg
-----
-====
-
-+$FILENAME.dot+ will contain a GraphViz representation of the cluster's
-response to your changes, including all actions with their ordering
-dependencies.
-
-+$FILENAME.svg+ will be the same information in a standard graphical format
-that you can view in your browser or other app of choice. You could, of course,
-use other `dot` options to generate other formats.
-
-How to interpret the graphical output:
-
- * Bubbles indicate actions, and arrows indicate ordering dependencies
- * Resource actions have text of the form
- pass:[<replaceable>resource</replaceable>]_pass:[<replaceable>action</replaceable>]_pass:[<replaceable>interval</replaceable>]
- pass:[<replaceable>node</replaceable>] indicating that the specified action
- will be executed for the specified resource on the specified node, once if
- interval is 0 or at specified recurring milliseconds interval otherwise
- * Actions with black text will be sent to the executor (that is, the
- appropriate agent will be invoked)
- * Actions with orange text are "pseudo" actions that the cluster uses
- internally for ordering but require no real activity
- * Actions with a solid green border are part of the transition (that is, the
- cluster will attempt to execute them in the given order -- though a
- transition can be interrupted by action failure or new events)
- * Dashed arrows indicate dependencies that are not present in the transition
- graph
- * Actions with a dashed border will not be executed. If the dashed border is
- blue, the cluster does not feel the action needs to be executed. If the
- dashed border is red, the cluster would like to execute the action but
- cannot. Any actions depending on an action with a dashed border will not be
- able to execute.
- * Loops should not happen, and should be reported as a bug if found.
-
-.Small Cluster Transition
-====
-image::images/Policy-Engine-small.png["An example transition graph as represented by Graphviz",width="1161",height="325",align="center"]
-====
-
-In the above example, it appears that a new node, *pcmk-2*, has come online and
-that the cluster is checking to make sure *rsc1*, *rsc2* and *rsc3* are not
-already running there (indicated by the *rscN_monitor_0* entries). Once it did
-that, and assuming the resources were not active there, it would have liked to
-stop *rsc1* and *rsc2* on *pcmk-1* and move them to *pcmk-2*. However, there
-appears to be some problem and the cluster cannot or is not permitted to
-perform the stop actions which implies it also cannot perform the start
-actions. For some reason, the cluster does not want to start *rsc3* anywhere.
-
-.Complex Cluster Transition
-====
-image::images/Policy-Engine-big.png["Complex transition graph that you're not expected to be able to read",width="1455",height="1945",align="center"]
-====
-
-=== What-if scenarios ===
-
-You can make changes to the saved or shadow CIB and simulate it again, to see
-how Pacemaker would react differently. You can edit the XML by hand, use
-command-line tools such as `cibadmin` with either a shadow CIB or the
-+CIB_file+ environment variable set to the filename, or use higher-level tool
-support (see the man pages of the specific tool you're using for how to perform
-actions on a saved CIB file rather than the live CIB).
-
-You can also inject node failures and/or action failures into the simulation;
-see the `crm_simulate` man page for more details.
-
-This capability is useful when using a shadow CIB to edit the configuration.
-Before committing the changes to the live cluster with `crm_shadow --commit`,
-you can use `crm_simulate` to see how the cluster will react to the changes.
-
-[[s-attrd_updater]]
-[[s-crm_attribute]]
-== Manage Node Attributes, Cluster Options and Defaults with crm_attribute and attrd_updater ==
-indexterm:[Command-line tool,attrd_updater]
-indexterm:[Command-line tool,crm_attribute]
-
-`crm_attribute` and `attrd_updater` are confusingly similar tools with subtle
-differences.
-
-`attrd_updater` can query and update node attributes. `crm_attribute` can query
-and update not only node attributes, but also cluster options,
-resource defaults, and operation defaults.
-
-To understand the differences, it helps to understand the various types of node
-attribute.
-
-.Types of Node Attributes
-[width="95%",cols="1,1,1,1,1,1",options="header",align="center"]
-|====
-
-|Type
-|Recorded in CIB?
-|Recorded in attribute manager memory?
-|Survive full cluster restart?
-|Manageable by crm_attribute?
-|Manageable by attrd_updater?
-
-|permanent
-|yes
-|no
-|yes
-|yes
-|no
-
-|transient
-|yes
-|yes
-|no
-|yes
-|yes
-
-|private
-|no
-|yes
-|no
-|no
-|yes
-
-|====
-
-As you can see from the table above, `crm_attribute` can manage permanent and
-transient node attributes, while `attrd_updater` can manage transient and
-private node attributes.
-
-The difference between the two tools lies mainly in 'how' they update node
-attributes: `attrd_updater` always contacts the Pacemaker attribute manager
-directly, while `crm_attribute` will contact the attribute manager only for
-transient node attributes, and will instead modify the CIB directly for
-permanent node attributes (and for transient node attributes when unable to
-contact the attribute manager).
-
-By contacting the attribute manager directly, `attrd_updater` can change
-an attribute's "dampening" (whether changes are immediately flushed to the CIB
-or after a specified amount of time, to minimize disk writes for frequent
-changes), set private node attributes (which are never written to the CIB), and
-set attributes for nodes that don't yet exist.
-
-By modifying the CIB directly, `crm_attribute` can set permanent node
-attributes (which are only in the CIB and not managed by the attribute
-manager), and can be used with saved CIB files and shadow CIBs.
-
-However a transient node attribute is set, it is synchronized between the CIB
-and the attribute manager, on all nodes.
-
-
-== Other Commonly Used Tools ==
-
-Other command-line tools include:
-indexterm:[Command-line tool,crm_failcount]
-indexterm:[Command-line tool,crm_node]
-indexterm:[Command-line tool,crm_report]
-indexterm:[Command-line tool,crm_standby]
-indexterm:[Command-line tool,crm_verify]
-indexterm:[Command-line tool,stonith_admin]
-
-* `crm_failcount`: query or delete resource fail counts
-* `crm_node`: manage cluster nodes
-* `crm_report`: generate a detailed cluster report for bug submissions
-* `crm_resource`: manage cluster resources
-* `crm_standby`: manage standby status of nodes
-* `crm_verify`: validate a CIB
-* `stonith_admin`: manage fencing devices
-
-See the manual pages for details.
diff --git a/doc/Pacemaker_Administration/en-US/Ch-Troubleshooting.txt b/doc/Pacemaker_Administration/en-US/Ch-Troubleshooting.txt
deleted file mode 100644
index bb3f0c7c2b..0000000000
--- a/doc/Pacemaker_Administration/en-US/Ch-Troubleshooting.txt
+++ /dev/null
@@ -1,64 +0,0 @@
-:compat-mode: legacy
-= Troubleshooting Cluster Problems =
-
-== Logging ==
-
-Pacemaker by default logs messages of notice severity and higher to the system
-log, and messages of info severity and higher to the detail log, which by
-default is /var/log/pacemaker/pacemaker.log.
-
-Logging options can be controlled via environment variables at Pacemaker
-start-up. Where these are set varies by operating system (often
-+/etc/sysconfig/pacemaker+ or +/etc/default/pacemaker+).
-
-Because cluster problems are often highly complex, involving multiple machines,
-cluster daemons, and managed services, Pacemaker logs rather verbosely to
-provide as much context as possible. It is an ongoing priority to make these
-logs more user-friendly, but by necessity there is a lot of obscure, low-level
-information that can make them difficult to follow.
-
-The default log rotation configuration shipped with Pacemaker (typically
-installed in /etc/logrotate.d/pacemaker) rotates the log when it reaches 100MB
-in size, or weekly, whichever comes first.
-
-If you configure debug or (Heaven forbid) trace-level logging, the logs can
-grow enormous quite quickly. Because rotated logs are by default named with the
-year, month, and day only, this can cause name collisions if your logs exceed
-100MB in a single day. You can add +dateformat -%Y%m%d-%H+ to the rotation
-configuration to avoid this.
-
-== Transitions ==
-
-A key concept in understanding how a Pacemaker cluster functions is a
-'transition'. A transition is a set of actions that need to be taken to bring
-the cluster from its current state to the desired state (as expressed by the
-configuration).
-
-Whenever a relevant event happens (a node joining or leaving the cluster,
-a resource failing, etc.), the controller will ask the scheduler to recalculate
-the status of the cluster, which generates a new transition. The controller
-then performs the actions in the transition in the proper order.
-
-Each transition can be identified in the logs by a line like:
-
-----
-notice: Calculated transition 19, saving inputs in /var/lib/pacemaker/pengine/pe-input-1463.bz2
-----
-
-The file listed as the "inputs" is a snapshot of the cluster configuration and
-state at that moment (the CIB). This file can help determine why particular
-actions were scheduled. The `crm_simulate` command, described in
-<<s-crm_simulate>>, can be used to replay the file.
-
-== Further Information About Troubleshooting ==
-
-Andrew Beekhof wrote a series of articles about troubleshooting in his blog,
- http://blog.clusterlabs.org/[The Cluster Guy]:
-
-* http://blog.clusterlabs.org/blog/2013/debugging-pacemaker[Debugging Pacemaker]
-* http://blog.clusterlabs.org/blog/2013/debugging-pengine[Debugging the Policy Engine]
-* http://blog.clusterlabs.org/blog/2013/pacemaker-logging[Pacemaker Logging]
-
-The articles were written for an earlier version of Pacemaker, so many of the
-specific names and log messages to look for have changed, but the concepts are
-still valid.
diff --git a/doc/Pacemaker_Administration/en-US/Ch-Upgrading.txt b/doc/Pacemaker_Administration/en-US/Ch-Upgrading.txt
deleted file mode 100644
index 5f8f61a54a..0000000000
--- a/doc/Pacemaker_Administration/en-US/Ch-Upgrading.txt
+++ /dev/null
@@ -1,466 +0,0 @@
-:compat-mode: legacy
-= Upgrading a Pacemaker Cluster =
-
-== Pacemaker Versioning ==
-
-Pacemaker has an overall release version, plus separate version numbers for
-certain internal components.
-
-* *Pacemaker release version:* This version consists of three numbers
- (_x.y.z_).
-+
-The major version number (the _x_ in _x.y.z_) increases when at least some
-rolling upgrades are not possible from the previous major version. For example,
-a rolling upgrade from 1.0.8 to 1.1.15 should always be supported, but a
-rolling upgrade from 1.0.8 to 2.0.0 may not be possible.
-+
-The minor version (the _y_ in _x.y.z_) increases when there are significant
-changes in cluster default behavior, tool behavior, and/or the API interface
-(for software that utilizes Pacemaker libraries). The main benefit is to alert
-you to pay closer attention to the release notes, to see if you might be
-affected.
-+
-The release counter (the _z_ in _x.y.z_) is increased with all public releases
-of Pacemaker, which typically include both bug fixes and new features.
-
-* *CRM feature set:* This version number applies to the communication between
- full cluster nodes, and is used to avoid problems in mixed-version clusters.
-+
-The major version number increases when nodes with different versions would not
-work (rolling upgrades are not allowed). The minor version number increases
-when mixed-version clusters are allowed only during rolling upgrades. The
-minor-minor version number is ignored, but allows resource agents to detect
-cluster support for various features. footnote:[
-Before CRM feature set 3.1.0 (Pacemaker 2.0.0), the minor-minor
-version number was treated the same as the minor version.
-]
-+
-Pacemaker ensures that the longest-running node is the cluster's DC. This
-ensures new features are not enabled until all nodes are upgraded to support
-them.
-
-* *Pacemaker Remote protocol version:* This version applies to communication
- between a Pacemaker Remote node and the cluster. It increases when an older
- cluster node would have problems hosting the connection to a newer
- Pacemaker Remote node. To avoid these problems, Pacemaker Remote nodes will
- accept connections only from cluster nodes with the same or newer
- Pacemaker Remote protocol version.
-+
-Unlike with CRM feature set differences between full cluster nodes,
-mixed Pacemaker Remote protocol versions between Pacemaker Remote nodes and
-full cluster nodes are fine, as long as the Pacemaker Remote nodes have the
-older version. This can be useful, for example, to host a legacy application in
-an older operating system version used as a Pacemaker Remote node.
-
-* *XML schema version:* Pacemaker’s configuration syntax — what's allowed in
- the Configuration Information Base (CIB) — has its own version. This allows
- the configuration syntax to evolve over time while still allowing clusters
- with older configurations to work without change.
-
-== Upgrading Cluster Software ==
-
-There are three approaches to upgrading a cluster, each with advantages and
-disadvantages.
-
-.Upgrade Methods
-[width="95%",cols="s,6*",options="header",align="center"]
-|=========================================================
-
-|Method
-|Available between all versions
-|Can be used with Pacemaker Remote nodes
-|Service outage during upgrade
-|Service recovery during upgrade
-|Exercises failover logic
-|Allows change of messaging layer
-indexterm:[Cluster,switching between stacks]
-indexterm:[Changing cluster stack]
-footnote:[Currently, Corosync version 2 and greater is the only supported
-cluster stack, but other stacks have been supported by past versions, and may
-be supported by future versions.]
-
-|Complete cluster shutdown
-indexterm:[upgrade,shutdown]
-indexterm:[shutdown upgrade]
-|yes
-|yes
-|always
-|N/A
-|no
-|yes
-
-|Rolling (node by node)
-indexterm:[upgrade,rolling]
-indexterm:[rolling upgrade]
-|no
-|yes
-|always
-footnote:[Any active resources will be moved off the node being upgraded,
-so there will be at least a brief outage unless all resources can be
-migrated "live".]
-|yes
-|yes
-|no
-
-|Detach and reattach
-indexterm:[upgrade,reattach]
-indexterm:[reattach upgrade]
-|yes
-|no
-|only due to failure
-|no
-|no
-|yes
-
-|=========================================================
-
-=== Complete Cluster Shutdown ===
-
-In this scenario, one shuts down all cluster nodes and resources,
-then upgrades all the nodes before restarting the cluster.
-
-. On each node:
-.. Shutdown the cluster software (pacemaker and the messaging layer).
-.. Upgrade the Pacemaker software. This may also include upgrading the
- messaging layer and/or the underlying operating system.
-.. Check the configuration with the `crm_verify` tool.
-. On each node:
-.. Start the cluster software.
- Currently, only Corosync version 2 and greater is supported as the cluster
- layer, but if another stack is supported in the future, the stack does not
- need to be the same one before the upgrade.
-
-One variation of this approach is to build a new cluster on new hosts.
-This allows the new version to be tested beforehand, and minimizes downtime by
-having the new nodes ready to be placed in production as soon as the old nodes
-are shut down.
-
-=== Rolling (node by node) ===
-
-In this scenario, each node is removed from the cluster, upgraded, and then
-brought back online, until all nodes are running the newest version.
-
-Special considerations when planning a rolling upgrade:
-
-* If you plan to upgrade other cluster software -- such as the messaging layer --
- at the same time, consult that software's documentation for its compatibility
- with a rolling upgrade.
-
-* If the major version number is changing in the Pacemaker version you are
- upgrading to, a rolling upgrade may not be possible. Read the new version's
- release notes (as well the information here) for what limitations may exist.
-
-* If the CRM feature set is changing in the Pacemaker version you are upgrading
- to, you should run a mixed-version cluster only during a small rolling
- upgrade window. If one of the older nodes drops out of the cluster for any
- reason, it will not be able to rejoin until it is upgraded.
-
-* If the Pacemaker Remote protocol version is changing, all cluster nodes
- should be upgraded before upgrading any Pacemaker Remote nodes.
-
-See the ClusterLabs wiki's
-http://clusterlabs.org/wiki/ReleaseCalendar[Release Calendar] to figure out
-whether the CRM feature set and/or Pacemaker Remote protocol version changed
-between the the Pacemaker release versions in your rolling upgrade.
-
-To perform a rolling upgrade, on each node in turn:
-
-. Put the node into standby mode, and wait for any active resources
- to be moved cleanly to another node. (This step is optional, but
- allows you to deal with any resource issues before the upgrade.)
-. Shutdown the cluster software (pacemaker and the messaging layer) on the node.
-. Upgrade the Pacemaker software. This may also include upgrading the
- messaging layer and/or the underlying operating system.
-. If this is the first node to be upgraded, check the configuration
- with the `crm_verify` tool.
-. Start the messaging layer.
- This must be the same messaging layer (currently only Corosync version 2 and
- greater is supported) that the rest of the cluster is using.
-
-[NOTE]
-====
-Even if a rolling upgrade from the current version of the cluster to the newest
-version is not directly possible, it may be possible to perform a rolling
-upgrade in multiple steps, by upgrading to an intermediate version first.
-
-.Version Compatibility Table
-[width="95%",cols="2*",options="header",align="center"]
-|=========================================================
-
-|Version being Installed
-|Oldest Compatible Version
-
-|Pacemaker 2.y.z
-|Pacemaker 1.1.11
-footnote:[Rolling upgrades from Pacemaker 1.1.z to 2.y.z are possible only if
-the cluster uses corosync version 2 or greater as its messaging layer, and the
-Cluster Information Base (CIB) uses schema 1.0 or higher in its validate-with
-property.]
-
-|Pacemaker 1.y.z
-|Pacemaker 1.0.0
-
-|Pacemaker 0.7.z
-|Pacemaker 0.6.z
-
-|=========================================================
-====
-
-=== Detach and Reattach ===
-
-The reattach method is a variant of a complete cluster shutdown, where the
-resources are left active and get re-detected when the cluster is restarted.
-
-This method may not be used if the cluster contains any Pacemaker Remote nodes.
-
-. Tell the cluster to stop managing services. This is required to allow the
- services to remain active after the cluster shuts down.
-+
-----
-# crm_attribute --name maintenance-mode --update true
-----
-
-. On each node, shutdown the cluster software (pacemaker and the messaging
- layer), and upgrade the Pacemaker software. This may also include upgrading
- the messaging layer. While the underlying operating system may be upgraded
- at the same time, that will be more likely to cause outages in the detached
- services (certainly, if a reboot is required).
-. Check the configuration with the `crm_verify` tool.
-. On each node, start the cluster software.
- Currently, only Corosync version 2 and greater is supported as the cluster
- layer, but if another stack is supported in the future, the stack does not
- need to be the same one before the upgrade.
-. Verify that the cluster re-detected all resources correctly.
-. Allow the cluster to resume managing resources again:
-+
-----
-# crm_attribute --name maintenance-mode --delete
-----
-
-[NOTE]
-====
-While the goal of the detach-and-reattach method is to avoid disturbing running
-services, resources may still move after the upgrade if any resource's location
-is governed by a rule based on transient node attributes. Transient node
-attributes are erased when the node leaves the cluster. A common example is
-using the *ocf:pacemaker:ping* resource to set a node attribute used to locate
-other resources.
-====
-
-== Upgrading the Configuration ==
-
-indexterm:[upgrade,Configuration]
-indexterm:[Configuration,upgrading]
-
-The CIB schema version can change from one Pacemaker version to another.
-
-After cluster software is upgraded, the cluster will continue to use
-the older schema version that it was previously using. This can be useful, for
-example, when administrators have written tools that modify the configuration,
-and are based on the older syntax.
-footnote:[As of Pacemaker 2.0.0, only schema versions pacemaker-1.0 and higher
-are supported (excluding pacemaker-1.1, which was an experimental schema
-now known as pacemaker-next).]
-
-However, when using an older syntax, new features may be unavailable, and there
-is a performance impact, since the cluster must do a non-persistent
-configuration upgrade before each transition. So while using the old syntax is
-possible, it is not advisable to continue using it indefinitely.
-
-Even if you wish to continue using the old syntax, it is a good idea to
-follow the upgrade procedure outlined below, except for the last step, to ensure
-that the new software has no problems with your existing configuration (since it
-will perform much the same task internally).
-
-If you are brave, it is sufficient simply to run `cibadmin --upgrade`.
-
-A more cautious approach would proceed like this:
-
-. Create a shadow copy of the configuration. The later commands will automatically
- operate on this copy, rather than the live configuration.
-+
------
-# crm_shadow --create shadow
------
-. Verify the configuration is valid with the new software (which may be
- stricter about syntax mistakes, or may have dropped support for deprecated
- features):
-indexterm:[Configuration,verify]
-indexterm:[verify,Configuration]
-+
------
-# crm_verify --live-check
------
-. Fix any errors or warnings.
-. Perform the upgrade:
-+
------
-# cibadmin --upgrade
------
-. If this step fails, there are three main possibilities:
-.. The configuration was not valid to start with (did you do steps 2 and 3?).
-.. The transformation failed - http://bugs.clusterlabs.org/[report a bug] or
- mailto:users@clusterlabs.org?subject=Transformation%20failed%20during%20upgrade[email the project].
-.. The transformation was successful but produced an invalid result.
-+
-If the result of the transformation is invalid, you may see a number of errors
-from the validation library. If these are not helpful, visit the
-http://clusterlabs.org/wiki/Validation_FAQ[Validation FAQ wiki page] and/or try
-the manual upgrade procedure described below.
-+
-. Check the changes:
-+
------
-# crm_shadow --diff
------
-+
-If at this point there is anything about the upgrade that you wish to fine-tune
-(for example, to change some of the automatic IDs), now is the time to do so:
-+
------
-# crm_shadow --edit
------
-+
-This will open the configuration in your favorite editor (whichever is
-specified by the standard *$EDITOR* environment variable).
-+
-. Preview how the cluster will react:
-+
-------
-# crm_simulate --live-check --save-dotfile shadow.dot -S
-# dot -Tsvg shadow.dot -o shadow.svg
-------
-+
-You can then view shadow.svg with any compatible image viewer or web browser.
-Verify that either no resource actions will occur or that you are
-happy with any that are scheduled. If the output contains actions you
-do not expect (possibly due to changes to the score calculations), you
-may need to make further manual changes. See <<s-crm_simulate>> for further
-details on how to interpret the output of `crm_simulate` and `dot`.
-+
-. Upload the changes:
-+
------
-# crm_shadow --commit shadow --force
------
-+
-In the unlikely event this step fails, please report a bug.
-
-[NOTE]
-====
-indexterm:[Configuration,upgrade manually]
-It is also possible to perform the configuration upgrade steps manually:
-
-. Locate the +upgrade*.xsl+ conversion scripts provided with the source code. These will often
- be installed in a location such as +/usr/share/pacemaker+, or may be obtained from
- the https://github.com/ClusterLabs/pacemaker/tree/master/xml[source repository].
-
-. Run the conversion scripts that apply to your older version, for example:
- indexterm:[XML,convert]
-+
------
-# xsltproc /path/to/upgrade06.xsl config06.xml > config10.xml
------
-+
-. Locate the +pacemaker.rng+ script (from the same location as the xsl files).
-. Check the XML validity: indexterm:[validate configuration]indexterm:[Configuration,validate XML]
-+
-----
-# xmllint --relaxng /path/to/pacemaker.rng config10.xml
-----
-
-The advantage of this method is that it can be performed without the
-cluster running, and any validation errors are often more informative.
-====
-
-== What Changed in 2.0 ==
-
-The main goal of the 2.0 release was to remove support for deprecated syntax,
-along with some small changes in default configuration behavior and tool
-behavior. Highlights:
-
-* Only Corosync version 2 and greater is now supported as the underlying
- cluster layer. Support for Heartbeat and Corosync 1 (including CMAN) is
- removed.
-
-* The Pacemaker detail log file is now stored in
- /var/log/pacemaker/pacemaker.log by default.
-
-* The record-pending cluster property now defaults to true, which
- allows status tools such as crm_mon to show operations that are in
- progress.
-
-* Support for a number of deprecated build options, environment variables,
- and configuration settings has been removed.
-
-* The +master+ tag has been deprecated in favor of using a +clone+ tag with the
- new +promotable+ meta-attribute set to +true+. "Master/slave" clone resources
- are now referred to as "promotable" clone resources, though it will take
- longer for the full terminology change to be completed.
-
-* The public API for Pacemaker libraries that software applications can use
- has changed significantly.
-
-For a detailed list of changes, see the release notes and the
-https://wiki.clusterlabs.org/wiki/Pacemaker_2.0_Changes[Pacemaker 2.0 Changes]
-page on the ClusterLabs wiki.
-
-== What Changed in 1.0 ==
-
-=== New ===
-
-* Failure timeouts.
-* New section for resource and operation defaults.
-* Tool for making offline configuration changes.
-* +Rules, instance_attributes, meta_attributes+ and sets of operations can be defined once and referenced in multiple places.
-* The CIB now accepts XPath-based create/modify/delete operations. See the pass:[<command>cibadmin</command>] help text.
-* Multi-dimensional colocation and ordering constraints.
-* The ability to connect to the CIB from non-cluster machines.
-* Allow recurring actions to be triggered at known times.
-
-
-=== Changed ===
-
-* Syntax
-** All resource and cluster options now use dashes (-) instead of underscores (_)
-** +master_slave+ was renamed to +master+
-** The +attributes+ container tag was removed
-** The operation field +pre-req+ has been renamed +requires+
-** All operations must have an +interval+, +start+/+stop+ must have it set to zero
-* The +stonith-enabled+ option now defaults to true.
-* The cluster will refuse to start resources if +stonith-enabled+ is true (or unset) and no STONITH resources have been defined
-* The attributes of colocation and ordering constraints were renamed for clarity.
-* +resource-failure-stickiness+ has been replaced by +migration-threshold+.
-* The parameters for command-line tools have been made consistent
-* Switched to 'RelaxNG' schema validation and 'libxml2' parser
-** id fields are now XML IDs which have the following limitations:
-*** id's cannot contain colons (:)
-*** id's cannot begin with a number
-*** id's must be globally unique (not just unique for that tag)
-** Some fields (such as those in constraints that refer to resources) are IDREFs.
-+
-This means that they must reference existing resources or objects in
-order for the configuration to be valid. Removing an object which is
-referenced elsewhere will therefore fail.
-+
-** The CIB representation, from which a MD5 digest is calculated to verify CIBs on the nodes, has changed.
-+
-This means that every CIB update will require a full refresh on any
-upgraded nodes until the cluster is fully upgraded to 1.0. This will
-result in significant performance degradation and it is therefore
-highly inadvisable to run a mixed 1.0/0.6 cluster for any longer than
-absolutely necessary.
-+
-* Ping node information no longer needs to be added to _ha.cf_.
-+
-Simply include the lists of hosts in your ping resource(s).
-
-
-=== Removed ===
-
-
-* Syntax
-** It is no longer possible to set resource meta options as top-level
- attributes. Use meta attributes instead.
-** Resource and operation defaults are no longer read from
- +crm_config+.
diff --git a/doc/Pacemaker_Administration/en-US/Pacemaker_Administration.ent b/doc/Pacemaker_Administration/en-US/Pacemaker_Administration.ent
deleted file mode 100644
index 5e1d8447fc..0000000000
--- a/doc/Pacemaker_Administration/en-US/Pacemaker_Administration.ent
+++ /dev/null
@@ -1,4 +0,0 @@
-<!ENTITY PRODUCT "Pacemaker Administration">
-<!ENTITY BOOKID "Pacemaker_Administration">
-<!ENTITY YEAR "2009-2019">
-<!ENTITY HOLDER "The Pacemaker project contributors">
diff --git a/doc/Pacemaker_Administration/en-US/Pacemaker_Administration.xml b/doc/Pacemaker_Administration/en-US/Pacemaker_Administration.xml
deleted file mode 100644
index 5765d60b70..0000000000
--- a/doc/Pacemaker_Administration/en-US/Pacemaker_Administration.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE Book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-<!ENTITY % BOOK_ENTITIES SYSTEM "Pacemaker_Administration.ent">
-%BOOK_ENTITIES;
-]>
-<book>
- <xi:include href="Book_Info.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Preface.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Intro.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Installing.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Cluster.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Configuring.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Tools.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Troubleshooting.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Upgrading.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Agents.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Revision_History.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <index></index>
-</book>
diff --git a/doc/Pacemaker_Administration/en-US/Preface.xml b/doc/Pacemaker_Administration/en-US/Preface.xml
deleted file mode 100644
index e63c4be5b2..0000000000
--- a/doc/Pacemaker_Administration/en-US/Preface.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<preface><title>Preface</title>
- <xi:include href="Common_Content/Conventions.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude">
- <xi:fallback xmlns:xi="http://www.w3.org/2001/XInclude">
- <xi:include href="Common_Content/Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- </xi:fallback>
- </xi:include>
-</preface>
diff --git a/doc/Pacemaker_Administration/en-US/Revision_History.xml b/doc/Pacemaker_Administration/en-US/Revision_History.xml
deleted file mode 100644
index ca611d8310..0000000000
--- a/doc/Pacemaker_Administration/en-US/Revision_History.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-<!ENTITY % BOOK_ENTITIES SYSTEM "Pacemaker_Administration.ent">
-%BOOK_ENTITIES;
-]>
-<appendix id="appe-Pacemaker_Administration-Revision_History">
- <!-- see comment in Book_Info.xml for revision numbering -->
- <title>Revision History</title>
- <simpara>
- <revhistory>
-
- <revision>
- <revnumber>1-0</revnumber>
- <date>Tue Jan 23 2018</date>
- <author>
- <firstname>Andrew</firstname><surname>Beekhof</surname>
- <email>andrew@beekhof.net</email>
- </author>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <revdescription>
- <simplelist><member>Move administration-oriented information from
- Pacemaker Explained into its own
- book</member></simplelist>
- </revdescription>
- </revision>
-
- <revision>
- <revnumber>1-1</revnumber>
- <date>Mon Jan 28 2019</date>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <author>
- <firstname>Jan</firstname><surname>Pokorný</surname>
- <email>jpokorny@redhat.com</email>
- </author>
- <revdescription>
- <simplelist><member>Add "Troubleshooting" chapter, minor
- clarifications and reformatting</member></simplelist>
- </revdescription>
- </revision>
-
- <revision>
- <revnumber>1-2</revnumber>
- <date>Mon May 13 2019</date>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <revdescription>
- <simplelist><member>Overhaul configuration how-to</member></simplelist>
- </revdescription>
- </revision>
-
- <revision>
- <revnumber>1-3</revnumber>
- <date>Tue Oct 15 2019</date>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <revdescription>
- <simplelist><member>Add Tools chapter</member></simplelist>
- </revdescription>
- </revision>
-
- <revision>
- <revnumber>2-0</revnumber>
- <date>Tue Nov 5 2019</date>
- <author>
- <firstname>Chris</firstname><surname>Lumens</surname>
- <email>clumens@redhat.com</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Update for crm_mon changes in 2.0.3</member>
- </simplelist>
- </revdescription>
- </revision>
-
- <revision>
- <revnumber>2-1</revnumber>
- <date>Sun Dec 22 2019</date>
- <author>
- <firstname>Ferenc</firstname><surname>Wagner</surname>
- <email>wferi@debian.org</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Update log example to how it would look with current changes</member>
- </simplelist>
- </revdescription>
- </revision>
- </revhistory>
- </simpara>
-</appendix>
diff --git a/doc/Pacemaker_Administration/en-US/images b/doc/Pacemaker_Administration/en-US/images
deleted file mode 120000
index 963300dd95..0000000000
--- a/doc/Pacemaker_Administration/en-US/images
+++ /dev/null
@@ -1 +0,0 @@
-../../shared/en-US/images
\ No newline at end of file
diff --git a/doc/Pacemaker_Administration/publican.cfg.in b/doc/Pacemaker_Administration/publican.cfg.in
deleted file mode 100644
index c889e16a46..0000000000
--- a/doc/Pacemaker_Administration/publican.cfg.in
+++ /dev/null
@@ -1,11 +0,0 @@
-docname: Pacemaker_Administration
-xml_lang: en-US
-#edition: 1
-type: Book
-version: @PACKAGE_SERIES@
-brand: @PUBLICAN_BRAND@
-product: Pacemaker
-
-chunk_first: 0
-chunk_section_depth: 3
-generate_section_toc_level: 4
diff --git a/doc/Pacemaker_Development/en-US/Author_Group.xml b/doc/Pacemaker_Development/en-US/Author_Group.xml
deleted file mode 100644
index ff907feee5..0000000000
--- a/doc/Pacemaker_Development/en-US/Author_Group.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<authorgroup>
- <author>
- <affiliation>
- <orgname>Written by the Pacemaker project contributors</orgname>
- </affiliation>
- </author>
-</authorgroup>
diff --git a/doc/Pacemaker_Development/en-US/Book_Info.xml b/doc/Pacemaker_Development/en-US/Book_Info.xml
deleted file mode 100644
index c5b9319cd3..0000000000
--- a/doc/Pacemaker_Development/en-US/Book_Info.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE bookinfo PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-<!ENTITY % BOOK_ENTITIES SYSTEM "Pacemaker_Development.ent">
-%BOOK_ENTITIES;
-]>
-<bookinfo id="book-Pacemaker_Development-Pacemaker_Development">
- <title>Pacemaker Development</title>
- <subtitle>Working with the Pacemaker Code Base</subtitle>
- <!--
- EDITION-PUBSNUMBER should match REVNUMBER in Revision_History.xml.
- Increment EDITION when the syntax of the documented software
- changes (OS, pacemaker, corosync, pcs), and PUBSNUMBER for
- simple textual changes (corrections, translations, etc.).
- Changing the revision is only necessary when releasing a new
- version of Pacemaker or publishing the documents to the Web.
- -->
- <edition>2</edition>
- <pubsnumber>5</pubsnumber>
- <abstract>
- <para>
- This document has guidelines and tips for developers
- interested in editing Pacemaker source code and
- submitting changes for inclusion in the project.
- </para>
- </abstract>
- <corpauthor>
- <inlinemediaobject>
- <imageobject>
- <imagedata fileref="Common_Content/images/title_logo.svg" format="SVG" />
- </imageobject>
- </inlinemediaobject>
- </corpauthor>
- <xi:include href="Common_Content/Legal_Notice.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Author_Group.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-</bookinfo>
diff --git a/doc/Pacemaker_Development/en-US/Ch-Coding.txt b/doc/Pacemaker_Development/en-US/Ch-Coding.txt
deleted file mode 100644
index bfc003b780..0000000000
--- a/doc/Pacemaker_Development/en-US/Ch-Coding.txt
+++ /dev/null
@@ -1,291 +0,0 @@
-:compat-mode: legacy
-= C Coding Guidelines =
-
-////
-We prefer [[ch-NAME]], but older versions of asciidoc don't deal well
-with that construct for chapter headings
-////
-anchor:ch-c-coding[Chapter 3, C Coding Guidelines]
-
-== Style Guidelines ==
-
-Pacemaker is a large, distributed project accepting contributions from
-developers with a wide range of skill levels and organizational affiliations,
-and maintained by multiple people over long periods of time. The guidelines in
-this section are not technically better than alternative approaches, but make
-project management easier.
-
-Many of these simply ensure stylistic consistency, which makes reading,
-writing, and reviewing code easier.
-
-=== C Boilerplate ===
-
-indexterm:[C,boilerplate]
-indexterm:[licensing,C boilerplate]
-
-Every C file should start with a short copyright notice:
-
-====
-[source,C]
-----
-/*
- * Copyright <YYYY[-YYYY]> the Pacemaker project contributors
- *
- * The version control history for this file may have further details.
- *
- * This source code is licensed under <LICENSE> WITHOUT ANY WARRANTY.
- */
-----
-====
-
-+<LICENSE>+ should follow the policy set forth in the
-https://github.com/ClusterLabs/pacemaker/blob/master/COPYING[+COPYING+] file,
-generally one of "GNU General Public License version 2 or later (GPLv2+)"
-or "GNU Lesser General Public License version 2.1 or later (LGPLv2.1+)".
-
-Header files should additionally protect against multiple inclusion by defining
-a unique symbol.
-
-====
-[source,C]
-----
-#ifndef MY_HEADER_NAME__H
-# define MY_HEADER_NAME__H
-
-// header code here
-
-#endif // MY_HEADER_NAME__H
-----
-====
-
-Public API header files should additionally declare "C" compatibility for
-inclusion by C++, and give a Doxygen file description. For example:
-
-====
-[source,C]
-----
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*!
- * \file
- * \brief My brief description here
- * \ingroup core
- */
-
-// header code here
-
-#ifdef __cplusplus
-}
-#endif
-----
-====
-
-=== Line Formatting ===
-
-indexterm:[C,whitespace]
-
-- Indentation must be 4 spaces, no tabs.
-- Do not leave trailing whitespace.
-- Lines should be no longer than 80 characters unless limiting line length
- significantly impacts readability.
-
-=== Pointers ===
-
-indexterm:[C,pointers]
-
-- The +*+ goes by the variable name, not the type:
-
-====
-[source,C]
-----
-char *foo;
-----
-====
-
-- Use a space before the +*+ and after the closing parenthesis in a cast:
-
-====
-[source,C]
-----
-char *foo = (char *) bar;
-----
-====
-
-=== Function Definitions ===
-
-indexterm:[C,functions]
-
-- In the function definition, put the return type on its own line, and place
- the opening brace by itself on a line.
-- For functions with enough arguments that they must break to the next line,
- align arguments with the first argument.
-- When a function argument is a function itself, use the pointer form.
-
-====
-[source,C]
-----
-static int
-function_name(int bar, const char *a, const char *b,
- const char *c, void (*d)())
-{
-----
-====
-
-- If a function name gets really long, start the arguments on their own line
- with 8 spaces of indentation:
-
-====
-[source,C]
-----
-static int
-really_really_long_function_name_this_is_getting_silly_now(
- int bar, const char *a, const char *b,
- const char *c, const char *d)
-{
-----
-====
-
-=== Control Statements (if, else, while, for, switch) ===
-
-- The keyword is followed by one space, then left parenthesis without space,
- condition, right parenthesis, space, opening bracket on the same line.
- +else+ and +else if+ are on the same line with the ending brace and opening
- brace, separated by a space.
-- Always use braces around control statement blocks, even if they only contain
- one line. This makes code review diffs smaller if a line gets added in the
- future, and avoids any chance of bad indenting making a line incorrectly
- appear to be part of the block.
-- Do not put assignments in +if+ or +while+ conditionals. This ensures that the
- developer's intent is always clear, making code reviews easier and reducing
- the chance of using assignment where comparison is intended.
-
-====
-[source,C]
-----
-a = f();
-if (a < 0) {
- statement1;
-} else if (some_other_condition) {
- statement2;
-} else {
- statement3;
-}
-----
-====
-
-- In a +switch+ statement, +case+ is indented one level, and the body of each
- +case+ is indented by another level. The opening brace is on the same line as
- +switch+.
-
-====
-[source,C]
-----
-switch (expression) {
- case 0:
- command1;
- break;
- case 1:
- command2;
- break;
- default:
- command3;
-}
-----
-====
-
-=== Operators ===
-
-indexterm:[C,operators]
-
-- Operators have spaces from both sides.
-- Do not rely on operator precedence; use parentheses when mixing operators
- with different priority.
-- No space is used after opening parenthesis and before closing parenthesis.
-
-====
-[source,C]
-----
-x = a + b - (c * d);
-----
-====
-
-== Best Practices ==
-
-The guidelines in this section offer technical advantages.
-
-=== New Struct and Enum Members ===
-
-In the public APIs, always add new struct members to the end of the struct.
-This allows us to maintain backward API/ABI compatibility (as long as the
-application being linked allocates structs via API functions).
-
-This generally applies to enum values as well, as the compiler will define
-enum values to 0, 1, etc., in the order given, so inserting a value in the
-middle will change the numerical values of all later values, making them
-backward-incompatible. However, if enum numerical values are explicitly
-specified rather than left to the compiler, new values can be added anywhere.
-
-=== Documentation ===
-
-All public API header files, functions, structs, enums, etc.,
-should be documented with Doxygen comment blocks, as Pacemaker's
-http://clusterlabs.org/pacemaker/doxygen/[online API documentation]
-is automatically generated via Doxygen. It is helpful to document
-private symbols in the same way, with an +\internal+ tag in the
-Doxygen comment.
-
-=== Symbol Naming ===
-
-indexterm:[C,naming]
-
-- All file and function names should be unique across the entire project,
- to allow for individual tracing via +PCMK_trace_files+ and
- +PCMK_trace_functions+, as well as making detail logs easier to follow.
-- Any exposed symbols in libraries (non-+static+ function names, type names,
- etc.) must begin with a prefix appropriate to the library, for example,
- +crm_+, +pe_+, +st_+, +lrm_+. This reduces the chance of naming collisions
- with software linked against the library.
-- Time intervals are sometimes represented in Pacemaker code as user-defined
- text specifications (e.g. "10s"), other times as an integer number of
- seconds or milliseconds, and still other times as a string representation
- of an integer number. Variables for these should be named with an indication
- of which is being used (e.g. +interval_spec+, +interval_ms+, or
- +interval_ms_s+ instead of +interval+).
-
-=== Memory Allocation ===
-
-Always use calloc() rather than malloc(). It has no additional cost on modern
-operating systems, and reduces the severity of uninitialized memory usage bugs.
-
-=== Logging ===
-
-- When format strings are used for derived data types whose implementation may
- vary across platforms (+pid_t+, +time_t+, etc.), the safest approach is to
- use +%lld+ in the format string, and cast the value to +(long long)+.
-
-- Be sure 'not' to pass +NULL+ as an argument to satisfy +%s+ format specifier
- in logging and more generally +printf+ style functions. When mere +<null>+
- string is a sufficient output representation in such case, there is
- +crm_str+ convenient macro. Ternary operator is an apparent choice otherwise.
-
-=== Regular Expressions ===
-
-- Use +REG_NOSUB+ with +regcomp()+ whenever possible, for efficiency.
-- Be sure to use +regfree()+ appropriately.
-
-=== vim Settings ===
-
-indexterm:[vim]
-
-Developers who use +vim+ to edit source code can add the following settings to
-their +~/.vimrc+ file to follow Pacemaker C coding guidelines:
-
-----
-" follow Pacemaker coding guidelines when editing C source code files
-filetype plugin indent on
-au FileType c setlocal expandtab tabstop=4 softtabstop=4 shiftwidth=4 textwidth=80
-autocmd BufNewFile,BufRead *.h set filetype=c
-let c_space_errors = 1
-----
diff --git a/doc/Pacemaker_Development/en-US/Ch-Evolution.txt b/doc/Pacemaker_Development/en-US/Ch-Evolution.txt
deleted file mode 100644
index d597ed9144..0000000000
--- a/doc/Pacemaker_Development/en-US/Ch-Evolution.txt
+++ /dev/null
@@ -1,105 +0,0 @@
-:compat-mode: legacy
-= Evolution of the project =
-
-anchor:ch-evolution[Chapter 5. Evolution]
-
-[id="evolution-foreword"]
-== Foreword ==
-
-This chapter is currently not meant as a definite summary of how
-Pacemaker got into where it stands now, but rather to provide few valuable
-pointers an entusiasts (presumably software archeologist type of person)
-may find useful. Moreover, well-intentioned contributors to Pacemaker
-project may want to review them occasionally since, as the famous quote
-has it, "those who do not learn history are doomed to repeat it".
-
-For anything more talkative with less emphasis on actual code, other
-places will serve better for the time being (and if not, should not be
-too hard to volunteer extensions to those writeups):
-
-* https://wiki.clusterlabs.org/wiki/Pacemaker[main entry at ClusterLabs
- community wiki]
-* https://en.wikipedia.org/wiki/Pacemaker_(software)[entry at wikipedia.org]
-* https://www.alteeve.com/w/AN!Cluster_Tutorial_2#What_about_Pacemaker.3F[
- brief section dedicated to Pacemaker in Digimer's tutorial regarding
- setting up the cluster with the old Red Hat Cluster Suite like stack]
-
-== Common ancestor: 'heartbeat' project ==
-
-Pacemaker can be considered as a spin-off from `heartbeat', original
-comprehensive HA suite started by Alan Robertson, and some portions of code
-are shared, at least on the conceptual level if not verbatim, till today,
-even if the effective percentage continually declines. Note that till
-Pacemaker 2.0, it also used to stand for one (and initially the only) of
-supported messaging back-ends (removal of this support made for one such
-notable drop of reused code), see also
-https://github.com/ClusterLabs/pacemaker/commit/55ab749bf0f0143bd1cd050c1bbe302aecb3898e[
-pre-2.0 commit 55ab749bf].
-
-The codebase for heartbeat used to be hosted at http://hg.linux-ha.org,
-but since that does not appear reliably available recently, an archive
-checkout from 2016 is shared at https://gitlab.com/poki/archived-heartbeat[
-as a dedicated read-only repository], and anchored there, the most
-notable commits are:
-
-* https://gitlab.com/poki/archived-heartbeat/commit/bb48551be418291c46980511aa31c7c2df3a85e4[
- initial check-in of what turned up to be the basis for Pacemaker later on]
-
-* https://gitlab.com/poki/archived-heartbeat/commit/74573ac6182785820d765ec76c5d70086381931a[
- drop of now-detached Pacemaker code]
-
-Regarding the Pacemaker's split from heartbeat, it evolved stepwise
-(as opposed to one-off cut), and the last step of full dependency is depicted
-in https://www.kernel.org/doc/ols/2008/ols2008v1-pages-85-100.pdf#page=14[
-The Corosync Cluster Engine] paper, fig. 10.
-This article also provides a good reference regarding wider historical
-context of the tangentially (and deeper in some cases) meeting components
-around that time.
-
-=== Influence of 'heartbeat' on Pacemaker ===
-
-On a closer look, we can identify these things in common:
-
-* extensive use of data types and functions of
- https://wiki.gnome.org/Projects/GLib[GLib]
-
-* Cluster Testing System (CTS) is inherited from initial implementation
- by Alan Robertson
-
-* ...
-
-== Notable Restructuring Steps in the Codebase ==
-
-File renames may not appear as notable ... unless one runs into complicated
-+git blame+ and +git log+ scenarios, so some more massive ones may be stated
-as well.
-
-* watchdog/'sbd' functionality spin-off:
-** https://github.com/ClusterLabs/pacemaker/commit/eb7cce2a172a026336f4ba6c441dedce42f41092[
- start separating, eb7cce2a1]
-** https://github.com/ClusterLabs/pacemaker/commit/5884db78080941cdc4e77499bc76677676729484[
- finish separating, 5884db780]
-
-* daemons' rename for 2.0 (in chronological order)
-** https://github.com/ClusterLabs/pacemaker/commit/318a2e003d2369caf10a450fe7a7616eb7ffb264[
- start of moving daemon sources from their top-level directories under
- new +/daemons+ hierarchy, 318a2e003]
-** https://github.com/ClusterLabs/pacemaker/commit/01563cf2637040e9d725b777f0c42efa8ab075c7[
- +attrd+ -> +pacemaker-attrd+, 01563cf26]
-** https://github.com/ClusterLabs/pacemaker/commit/36a00e2376fd50d52c2ccc49483e235a974b161c[
- +lrmd+ -> +pacemaker-execd+, 36a00e237]
-** https://github.com/ClusterLabs/pacemaker/commit/e4f4a0d64c8b6bbc4961810f2a41383f52eaa116[
- +pacemaker_remoted+ -> +pacemaker-remoted+, e4f4a0d64]
-** https://github.com/ClusterLabs/pacemaker/commit/db5536e40c77cdfdf1011b837f18e4ad9df45442[
- +crmd+ -> +pacemaker-controld+, db5536e40]
-** https://github.com/ClusterLabs/pacemaker/commit/e2fdc2baccc3ae07652aac622a83f317597608cd[
- +pengine+ -> +pacemaker-schedulerd+, e2fdc2bac]
-** https://github.com/ClusterLabs/pacemaker/commit/038c465e2380c5349fb30ea96c8a7eb6184452e0[
- +stonithd+ -> +pacemaker-fenced+, 038c465e2]
-** https://github.com/ClusterLabs/pacemaker/commit/50584c234e48cd8b99d355ca9349b0dfb9503987[
- +cib daemon+ -> +pacemaker-based+, 50584c234]
-
-////
-TBD:
-- standalone tengine -> part of crmd/pacemaker-controld
-////
diff --git a/doc/Pacemaker_Development/en-US/Ch-FAQ.txt b/doc/Pacemaker_Development/en-US/Ch-FAQ.txt
deleted file mode 100644
index a5d448206a..0000000000
--- a/doc/Pacemaker_Development/en-US/Ch-FAQ.txt
+++ /dev/null
@@ -1,121 +0,0 @@
-:compat-mode: legacy
-= Frequently Asked Questions =
-
-[qanda]
-Who is this document intended for?::
- Anyone who wishes to read and/or edit the Pacemaker source code.
- Casual contributors should feel free to read just this FAQ, and
- consult other chapters as needed.
-
-Where is the source code for Pacemaker?::
- indexterm:[downloads]
- indexterm:[source code]
- indexterm:[git,GitHub]
- The https://github.com/ClusterLabs/pacemaker[source code for Pacemaker] is
- kept on https://github.com/[GitHub], as are all software projects under the
- https://github.com/ClusterLabs[ClusterLabs] umbrella. Pacemaker uses
- https://git-scm.com/[Git] for source code management. If you are a Git newbie,
- the http://schacon.github.io/git/gittutorial.html[gittutorial(7) man page]
- is an excellent starting point. If you're familiar with using Git from the
- command line, you can create a local copy of the Pacemaker source code with:
- `git clone https://github.com/ClusterLabs/pacemaker.git`
-
-What are the different Git branches and repositories used for?::
- indexterm:[branches]
- * The https://github.com/ClusterLabs/pacemaker/tree/master[master branch]
- is the primary branch used for development.
- * The https://github.com/ClusterLabs/pacemaker/tree/2.0[2.0 branch] contains
- the latest official release, and normally does not receive any changes.
- During the release cycle, it will contain release candidates for the
- next official release, and will receive only bug fixes.
- * The https://github.com/ClusterLabs/pacemaker/tree/1.1[1.1 branch] is similar
- to both the master and 2.0 branches, but for the 1.1 release series.
- The 1.1 branch receives only backports of certain bug fixes and
- backward-compatible features from the master branch. During the release
- cycle, it will contain release candidates for the next official 1.1 release.
- * The https://github.com/ClusterLabs/pacemaker-1.0[1.0 repository] is a
- frozen snapshot of the 1.0 release series, and is no longer developed.
- * Messages will be posted to the
- http://clusterlabs.org/mailman/listinfo/developers[developers@clusterlabs.org]
- mailing list during the release cycle, with instructions about which
- branches to use when submitting requests.
-
-How do I build from the source code?::
- See https://github.com/ClusterLabs/pacemaker/blob/master/INSTALL.md[INSTALL.md]
- in the main checkout directory.
-
-What coding style should I follow?::
- You'll be mostly fine if you simply follow the example of existing code.
- When unsure, see the relevant chapter of this document for language-specific
- recommendations. Pacemaker has grown and evolved organically over many years,
- so you will see much code that doesn't conform to the current guidelines. We
- discourage making changes solely to bring code into conformance, as any change
- requires developer time for review and opens the possibility of adding bugs.
- However, new code should follow the guidelines, and it is fine to bring lines
- of older code into conformance when modifying that code for other reasons.
-
-How should I format my Git commit messages?::
- indexterm:[git,commit messages]
- See existing examples in the git log. The first line should look like
- +change-type: affected-code: explanation+ where +change-type+ should be
- +Fix+ or +Bug+ for most bug fixes, +Feature+ for new features, +Log+ for
- changes to log messages or handling, +Doc+ for changes to documentation or
- comments, or +Test+ for changes in CTS and regression tests. You will
- sometimes see +Low+, +Med+ (or +Mid+) and +High+ used instead for bug fixes,
- to indicate the severity. The important thing is that only commits with
- +Feature+, +Fix+, +Bug+, or +High+ will automatically be included in the
- change log for the next release. The +affected-code+ is the name of the
- component(s) being changed, for example, +controller+ or
- +libcrmcommon+ (it's more free-form, so don't sweat getting it exact). The
- +explanation+ briefly describes the change. The git project recommends the
- entire summary line stay under 50 characters, but more is fine if needed for
- clarity. Except for the most simple and obvious of changes, the summary should
- be followed by a blank line and then a longer explanation of 'why' the change
- was made.
-
-How can I test my changes?::
- Most importantly, Pacemaker has regression tests for most major components;
- these will automatically be run for any pull requests submitted through
- GitHub. Additionally, Pacemaker's Cluster Test Suite (CTS) can be used to set
- up a test cluster and run a wide variety of complex tests. This document will
- have more detail on testing in the future.
-
-What is Pacemaker's license?::
- indexterm:[licensing]
- Except where noted otherwise in the file itself, the source code for all
- Pacemaker programs is licensed under version 2 or later of the GNU General
- Public License (https://www.gnu.org/licenses/gpl-2.0.html[GPLv2+]), its
- headers and libraries under version 2.1 or later of the less restrictive
- GNU Lesser General Public License
- (https://www.gnu.org/licenses/lgpl-2.1.html[LGPLv2.1+]),
- its documentation under version 4.0 or later of the
- Creative Commons Attribution-ShareAlike International Public License
- (https://creativecommons.org/licenses/by-sa/4.0/legalcode[CC-BY-SA-4.0]),
- and its init scripts under the
- https://opensource.org/licenses/BSD-3-Clause[Revised BSD] license. If you find
- any deviations from this policy, or wish to inquire about alternate licensing
- arrangements, please e-mail the
- mailto:developers@clusterlabs.org[developers@ClusterLabs.org] mailing list.
- Licensing issues are also discussed on the
- https://wiki.clusterlabs.org/wiki/License[ClusterLabs wiki].
-
-How can I contribute my changes to the project?::
- Contributions of bug fixes or new features are very much appreciated!
- Patches can be submitted as
- https://help.github.com/articles/using-pull-requests/[pull requests]
- via GitHub (the preferred method, due to its excellent
- https://github.com/features/[features]), or e-mailed to the
- http://clusterlabs.org/mailman/listinfo/developers[developers@clusterlabs.org]
- mailing list as an attachment in a format Git can import. Authors may only
- submit changes that they have the right to submit under the open source
- license indicated in the affected files.
-
-What if I still have questions?::
- indexterm:[mailing lists]
- Ask on the
- http://clusterlabs.org/mailman/listinfo/developers[developers@clusterlabs.org]
- mailing list for development-related questions, or on the
- http://clusterlabs.org/mailman/listinfo/users[users@clusterlabs.org]
- mailing list for general questions about using Pacemaker.
- Developers often also hang out on http://freenode.net/[freenode's]
- #clusterlabs IRC channel.
diff --git a/doc/Pacemaker_Development/en-US/Ch-General.txt b/doc/Pacemaker_Development/en-US/Ch-General.txt
deleted file mode 100644
index 4186ec2d70..0000000000
--- a/doc/Pacemaker_Development/en-US/Ch-General.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-:compat-mode: legacy
-= General Guidelines for All Languages =
-
-== Copyright ==
-
-indexterm:[copyright]
-
-When copyright notices are added to a file, they should look like this:
-
-.Copyright Notice Format
-====
-Copyright +YYYY[-YYYY]+ the Pacemaker project contributors
-
-The version control history for this file may have further details.
-====
-
-The first +YYYY+ is the year the file was originally published. The original
-date is important for two reasons: when two entities claim copyright ownership
-of the same work, the earlier claim generally prevails; and copyright
-expiration is generally calculated from the original publication date.
-footnote:[
-See the U.S. Copyright Office's https://www.copyright.gov/comp3/["Compendium
-of U.S. Copyright Office Practices"], particularly "Chapter 2200: Notice of
-Copyright", sections 2205.1(A) and 2205.1(F), or
-https://techwhirl.com/updating-copyright-notices/["Updating Copyright
-Notices"] for a more readable summary.
-]
-
-If the file is modified in later years, add +-YYYY+ with the most recent year
-of modification. Even though Pacemaker is an ongoing project, copyright notices
-are about the years of 'publication' of specific content.
-
-Copyright notices are intended to indicate, but do not affect, copyright
-'ownership', which is determined by applicable laws and regulations. Authors
-may put more specific copyright notices in their commit messages if desired.
diff --git a/doc/Pacemaker_Development/en-US/Ch-Hacking.txt b/doc/Pacemaker_Development/en-US/Ch-Hacking.txt
deleted file mode 100644
index f26cf6284f..0000000000
--- a/doc/Pacemaker_Development/en-US/Ch-Hacking.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-:compat-mode: legacy
-= Advanced Hacking on the Project =
-
-anchor:ch-hacking[Chapter 6. Hacking on Pacemaker]
-
-[id="hacking-foreword"]
-== Foreword ==
-
-This chapter aims to be a gentle introduction (or perhaps, rather
-a summarization of advanced techniques we developed for backreferences)
-to how deal with the Pacemaker internals effectively.
-for instance, how to:
-
-* debug with an ease
-* verify various interesting interaction-based properties
-
-or simply put, all that is in the interest of the core contributors
-on the project to know, master, and (preferably) also evolve
--- way beyond what is in the presumed repertoire of a generic
-contributor role, which is detailed in other chapters of this guide.
-
-Therefore, if you think you will not benefit from any such details
-in the scope of this chapter, feel free to skip it.
-
-== Debugging ==
-
-In the GNU userland tradition, preferred way of debugging is based
-on 'gdb' (directly or via specific frontends atop) that is widely
-available on platforms (semi)supported with Pacemaker itself.
-
-To make some advanced debugging easier, we maintain a script defining
-some useful helpers in `extra/gdb/gdbhelpers` file, which you can make
-available in the debugging session easily when invoking it as
-`gdb -x <path-to-gdbhelpers> ...`.
-
-From within the debugger, you can then invoke the new `pcmk` command
-that will guide you regarding other helper functions available, so
-we won't replicate that here.
-
-== Working with mocked daemons ==
-
-Since the Pacemaker run-time consists of multiple co-operating daemons
-as detailed elsewhere, tracking down the interaction details amongst
-them can be rather cumbersome. Since rebuilding existing daemons in
-a more modular way as opposed to clusters of mutually dependent
-functions, we elected to grow separate bare-bones counterparts built
-evolutionary as skeletons just to get the basic (long-term stabilized)
-communication with typical daemon clients going, and to add new modules
-in their outer circles (plus minimalistic hook support at those cores)
-on a demand-driven basis.
-
-The code for these is located at `maint/mocked`; for instance,
-`based-notifyfenced.c` module of `based.c` skeleton mocking
-`pacemaker-based` daemon was exactly to fulfill investigation helper
-role (the case at hand was also an impulse to kick off this very
-sort of maintenance support material, to begin with).
-
-Non-trivial knowledge of Pacemaker internals and other skills are
-needed to use such devised helpers, but given the other way around,
-some sorts of investigation may be even heftier, it may be the least
-effort choice. And when that's the case, advanced contributors are
-expected to contribute their own extensions they used to validate
-the reproducibility/actual correctness of the fix along the actual
-code modifications. This way, the rest of the development teams is
-not required to deal with elaborate preconditions, be at guess, or
-even forced to use a blind faith regarding the causes, consequences
-and validity regarding the raised issues/fixes, for the greater
-benefit of all.
diff --git a/doc/Pacemaker_Development/en-US/Ch-Python.txt b/doc/Pacemaker_Development/en-US/Ch-Python.txt
deleted file mode 100644
index 42d35b649b..0000000000
--- a/doc/Pacemaker_Development/en-US/Ch-Python.txt
+++ /dev/null
@@ -1,141 +0,0 @@
-:compat-mode: legacy
-= Python Coding Guidelines =
-
-////
-We prefer [[ch-NAME]], but older versions of asciidoc don't deal well
-with that construct for chapter headings
-////
-anchor:ch-python-coding[Chapter 4, Python Coding Guidelines]
-
-[[s-python-boilerplate]]
-== Python Boilerplate ==
-
-indexterm:[Python,boilerplate]
-indexterm:[licensing,Python boilerplate]
-
-If a Python file is meant to be executed (as opposed to imported), it should
-have a +.in+ extension, and its first line should be:
-====
-----
-#!@PYTHON@
-----
-====
-which will be replaced with the appropriate python executable when Pacemaker is
-built. To make that happen, add an AC_CONFIG_FILES() line to configure.ac, and
-add the file name without .in to .gitignore (see existing examples).
-
-After the above line if any, every Python file should start like this:
-
-====
-[source,Python]
-----
-""" <BRIEF-DESCRIPTION>
-"""
-
-# Pacemaker targets compatibility with Python 2.7 and 3.2+
-from __future__ import print_function, unicode_literals, absolute_import, division
-
-__copyright__ = "Copyright <YYYY[-YYYY]> the Pacemaker project contributors"
-__license__ = "<LICENSE> WITHOUT ANY WARRANTY"
-----
-====
-
-+<BRIEF-DESCRIPTION>+ is obviously a brief description of the file's
-purpose. The string may contain any other information typically used in
-a Python file https://www.python.org/dev/peps/pep-0257/[docstring].
-
-The +import+ statement is discussed further in <<s-python-future-imports>>.
-
-+<LICENSE>+ should follow the policy set forth in the
-https://github.com/ClusterLabs/pacemaker/blob/master/COPYING[+COPYING+] file,
-generally one of "GNU General Public License version 2 or later (GPLv2+)"
-or "GNU Lesser General Public License version 2.1 or later (LGPLv2.1+)".
-
-
-== Python Compatibility ==
-
-indexterm:[Python,2]
-indexterm:[Python,3]
-indexterm:[Python,versions]
-
-Pacemaker targets compatibility with Python 2.7, and Python 3.2 and
-later. These versions have added features to be more compatible with each
-other, allowing us to support both the 2 and 3 series with the same code. It is
-a good idea to test any changes with both Python 2 and 3.
-
-[[s-python-future-imports]]
-=== Python Future Imports ===
-
-The future imports used in <<s-python-boilerplate>> mean:
-
-* All print statements must use parentheses, and printing without a newline
- is accomplished with the +end=' '+ parameter rather than a trailing comma.
-* All string literals will be treated as Unicode (the +u+ prefix is
- unnecessary, and must not be used, because it is not available in Python 3.2).
-* Local modules must be imported using +from . import+ (rather than just
- +import+). To import one item from a local module, use
- +from .modulename import+ (rather than +from modulename import+).
-* Division using +/+ will always return a floating-point result (use +//+ if
- you want the integer floor instead).
-
-=== Other Python Compatibility Requirements ===
-
-* When specifying an exception variable, always use +as+ instead of a comma
- (e.g. +except Exception as e+ or +except (TypeError, IOError) as e+).
- Use +e.args+ to access the error arguments (instead of iterating over or
- subscripting +e+).
-* Use +in+ (not +has_key()+) to determine if a dictionary has a particular key.
-* Always use the I/O functions from the +io+ module rather than the native
- I/O functions (e.g. +io.open()+ rather than +open()+).
-* When opening a file, always use the +t+ (text) or +b+ (binary) mode flag.
-* When creating classes, always specify a parent class to ensure that it is a
- "new-style" class (e.g. +class Foo(object):+ rather than +class Foo:+)
-* Be aware of the bytes type added in Python 3. Many places where strings are
- used in Python 2 use bytes or bytearrays in Python 3 (for example, the pipes
- used with +subprocess.Popen()+). Code should handle both possibilities.
-* Be aware that the +items()+, +keys()+, and +values()+ methods of dictionaries
- return lists in Python 2 and views in Python 3. In many case, no special
- handling is required, but if the code needs to use list methods on the
- result, cast the result to list first.
-* Do not raise or catch strings as exceptions (e.g. +raise "Bad thing"+).
-* Do not use the +cmp+ parameter of sorting functions (use +key+ instead, if
- needed) or the +$$__cmp__()$$+ method of classes (implement rich comparison
- methods such as +$$__lt__()$$+ instead, if needed).
-* Do not use the +buffer+ type.
-* Do not use features not available in all targeted Python versions. Common
- examples include:
-** The +html+, +ipaddress+, and +UserDict+ modules
-** The +subprocess.run()+ function
-** The +subprocess.DEVNULL+ constant
-** +subprocess+ module-specific exceptions
-
-=== Python Usages to Avoid ===
-
-Avoid the following if possible, otherwise research the compatibility issues
-involved (hacky workarounds are often available):
-
-* long integers
-* octal integer literals
-* mixed binary and string data in one data file or variable
-* metaclasses
-* +locale.strcoll+ and +locale.strxfrm+
-* the +configparser+ and +ConfigParser+ modules
-* importing compatibility modules such as +six+ (so we don't have
- to add them to Pacemaker's dependencies)
-
-== Formatting Python Code ==
-
-indexterm:[Python,formatting]
-
-* Indentation must be 4 spaces, no tabs.
-* Do not leave trailing whitespace.
-* Lines should be no longer than 80 characters unless limiting line length
- significantly impacts readability. For Python, this limitation is
- flexible since breaking a line often impacts readability, but
- definitely keep it under 120 characters.
-* Where not conflicting with this style guide, it is recommended (but not
- required) to follow https://www.python.org/dev/peps/pep-0008/[PEP 8].
-* It is recommended (but not required) to format Python code such that
- `pylint --disable=line-too-long,too-many-lines,too-many-instance-attributes,too-many-arguments,too-many-statements`
- produces minimal complaints (even better if you don't need to disable all
- those checks).
diff --git a/doc/Pacemaker_Development/en-US/Pacemaker_Development.ent b/doc/Pacemaker_Development/en-US/Pacemaker_Development.ent
deleted file mode 100644
index 5c02713e9d..0000000000
--- a/doc/Pacemaker_Development/en-US/Pacemaker_Development.ent
+++ /dev/null
@@ -1,4 +0,0 @@
-<!ENTITY PRODUCT "Pacemaker Development">
-<!ENTITY BOOKID "Pacemaker_Development">
-<!ENTITY YEAR "2016-2020">
-<!ENTITY HOLDER "The Pacemaker project contributors">
diff --git a/doc/Pacemaker_Development/en-US/Pacemaker_Development.xml b/doc/Pacemaker_Development/en-US/Pacemaker_Development.xml
deleted file mode 100644
index 888696dc20..0000000000
--- a/doc/Pacemaker_Development/en-US/Pacemaker_Development.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-<!ENTITY % BOOK_ENTITIES SYSTEM "Pacemaker_Development.ent">
-%BOOK_ENTITIES;
-]>
-<book>
- <xi:include href="Book_Info.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-FAQ.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-General.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Coding.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Python.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Evolution.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Hacking.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Revision_History.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <index></index>
-</book>
diff --git a/doc/Pacemaker_Development/en-US/Revision_History.xml b/doc/Pacemaker_Development/en-US/Revision_History.xml
deleted file mode 100644
index 4c5f0f5060..0000000000
--- a/doc/Pacemaker_Development/en-US/Revision_History.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-<!ENTITY % BOOK_ENTITIES SYSTEM "Pacemaker_Development.ent">
-%BOOK_ENTITIES;
-]>
-<appendix id="appe-Pacemaker_Development-Revision_History">
- <!-- see comment in Book_Info.xml for revision numbering -->
- <title>Revision History</title>
- <simpara>
- <revhistory>
-
- <revision>
- <revnumber>1-0</revnumber>
- <date>Tue Jul 26 2016</date>
- <author>
- <firstname>Andrew</firstname><surname>Beekhof</surname>
- <email>andrew@beekhof.net</email>
- </author>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <revdescription>
- <simplelist><member>Convert coding guidelines and developer FAQ
- to Publican document</member></simplelist>
- </revdescription>
- </revision>
-
- <revision>
- <revnumber>1-1</revnumber>
- <date>Mon Aug 29 2016</date>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <revdescription>
- <simplelist><member>Add Python coding guidelines, and
- more about licensing</member></simplelist>
- </revdescription>
- </revision>
-
- <revision>
- <revnumber>2-0</revnumber>
- <date>Fri Jan 12 2018</date>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <revdescription>
- <simplelist><member>Drop support for Python 2.6</member></simplelist>
- </revdescription>
- </revision>
-
- <revision>
- <revnumber>2-1</revnumber>
- <date>Tue Sep 18 2018</date>
- <author>
- <firstname>Jan</firstname><surname>Pokorný</surname>
- <email>poki@redhat.com</email>
- </author>
- <revdescription>
- <simplelist><member>Start documenting notable evolutionary
- points</member></simplelist>
- </revdescription>
- </revision>
-
- <revision>
- <revnumber>2-2</revnumber>
- <date>Fri Dec 7 2018</date>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <revdescription>
- <simplelist><member>Update FAQ and C guidelines</member></simplelist>
- </revdescription>
- </revision>
-
- <revision>
- <revnumber>2-3</revnumber>
- <date>Mon May 13 2019</date>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <author>
- <firstname>Jan</firstname><surname>Pokorný</surname>
- <email>poki@redhat.com</email>
- </author>
- <revdescription>
- <simplelist><member>
- Update copyright notice policy, and some external references
- </member></simplelist>
- </revdescription>
- </revision>
-
- <revision>
- <revnumber>2-4</revnumber>
- <date>Fri 17 May 2019</date>
- <author>
- <firstname>Jan</firstname><surname>Pokorný</surname>
- <email>poki@redhat.com</email>
- </author>
- <revdescription>
- <simplelist><member>Start capturing hacking howto
- for advanced contributors</member></simplelist>
- </revdescription>
- </revision>
-
- <revision>
- <revnumber>2-5</revnumber>
- <date>Thu 5 Mar 2020</date>
- <author>
- <firstname>Jan</firstname><surname>Pokorný</surname>
- <email>poki@redhat.com</email>
- </author>
- <revdescription>
- <simplelist><member>Use crm_str</member></simplelist>
- </revdescription>
- </revision>
-
- </revhistory>
- </simpara>
-</appendix>
diff --git a/doc/Pacemaker_Development/en-US/images b/doc/Pacemaker_Development/en-US/images
deleted file mode 120000
index 963300dd95..0000000000
--- a/doc/Pacemaker_Development/en-US/images
+++ /dev/null
@@ -1 +0,0 @@
-../../shared/en-US/images
\ No newline at end of file
diff --git a/doc/Pacemaker_Development/publican.cfg.in b/doc/Pacemaker_Development/publican.cfg.in
deleted file mode 100644
index 7b5e54e512..0000000000
--- a/doc/Pacemaker_Development/publican.cfg.in
+++ /dev/null
@@ -1,11 +0,0 @@
-docname: Pacemaker_Development
-xml_lang: en-US
-#edition: 1
-type: Book
-version: @PACKAGE_SERIES@
-brand: @PUBLICAN_BRAND@
-product: Pacemaker
-
-chunk_first: 0
-chunk_section_depth: 3
-generate_section_toc_level: 4
diff --git a/doc/Pacemaker_Explained/en-US/Ap-Samples.txt b/doc/Pacemaker_Explained/en-US/Ap-Samples.txt
deleted file mode 100644
index f1dadec145..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ap-Samples.txt
+++ /dev/null
@@ -1,153 +0,0 @@
-:compat-mode: legacy
-[appendix]
-
-== Sample Configurations ==
-
-=== Empty ===
-
-.An Empty Configuration
-=======
-[source,XML]
--------
-<cib crm_feature_set="3.0.7" validate-with="pacemaker-1.2" admin_epoch="1" epoch="0" num_updates="0">
- <configuration>
- <crm_config/>
- <nodes/>
- <resources/>
- <constraints/>
- </configuration>
- <status/>
-</cib>
--------
-=======
-
-=== Simple ===
-
-.A simple configuration with two nodes, some cluster options and a resource
-=======
-[source,XML]
--------
-<cib crm_feature_set="3.0.7" validate-with="pacemaker-1.2" admin_epoch="1" epoch="0" num_updates="0">
- <configuration>
- <crm_config>
- <cluster_property_set id="cib-bootstrap-options">
- <nvpair id="option-1" name="symmetric-cluster" value="true"/>
- <nvpair id="option-2" name="no-quorum-policy" value="stop"/>
- <nvpair id="option-3" name="stonith-enabled" value="0"/>
- </cluster_property_set>
- </crm_config>
- <nodes>
- <node id="xxx" uname="c001n01" type="normal"/>
- <node id="yyy" uname="c001n02" type="normal"/>
- </nodes>
- <resources>
- <primitive id="myAddr" class="ocf" provider="heartbeat" type="IPaddr">
- <operations>
- <op id="myAddr-monitor" name="monitor" interval="300s"/>
- </operations>
- <instance_attributes id="myAddr-params">
- <nvpair id="myAddr-ip" name="ip" value="192.0.2.10"/>
- </instance_attributes>
- </primitive>
- </resources>
- <constraints>
- <rsc_location id="myAddr-prefer" rsc="myAddr" node="c001n01" score="INFINITY"/>
- </constraints>
- <rsc_defaults>
- <meta_attributes id="rsc_defaults-options">
- <nvpair id="rsc-default-1" name="resource-stickiness" value="100"/>
- <nvpair id="rsc-default-2" name="migration-threshold" value="10"/>
- </meta_attributes>
- </rsc_defaults>
- <op_defaults>
- <meta_attributes id="op_defaults-options">
- <nvpair id="op-default-1" name="timeout" value="30s"/>
- </meta_attributes>
- </op_defaults>
- </configuration>
- <status/>
-</cib>
--------
-=======
-
-In the above example, we have one resource (an IP address) that we check
-every five minutes and will run on host +c001n01+ until either the
-resource fails 10 times or the host shuts down.
-
-=== Advanced Configuration ===
-
-.An advanced configuration with groups, clones and STONITH
-=======
-[source,XML]
--------
-<cib crm_feature_set="3.0.7" validate-with="pacemaker-1.2" admin_epoch="1" epoch="0" num_updates="0">
- <configuration>
- <crm_config>
- <cluster_property_set id="cib-bootstrap-options">
- <nvpair id="option-1" name="symmetric-cluster" value="true"/>
- <nvpair id="option-2" name="no-quorum-policy" value="stop"/>
- <nvpair id="option-3" name="stonith-enabled" value="true"/>
- </cluster_property_set>
- </crm_config>
- <nodes>
- <node id="xxx" uname="c001n01" type="normal"/>
- <node id="yyy" uname="c001n02" type="normal"/>
- <node id="zzz" uname="c001n03" type="normal"/>
- </nodes>
- <resources>
- <primitive id="myAddr" class="ocf" provider="heartbeat" type="IPaddr">
- <operations>
- <op id="myAddr-monitor" name="monitor" interval="300s"/>
- </operations>
- <instance_attributes id="myAddr-attrs">
- <nvpair id="myAddr-attr-1" name="ip" value="192.0.2.10"/>
- </instance_attributes>
- </primitive>
- <group id="myGroup">
- <primitive id="database" class="lsb" type="oracle">
- <operations>
- <op id="database-monitor" name="monitor" interval="300s"/>
- </operations>
- </primitive>
- <primitive id="webserver" class="lsb" type="apache">
- <operations>
- <op id="webserver-monitor" name="monitor" interval="300s"/>
- </operations>
- </primitive>
- </group>
- <clone id="STONITH">
- <meta_attributes id="stonith-options">
- <nvpair id="stonith-option-1" name="globally-unique" value="false"/>
- </meta_attributes>
- <primitive id="stonithclone" class="stonith" type="external/ssh">
- <operations>
- <op id="stonith-op-mon" name="monitor" interval="5s"/>
- </operations>
- <instance_attributes id="stonith-attrs">
- <nvpair id="stonith-attr-1" name="hostlist" value="c001n01,c001n02"/>
- </instance_attributes>
- </primitive>
- </clone>
- </resources>
- <constraints>
- <rsc_location id="myAddr-prefer" rsc="myAddr" node="c001n01"
- score="INFINITY"/>
- <rsc_colocation id="group-with-ip" rsc="myGroup" with-rsc="myAddr"
- score="INFINITY"/>
- </constraints>
- <op_defaults>
- <meta_attributes id="op_defaults-options">
- <nvpair id="op-default-1" name="timeout" value="30s"/>
- </meta_attributes>
- </op_defaults>
- <rsc_defaults>
- <meta_attributes id="rsc_defaults-options">
- <nvpair id="rsc-default-1" name="resource-stickiness" value="100"/>
- <nvpair id="rsc-default-2" name="migration-threshold" value="10"/>
- </meta_attributes>
- </rsc_defaults>
- </configuration>
- <status/>
-</cib>
--------
-=======
diff --git a/doc/Pacemaker_Explained/en-US/Author_Group.xml b/doc/Pacemaker_Explained/en-US/Author_Group.xml
deleted file mode 100644
index ff907feee5..0000000000
--- a/doc/Pacemaker_Explained/en-US/Author_Group.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<authorgroup>
- <author>
- <affiliation>
- <orgname>Written by the Pacemaker project contributors</orgname>
- </affiliation>
- </author>
-</authorgroup>
diff --git a/doc/Pacemaker_Explained/en-US/Book_Info.xml b/doc/Pacemaker_Explained/en-US/Book_Info.xml
deleted file mode 100644
index f010c2a619..0000000000
--- a/doc/Pacemaker_Explained/en-US/Book_Info.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE bookinfo PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<bookinfo>
- <title>Configuration Explained</title>
- <subtitle>An A-Z guide to Pacemaker's Configuration Options</subtitle>
- <productname>Pacemaker</productname>
- <productnumber>2.0</productnumber>
- <!--
- EDITION-PUBSNUMBER should match REVNUMBER in Revision_History.xml.
- Increment EDITION when the syntax of the documented software
- changes (pacemaker), and PUBSNUMBER for
- simple textual changes (corrections, translations, etc.).
- -->
- <edition>13</edition>
- <pubsnumber>1</pubsnumber>
- <abstract>
- <para>
- The purpose of this document is to definitively explain the concepts used to configure Pacemaker.
- To achieve this, it will focus exclusively on the XML syntax used to configure Pacemaker's
- Cluster Information Base (CIB).
- </para>
- </abstract>
- <corpauthor>
- <inlinemediaobject>
- <imageobject>
- <imagedata fileref="Common_Content/images/title_logo.svg" format="SVG"/>
- </imageobject>
- </inlinemediaobject>
- </corpauthor>
- <xi:include href="Common_Content/Legal_Notice.xml" xmlns:xi="http://www.w3.org/2001/XInclude">
- </xi:include>
- <xi:include href="Author_Group.xml" xmlns:xi="http://www.w3.org/2001/XInclude">
- </xi:include>
-</bookinfo>
diff --git a/doc/Pacemaker_Explained/en-US/Ch-ACLs.txt b/doc/Pacemaker_Explained/en-US/Ch-ACLs.txt
deleted file mode 100644
index 0fa34c9a9e..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ch-ACLs.txt
+++ /dev/null
@@ -1,337 +0,0 @@
-:compat-mode: legacy
-= Access Control Lists (ACLs) =
-
-////
-We prefer [[ch-acls]], but older versions of asciidoc don't deal well
-with that construct for chapter headings
-////
-anchor:ch-acls[Chapter 13, ACLs]
-indexterm:[access control list]
-indexterm:[ACL]
-
-By default, the +root+ user or any user in the +haclient+ group can modify
-Pacemaker's CIB without restriction. Pacemaker offers 'access control lists
-(ACLs)' to provide more fine-grained authorization.
-
-== ACL Prerequisites ==
-
-In order to use ACLs:
-
-* The Pacemaker software must have been compiled with ACL support. If the
- output of the command `pacemakerd --features` contains `acls`, your
- installation supports ACLs.
-
-* Desired users must have user accounts in the +haclient+ group on all nodes in
- the cluster.
-
-* If your CIB was created before Pacemaker 1.1.12, it may need to be updated to
- the current schema using `cibadmin --upgrade` in order to use the syntax
- documented here.
-
-* The +enable-acl+ <<s-cluster-options,cluster option>> must be set to true.
-
-== ACL Configuration ==
-
-ACLs are specified within an +acls+ element of the CIB. The +acls+ element may
-contain any number of +acl_role+, +acl_target+, and +acl_group+ elements.
-
-== ACL Roles ==
-
-An ACL role is a collection of permissions allowing or denying access to
-particular portions of the CIB.
-
-.Properties of an ACL Role
-[width="95%",cols="1m,<3",options="header",align="center"]
-|====
-
-|Attribute
-|Description
-
-|id
-|A unique name for the role (required)
- indexterm:[id,acl_role]
- indexterm:[access control list,acl_role,id]
-
-|description
-|Arbitrary text (not used by Pacemaker)
- indexterm:[description,acl_role]
- indexterm:[access control list,acl_role,description]
-
-|====
-
-An +acl_role+ element may contain any number of +acl_permission+ elements.
-
-.Properties of an ACL Permission
-[width="95%",cols="1m,<3",options="header",align="center"]
-|====
-
-|Attribute
-|Description
-
-|id
-|A unique name for the permission (required)
- indexterm:[id,acl_permission]
- indexterm:[access control list,acl_permission,id]
-
-|description
-|Arbitrary text (not used by Pacemaker)
- indexterm:[description,acl_permission]
- indexterm:[access control list,acl_permission,description]
-
-|kind
-|The access being granted. Allowed values are +read+, +write+, and +deny+.
- A value of +write+ grants both read and write access.
- indexterm:[kind,acl_permission]
- indexterm:[access control list,acl_permission,kind]
-
-|object-type
-|The name of an XML element in the CIB to which the permission applies.
- (Exactly one of +object-type+, +xpath+, and +reference+ must be specified for
- a permission.)
- indexterm:[object-type,acl_permission]
- indexterm:[access control list,acl_permission,object-type]
-
-|attribute
-|If specified, the permission applies only to +object-type+ elements that have
- this attribute set (to any value). If not specified, the permission applies to
- all +object-type+ elements. May only be used with +object-type+.
- indexterm:[attribute,acl_permission]
- indexterm:[access control list,acl_permission,attribute]
-
-|reference
-|The ID of an XML element in the CIB to which the permission applies.
- (Exactly one of +object-type+, +xpath+, and +reference+ must be specified for
- a permission.)
- indexterm:[reference,acl_permission]
- indexterm:[access control list,acl_permission,reference]
-
-|xpath
-|An https://www.w3.org/TR/xpath-10/[XPath] specification selecting an XML
- element in the CIB to which the permission applies. Attributes may be
- specified in the XPath to select particular elements, but the permissions
- apply to the entire element.
- (Exactly one of +object-type+, +xpath+, and +reference+ must be specified for
- a permission.)
- indexterm:[xpath,acl_permission]
- indexterm:[access control list,acl_permission,xpath]
-
-|====
-
-[IMPORTANT]
-====
-* Permissions are applied to the selected XML element's entire XML subtree
- (all elements enclosed within it).
-
-* Write permission grants the ability to create, modify, or remove the element
- and its subtree, and also the ability to create any "scaffolding" elements
- (enclosing elements that do not have attributes other than an ID).
-
-* Permissions for more specific matches (more deeply nested elements) take
- precedence over more general ones.
-
-* If multiple permissions are configured for the same match (for example, in
- different roles applied to the same user), any +deny+ permission takes
- precedence, then +write+, then lastly +read+.
-====
-
-== ACL Targets and Groups ==
-
-ACL targets correspond to user accounts on the system.
-
-.Properties of an ACL Target
-[width="95%",cols="1m,<3",options="header",align="center"]
-|====
-
-|Attribute
-|Description
-
-|id
-|The name of a user on the system (required)
- indexterm:[id,acl_target]
- indexterm:[access control list,acl_target,id]
-
-|====
-
-ACL groups may be specified, but are not currently used by Pacemaker. This is
-expected to change in a future version.
-
-.Properties of an ACL Group
-[width="95%",cols="1m,<3",options="header",align="center"]
-|====
-
-|Attribute
-|Description
-
-|id
-|The name of a group on the system (required)
- indexterm:[id,acl_group]
- indexterm:[access control list,acl_group,id]
-
-|====
-
-Each +acl_target+ and +acl_group+ element may contain any number of +role+
-elements.
-
-.Properties of an ACL Role Reference
-[width="95%",cols="1m,<3",options="header",align="center"]
-|====
-
-|Attribute
-|Description
-
-|id
-|The +id+ of an +acl_role+ element that specifies permissions granted to the
- enclosing target or group
- indexterm:[id,role]
- indexterm:[access control list,role,id]
-
-|====
-
-[IMPORTANT]
-====
-The +root+ and +hacluster+ user accounts always have full access to the CIB,
-regardless of ACLs. For other user accounts, when +enable-acl+ is true,
-permission to all parts of the CIB is denied by default (permissions must be
-explicitly granted).
-====
-
-== ACL Examples ==
-
-[source,XML]
-----
-<acls>
-
- <acl_role id="read_all">
- <acl_permission id="read_all-cib" kind="read" xpath="/cib" />
- </acl_role>
-
- <acl_role id="operator">
-
- <acl_permission id="operator-maintenance-mode" kind="write"
- xpath="//crm_config//nvpair[@name='maintenance-mode']" />
-
- <acl_permission id="operator-maintenance-attr" kind="write"
- xpath="//nvpair[@name='maintenance']" />
-
- <acl_permission id="operator-target-role" kind="write"
- xpath="//resources//meta_attributes/nvpair[@name='target-role']" />
-
- <acl_permission id="operator-is-managed" kind="write"
- xpath="//resources//nvpair[@name='is-managed']" />
-
- <acl_permission id="operator-rsc_location" kind="write"
- object-type="rsc_location" />
-
- </acl_role>
-
- <acl_role id="administrator">
- <acl_permission id="administrator-cib" kind="write" xpath="/cib" />
- </acl_role>
-
- <acl_role id="minimal">
-
- <acl_permission id="minimal-standby" kind="read"
- description="allow reading standby node attribute (permanent or transient)"
- xpath="//instance_attributes/nvpair[@name='standby']"/>
-
- <acl_permission id="minimal-maintenance" kind="read"
- description="allow reading maintenance node attribute (permanent or transient)"
- xpath="//nvpair[@name='maintenance']"/>
-
- <acl_permission id="minimal-target-role" kind="read"
- description="allow reading resource target roles"
- xpath="//resources//meta_attributes/nvpair[@name='target-role']"/>
-
- <acl_permission id="minimal-is-managed" kind="read"
- description="allow reading resource managed status"
- xpath="//resources//meta_attributes/nvpair[@name='is-managed']"/>
-
- <acl_permission id="minimal-deny-instance-attributes" kind="deny"
- xpath="//instance_attributes"/>
-
- <acl_permission id="minimal-deny-meta-attributes" kind="deny"
- xpath="//meta_attributes"/>
-
- <acl_permission id="minimal-deny-operations" kind="deny"
- xpath="//operations"/>
-
- <acl_permission id="minimal-deny-utilization" kind="deny"
- xpath="//utilization"/>
-
- <acl_permission id="minimal-nodes" kind="read"
- description="allow reading node names/IDs (attributes are denied separately)"
- xpath="/cib/configuration/nodes"/>
-
- <acl_permission id="minimal-resources" kind="read"
- description="allow reading resource names/agents (parameters are denied separately)"
- xpath="/cib/configuration/resources"/>
-
- <acl_permission id="minimal-deny-constraints" kind="deny"
- xpath="/cib/configuration/constraints"/>
-
- <acl_permission id="minimal-deny-topology" kind="deny"
- xpath="/cib/configuration/fencing-topology"/>
-
- <acl_permission id="minimal-deny-op_defaults" kind="deny"
- xpath="/cib/configuration/op_defaults"/>
-
- <acl_permission id="minimal-deny-rsc_defaults" kind="deny"
- xpath="/cib/configuration/rsc_defaults"/>
-
- <acl_permission id="minimal-deny-alerts" kind="deny"
- xpath="/cib/configuration/alerts"/>
-
- <acl_permission id="minimal-deny-acls" kind="deny"
- xpath="/cib/configuration/acls"/>
-
- <acl_permission id="minimal-cib" kind="read"
- description="allow reading cib element and crm_config/status sections"
- xpath="/cib"/>
-
- </acl_role>
-
- <acl_target id="alice">
- <role id="minimal"/>
- </acl_target>
-
- <acl_target id="bob">
- <role id="read_all"/>
- </acl_target>
-
- <acl_target id="carol">
- <role id="read_all"/>
- <role id="operator"/>
- </acl_target>
-
- <acl_target id="dave">
- <role id="administrator"/>
- </acl_target>
-
-</acls>
-----
-
-In the above example, the user +alice+ has the minimal permissions necessary to
-run basic Pacemaker CLI tools, including using `crm_mon` to view the cluster
-status, without being able to modify anything. The user +bob+ can view the
-entire configuration and status of the cluster, but not make any changes. The
-user +carol+ can read everything, and change selected cluster properties as
-well as resource roles and location constraints. Finally, +dave+ has full read
-and write access to the entire CIB.
-
-Looking at the +minimal+ role in more depth, it is designed to allow read
-access to the +cib+ tag itself, while denying access to particular portions of
-its subtree (which is the entire CIB).
-
-This is because the DC node is indicated in the +cib+ tag, so `crm_mon` will
-not be able to report the DC otherwise. However, this does change the security
-model to allow by default, since any portions of the CIB not explicitly denied
-will be readable. The +cib+ read access could be removed and replaced with read
-access to just the +crm_config+ and +status+ sections, for a safer approach at
-the cost of not seeing the DC in status output.
-
-For a simpler configuration, the +minimal+ role allows read access to the
-entire +crm_config+ section, which contains cluster properties. It would be
-possible to allow read access to specific properties instead (such as
-+stonith-enabled+, +dc-uuid+, +have-quorum+, and +cluster-name+) to restrict
-access further while still allowing status output, but cluster properties are
-unlikely to be considered sensitive.
diff --git a/doc/Pacemaker_Explained/en-US/Ch-Advanced-Options.txt b/doc/Pacemaker_Explained/en-US/Ch-Advanced-Options.txt
deleted file mode 100644
index a8e38f214e..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ch-Advanced-Options.txt
+++ /dev/null
@@ -1,757 +0,0 @@
-:compat-mode: legacy
-= Advanced Configuration =
-
-[[s-recurring-start]]
-== Specifying When Recurring Actions are Performed ==
-
-
-By default, recurring actions are scheduled relative to when the
-resource started. So if your resource was last started at 14:32 and
-you have a backup set to be performed every 24 hours, then the backup
-will always run in the middle of the business day -- hardly
-desirable.
-
-To specify a date and time that the operation should be relative to, set
-the operation's +interval-origin+. The cluster uses this point to
-calculate the correct +start-delay+ such that the operation will occur
-at _origin + (interval * N)_.
-
-So, if the operation's interval is 24h, its interval-origin is set to
-02:00 and it is currently 14:32, then the cluster would initiate
-the operation with a start delay of 11 hours and 28 minutes. If the
-resource is moved to another node before 2am, then the operation is
-cancelled.
-
-The value specified for +interval+ and +interval-origin+ can be any
-date/time conforming to the
-http://en.wikipedia.org/wiki/ISO_8601[ISO8601 standard]. By way of
-example, to specify an operation that would run on the first Monday of
-2009 and every Monday after that, you would add:
-
-.Specifying a Base for Recurring Action Intervals
-=====
-[source,XML]
-<op id="my-weekly-action" name="custom-action" interval="P7D" interval-origin="2009-W01-1"/>
-=====
-
-[[s-failure-handling]]
-== Handling Resource Failure ==
-
-By default, Pacemaker will attempt to recover failed resources by restarting
-them. However, failure recovery is highly configurable.
-
-=== Failure Counts ===
-
-Pacemaker tracks resource failures for each combination of node, resource, and
-operation (start, stop, monitor, etc.).
-
-You can query the fail count for a particular node, resource, and/or operation
-using the `crm_failcount` command. For example, to see how many times the
-10-second monitor for +myrsc+ has failed on +node1+, run:
-
-----
-# crm_failcount --query -r myrsc -N node1 -n monitor -I 10s
-----
-
-If you omit the node, `crm_failcount` will use the local node. If you omit the
-operation and interval, `crm_failcount` will display the sum of the fail counts
-for all operations on the resource.
-
-You can use `crm_resource --cleanup` or `crm_failcount --delete` to clear
-fail counts. For example, to clear the above monitor failures, run:
-
-----
-# crm_resource --cleanup -r myrsc -N node1 -n monitor -I 10s
-----
-
-If you omit the resource, `crm_resource --cleanup` will clear failures for all
-resources. If you omit the node, it will clear failures on all nodes. If you
-omit the operation and interval, it will clear the failures for all operations
-on the resource.
-
-[NOTE]
-====
-Even when cleaning up only a single operation, all failed operations will
-disappear from the status display. This allows us to trigger a re-check of the
-resource's current status.
-====
-
-Higher-level tools may provide other commands for querying and clearing
-fail counts.
-
-The `crm_mon` tool shows the current cluster status, including any failed
-operations. To see the current fail counts for any failed resources, call
-`crm_mon` with the `--failcounts` option. This shows the fail counts per
-resource (that is, the sum of any operation fail counts for the resource).
-
-=== Failure Response ===
-
-Normally, if a running resource fails, pacemaker will try to stop it and start
-it again. Pacemaker will choose the best location to start it each time, which
-may be the same node that it failed on.
-
-However, if a resource fails repeatedly, it is possible that there is an
-underlying problem on that node, and you might desire trying a different node
-in such a case. Pacemaker allows you to set your preference via the
-+migration-threshold+ resource meta-attribute.
-footnote:[
-The naming of this option was perhaps unfortunate as it is easily
-confused with live migration, the process of moving a resource from
-one node to another without stopping it. Xen virtual guests are the
-most common example of resources that can be migrated in this manner.
-]
-
-If you define +migration-threshold=pass:[<replaceable>N</replaceable>]+ for a
-resource, it will be banned from the original node after 'N' failures.
-
-[NOTE]
-====
-The +migration-threshold+ is per 'resource', even though fail counts are
-tracked per 'operation'. The operation fail counts are added together
-to compare against the +migration-threshold+.
-====
-
-By default, fail counts remain until manually cleared by an administrator
-using `crm_resource --cleanup` or `crm_failcount --delete` (hopefully after
-first fixing the failure's cause). It is possible to have fail counts expire
-automatically by setting the +failure-timeout+ resource meta-attribute.
-
-[IMPORTANT]
-====
-A successful operation does not clear past failures. If a recurring monitor
-operation fails once, succeeds many times, then fails again days later, its
-fail count is 2. Fail counts are cleared only by manual intervention or
-falure timeout.
-====
-
-For example, a setting of +migration-threshold=2+ and +failure-timeout=60s+
-would cause the resource to move to a new node after 2 failures, and
-allow it to move back (depending on stickiness and constraint scores) after one
-minute.
-
-[NOTE]
-====
-+failure-timeout+ is measured since the most recent failure. That is, older
-failures do not individually time out and lower the fail count. Instead, all
-failures are timed out simultaneously (and the fail count is reset to 0) if
-there is no new failure for the timeout period.
-====
-
-There are two exceptions to the migration threshold concept:
-when a resource either fails to start or fails to stop.
-
-If the cluster property +start-failure-is-fatal+ is set to +true+ (which is the
-default), start failures cause the fail count to be set to +INFINITY+ and thus
-always cause the resource to move immediately.
-
-Stop failures are slightly different and crucial. If a resource fails
-to stop and STONITH is enabled, then the cluster will fence the node
-in order to be able to start the resource elsewhere. If STONITH is
-not enabled, then the cluster has no way to continue and will not try
-to start the resource elsewhere, but will try to stop it again after
-the failure timeout.
-
-== Moving Resources ==
-indexterm:[Moving,Resources]
-indexterm:[Resource,Moving]
-
-=== Moving Resources Manually ===
-
-There are primarily two occasions when you would want to move a
-resource from its current location: when the whole node is under
-maintenance, and when a single resource needs to be moved.
-
-==== Standby Mode ====
-
-Since everything eventually comes down to a score, you could create
-constraints for every resource to prevent them from running on one
-node. While pacemaker configuration can seem convoluted at times, not even
-we would require this of administrators.
-
-Instead, one can set a special node attribute which tells the cluster
-"don't let anything run here". There is even a helpful tool to help
-query and set it, called `crm_standby`. To check the standby status
-of the current machine, run:
-
-----
-# crm_standby -G
-----
-
-A value of +on+ indicates that the node is _not_ able to host any
-resources, while a value of +off+ says that it _can_.
-
-You can also check the status of other nodes in the cluster by
-specifying the `--node` option:
-
-----
-# crm_standby -G --node sles-2
-----
-
-To change the current node's standby status, use `-v` instead of `-G`:
-
-----
-# crm_standby -v on
-----
-
-Again, you can change another host's value by supplying a hostname with `--node`.
-
-A cluster node in standby mode will not run resources, but still contributes to
-quorum, and may fence or be fenced by nodes.
-
-==== Moving One Resource ====
-
-When only one resource is required to move, we could do this by creating
-location constraints. However, once again we provide a user-friendly
-shortcut as part of the `crm_resource` command, which creates and
-modifies the extra constraints for you. If +Email+ were running on
-+sles-1+ and you wanted it moved to a specific location, the command
-would look something like:
-
-----
-# crm_resource -M -r Email -H sles-2
-----
-
-Behind the scenes, the tool will create the following location constraint:
-
-[source,XML]
-<rsc_location rsc="Email" node="sles-2" score="INFINITY"/>
-
-It is important to note that subsequent invocations of `crm_resource
--M` are not cumulative. So, if you ran these commands
-
-----
-# crm_resource -M -r Email -H sles-2
-# crm_resource -M -r Email -H sles-3
-----
-
-then it is as if you had never performed the first command.
-
-To allow the resource to move back again, use:
-
-----
-# crm_resource -U -r Email
-----
-
-Note the use of the word _allow_. The resource can move back to its
-original location but, depending on +resource-stickiness+, it might
-stay where it is. To be absolutely certain that it moves back to
-+sles-1+, move it there before issuing the call to `crm_resource -U`:
-
-----
-# crm_resource -M -r Email -H sles-1
-# crm_resource -U -r Email
-----
-
-Alternatively, if you only care that the resource should be moved from
-its current location, try:
-
-----
-# crm_resource -B -r Email
-----
-
-Which will instead create a negative constraint, like
-
-[source,XML]
-<rsc_location rsc="Email" node="sles-1" score="-INFINITY"/>
-
-This will achieve the desired effect, but will also have long-term
-consequences. As the tool will warn you, the creation of a
-+-INFINITY+ constraint will prevent the resource from running on that
-node until `crm_resource -U` is used. This includes the situation
-where every other cluster node is no longer available!
-
-In some cases, such as when +resource-stickiness+ is set to
-+INFINITY+, it is possible that you will end up with the problem
-described in <<node-score-equal>>. The tool can detect
-some of these cases and deals with them by creating both
-positive and negative constraints. E.g.
-
-+Email+ prefers +sles-1+ with a score of +-INFINITY+
-
-+Email+ prefers +sles-2+ with a score of +INFINITY+
-
-which has the same long-term consequences as discussed earlier.
-
-=== Moving Resources Due to Connectivity Changes ===
-
-You can configure the cluster to move resources when external connectivity is
-lost in two steps.
-
-==== Tell Pacemaker to Monitor Connectivity ====
-
-First, add an *ocf:pacemaker:ping* resource to the cluster. The
-*ping* resource uses the system utility of the same name to a test whether
-list of machines (specified by DNS hostname or IPv4/IPv6 address) are
-reachable and uses the results to maintain a node attribute called +pingd+
-by default.
-footnote:[
-The attribute name is customizable, in order to allow multiple ping groups to be defined.
-]
-
-[NOTE]
-===========
-Older versions of Pacemaker used a different agent *ocf:pacemaker:pingd* which
-is now deprecated in favor of *ping*. If your version of Pacemaker does not
-contain the *ping* resource agent, download the latest version from
-https://github.com/ClusterLabs/pacemaker/tree/master/extra/resources/ping
-===========
-
-Normally, the ping resource should run on all cluster nodes, which means that
-you'll need to create a clone. A template for this can be found below
-along with a description of the most interesting parameters.
-
-.Common Options for a 'ping' Resource
-[width="95%",cols="1m,<4",options="header",align="center"]
-|=========================================================
-
-|Field
-|Description
-
-|dampen
-|The time to wait (dampening) for further changes to occur. Use this
- to prevent a resource from bouncing around the cluster when cluster
- nodes notice the loss of connectivity at slightly different times.
- indexterm:[dampen,Ping Resource Option]
- indexterm:[Ping Resource,Option,dampen]
-
-|multiplier
-|The number of connected ping nodes gets multiplied by this value to
- get a score. Useful when there are multiple ping nodes configured.
- indexterm:[multiplier,Ping Resource Option]
- indexterm:[Ping Resource,Option,multiplier]
-
-|host_list
-|The machines to contact in order to determine the current
- connectivity status. Allowed values include resolvable DNS host
- names, IPv4 and IPv6 addresses.
- indexterm:[host_list,Ping Resource Option]
- indexterm:[Ping Resource,Option,host_list]
-
-|=========================================================
-
-.An example ping cluster resource that checks node connectivity once every minute
-=====
-[source,XML]
-------------
-<clone id="Connected">
- <primitive id="ping" provider="pacemaker" class="ocf" type="ping">
- <instance_attributes id="ping-attrs">
- <nvpair id="pingd-dampen" name="dampen" value="5s"/>
- <nvpair id="pingd-multiplier" name="multiplier" value="1000"/>
- <nvpair id="pingd-hosts" name="host_list" value="my.gateway.com www.bigcorp.com"/>
- </instance_attributes>
- <operations>
- <op id="ping-monitor-60s" interval="60s" name="monitor"/>
- </operations>
- </primitive>
-</clone>
-------------
-=====
-
-[IMPORTANT]
-===========
-You're only half done. The next section deals with telling Pacemaker
-how to deal with the connectivity status that +ocf:pacemaker:ping+ is
-recording.
-===========
-
-==== Tell Pacemaker How to Interpret the Connectivity Data ====
-
-[IMPORTANT]
-======
-Before attempting the following, make sure you understand
-<<ch-rules>>.
-======
-
-There are a number of ways to use the connectivity data.
-
-The most common setup is for people to have a single ping
-target (e.g. the service network's default gateway), to prevent the cluster
-from running a resource on any unconnected node.
-
-.Don't run a resource on unconnected nodes
-=====
-[source,XML]
--------
-<rsc_location id="WebServer-no-connectivity" rsc="Webserver">
- <rule id="ping-exclude-rule" score="-INFINITY" >
- <expression id="ping-exclude" attribute="pingd" operation="not_defined"/>
- </rule>
-</rsc_location>
--------
-=====
-
-A more complex setup is to have a number of ping targets configured.
-You can require the cluster to only run resources on nodes that can
-connect to all (or a minimum subset) of them.
-
-.Run only on nodes connected to three or more ping targets.
-=====
-[source,XML]
--------
-<primitive id="ping" provider="pacemaker" class="ocf" type="ping">
-... <!-- omitting some configuration to highlight important parts -->
- <nvpair id="pingd-multiplier" name="multiplier" value="1000"/>
-...
-</primitive>
-...
-<rsc_location id="WebServer-connectivity" rsc="Webserver">
- <rule id="ping-prefer-rule" score="-INFINITY" >
- <expression id="ping-prefer" attribute="pingd" operation="lt" value="3000"/>
- </rule>
-</rsc_location>
--------
-=====
-
-Alternatively, you can tell the cluster only to _prefer_ nodes with the best
-connectivity. Just be sure to set +multiplier+ to a value higher than
-that of +resource-stickiness+ (and don't set either of them to
-+INFINITY+).
-
-.Prefer the node with the most connected ping nodes
-=====
-[source,XML]
--------
-<rsc_location id="WebServer-connectivity" rsc="Webserver">
- <rule id="ping-prefer-rule" score-attribute="pingd" >
- <expression id="ping-prefer" attribute="pingd" operation="defined"/>
- </rule>
-</rsc_location>
--------
-=====
-
-It is perhaps easier to think of this in terms of the simple
-constraints that the cluster translates it into. For example, if
-*sles-1* is connected to all five ping nodes but *sles-2* is only
-connected to two, then it would be as if you instead had the following
-constraints in your configuration:
-
-.How the cluster translates the above location constraint
-=====
-[source,XML]
--------
-<rsc_location id="ping-1" rsc="Webserver" node="sles-1" score="5000"/>
-<rsc_location id="ping-2" rsc="Webserver" node="sles-2" score="2000"/>
--------
-=====
-
-The advantage is that you don't have to manually update any
-constraints whenever your network connectivity changes.
-
-You can also combine the concepts above into something even more
-complex. The example below shows how you can prefer the node with the
-most connected ping nodes provided they have connectivity to at least
-three (again assuming that +multiplier+ is set to 1000).
-
-.A more complex example of choosing a location based on connectivity
-=====
-[source,XML]
--------
-<rsc_location id="WebServer-connectivity" rsc="Webserver">
- <rule id="ping-exclude-rule" score="-INFINITY" >
- <expression id="ping-exclude" attribute="pingd" operation="lt" value="3000"/>
- </rule>
- <rule id="ping-prefer-rule" score-attribute="pingd" >
- <expression id="ping-prefer" attribute="pingd" operation="defined"/>
- </rule>
-</rsc_location>
--------
-=====
-
-[[s-migrating-resources]]
-=== Migrating Resources ===
-
-Normally, when the cluster needs to move a resource, it fully restarts
-the resource (i.e. stops the resource on the current node
-and starts it on the new node).
-
-However, some types of resources, such as Xen virtual guests, are able to move to
-another location without loss of state (often referred to as live migration
-or hot migration). In pacemaker, this is called resource migration.
-Pacemaker can be configured to migrate a resource when moving it,
-rather than restarting it.
-
-Not all resources are able to migrate; see the Migration Checklist
-below, and those that can, won't do so in all situations.
-Conceptually, there are two requirements from which the other
-prerequisites follow:
-
-* The resource must be active and healthy at the old location; and
-* everything required for the resource to run must be available on
- both the old and new locations.
-
-The cluster is able to accommodate both 'push' and 'pull' migration models
-by requiring the resource agent to support two special actions:
-+migrate_to+ (performed on the current location) and +migrate_from+
-(performed on the destination).
-
-In push migration, the process on the current location transfers the
-resource to the new location where is it later activated. In this
-scenario, most of the work would be done in the +migrate_to+ action
-and, if anything, the activation would occur during +migrate_from+.
-
-Conversely for pull, the +migrate_to+ action is practically empty and
-+migrate_from+ does most of the work, extracting the relevant resource
-state from the old location and activating it.
-
-There is no wrong or right way for a resource agent to implement migration,
-as long as it works.
-
-.Migration Checklist
-* The resource may not be a clone.
-* The resource must use an OCF style agent.
-* The resource must not be in a failed or degraded state.
-* The resource agent must support +migrate_to+ and
- +migrate_from+ actions, and advertise them in its metadata.
-* The resource must have the +allow-migrate+ meta-attribute set to
- +true+ (which is not the default).
-
-If an otherwise migratable resource depends on another resource
-via an ordering constraint, there are special situations in which it will be
-restarted rather than migrated.
-
-For example, if the resource depends on a clone, and at the time the resource
-needs to be moved, the clone has instances that are stopping and instances
-that are starting, then the resource will be restarted. The scheduler is not
-yet able to model this situation correctly and so takes the safer (if less
-optimal) path.
-
-Also, if a migratable resource depends on a non-migratable resource, and both
-need to be moved, the migratable resource will be restarted.
-
-[[s-node-health]]
-== Tracking Node Health ==
-
-A node may be functioning adequately as far as cluster membership is concerned,
-and yet be "unhealthy" in some respect that makes it an undesirable location
-for resources. For example, a disk drive may be reporting SMART errors, or the
-CPU may be highly loaded.
-
-Pacemaker offers a way to automatically move resources off unhealthy nodes.
-
-=== Node Health Attributes ===
-
-Pacemaker will treat any node attribute whose name starts with +#health+ as an
-indicator of node health. Node health attributes may have one of the following
-values:
-
-.Allowed Values for Node Health Attributes
-[width="95%",cols="1,<3",options="header",align="center"]
-|=========================================================
-
-|Value
-|Intended significance
-
-|+red+
-|This indicator is unhealthy
- indexterm:[Node health,red]
-
-|+yellow+
-|This indicator is becoming unhealthy
- indexterm:[Node health,yellow]
-
-|+green+
-|This indicator is healthy
- indexterm:[Node health,green]
-
-|'integer'
-|A numeric score to apply to all resources on this node
- (0 or positive is healthy, negative is unhealthy)
- indexterm:[Node health,score]
-
-|=========================================================
-
-=== Node Health Strategy ===
-
-Pacemaker assigns a node health score to each node, as the sum of the values of
-all its node health attributes. This score will be used as a location
-constraint applied to this node for all resources.
-
-The +node-health-strategy+ cluster option controls how Pacemaker responds to
-changes in node health attributes, and how it translates +red+, +yellow+, and
-+green+ to scores.
-
-Allowed values are:
-
-.Node Health Strategies
-[width="95%",cols="1m,<3",options="header",align="center"]
-|=========================================================
-
-|Value
-|Effect
-
-|none
-|Do not track node health attributes at all.
- indexterm:[Node health,none]
-
-|migrate-on-red
-|Assign the value of +-INFINITY+ to +red+, and 0 to +yellow+ and +green+.
- This will cause all resources to move off the node if any attribute is +red+.
- indexterm:[Node health,migrate-on-red]
-
-|only-green
-|Assign the value of +-INFINITY+ to +red+ and +yellow+, and 0 to +green+.
- This will cause all resources to move off the node if any attribute is +red+
- or +yellow+.
- indexterm:[Node health,only-green]
-
-|progressive
-|Assign the value of the +node-health-red+ cluster option to +red+, the value
- of +node-health-yellow+ to +yellow+, and the value of +node-health-green+ to
- +green+. Each node is additionally assigned a score of +node-health-base+
- (this allows resources to start even if some attributes are +yellow+). This
- strategy gives the administrator finer control over how important each value
- is.
- indexterm:[Node health,progressive]
-
-|custom
-|Track node health attributes using the same values as +progressive+ for
- +red+, +yellow+, and +green+, but do not take them into account.
- The administrator is expected to implement a policy by defining rules
- (see <<ch-rules>>) referencing node health attributes.
- indexterm:[Node health,custom]
-
-|=========================================================
-
-=== Measuring Node Health ===
-
-Since Pacemaker calculates node health based on node attributes,
-any method that sets node attributes may be used to measure node
-health. The most common ways are resource agents or separate daemons.
-
-Pacemaker provides examples that can be used directly or as a basis for
-custom code. The +ocf:pacemaker:HealthCPU+ and +ocf:pacemaker:HealthSMART+
-resource agents set node health attributes based on CPU and disk parameters.
-The +ipmiservicelogd+ daemon sets node health attributes based on IPMI
-values (the +ocf:pacemaker:SystemHealth+ resource agent can be used to manage
-the daemon as a cluster resource).
-
-In order to take advantage of this feature - firstly add the resource to your cluster, preferably as a cloned resource to constantly measure health on all nodes:
-
-=====
-[source,XML]
-------------
-<clone id="resHealthIOWait-clone">
- <primitive class="ocf" id="HealthIOWait" provider="pacemaker" type="HealthIOWait">
- <instance_attributes id="resHealthIOWait-instance_attributes">
- <nvpair id="resHealthIOWait-instance_attributes-red_limit" name="red_limit" value="30"/>
- <nvpair id="resHealthIOWait-instance_attributes-yellow_limit" name="yellow_limit" value="10"/>
- </instance_attributes>
- <operations>
- <op id="resHealthIOWait-monitor-interval-5" interval="5" name="monitor" timeout="5"/>
- <op id="resHealthIOWait-start-interval-0s" interval="0s" name="start" timeout="10s"/>
- <op id="resHealthIOWait-stop-interval-0s" interval="0s" name="stop" timeout="10s"/>
- </operations>
- </primitive>
-</clone>
-------------
-=====
-
-This way attrd_updater will set proper status for each node running this resource. Any attribute matching "#health-[a-zA-z]+" will force cluster to migrate all resources from unhealthy node and place it on other nodes according to all constraints defined in your cluster.
-
-When the node is no longer faulty you can force the cluster to restart the cloned resource on faulty node and make it available to take resources, in this case since we are using HealthIOWait provider:
-
-----
-# attrd_updater -n "#health-iowait" -U "green" --node="<nodename>" -d "60s"
-----
-
-== Reloading Services After a Definition Change ==
-
-The cluster automatically detects changes to the definition of
-services it manages. The normal response is to stop the
-service (using the old definition) and start it again (with the new
-definition). This works well, but some services are smarter and can
-be told to use a new set of options without restarting.
-
-To take advantage of this capability, the resource agent must:
-
-. Accept the +reload+ operation and perform any required actions.
- _The actions here depend completely on your application!_
-+
-.The DRBD agent's logic for supporting +reload+
-=====
-[source,Bash]
--------
-case $1 in
- start)
- drbd_start
- ;;
- stop)
- drbd_stop
- ;;
- reload)
- drbd_reload
- ;;
- monitor)
- drbd_monitor
- ;;
- *)
- drbd_usage
- exit $OCF_ERR_UNIMPLEMENTED
- ;;
-esac
-exit $?
--------
-=====
-. Advertise the +reload+ operation in the +actions+ section of its metadata
-+
-.The DRBD Agent Advertising Support for the +reload+ Operation
-=====
-[source,XML]
--------
-<?xml version="1.0"?>
- <!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
- <resource-agent name="drbd">
- <version>1.1</version>
-
- <longdesc lang="en">
- Master/Slave OCF Resource Agent for DRBD
- </longdesc>
-
- ...
-
- <actions>
- <action name="start" timeout="240" />
- <action name="reload" timeout="240" />
- <action name="promote" timeout="90" />
- <action name="demote" timeout="90" />
- <action name="notify" timeout="90" />
- <action name="stop" timeout="100" />
- <action name="meta-data" timeout="5" />
- <action name="validate-all" timeout="30" />
- </actions>
- </resource-agent>
--------
-=====
-. Advertise one or more parameters that can take effect using +reload+.
-+
-Any parameter with the +unique+ set to 0 is eligible to be used in this way.
-+
-.Parameter that can be changed using reload
-=====
-[source,XML]
--------
-<parameter name="drbdconf" unique="0">
- <longdesc lang="en">Full path to the drbd.conf file.</longdesc>
- <shortdesc lang="en">Path to drbd.conf</shortdesc>
- <content type="string" default="${OCF_RESKEY_drbdconf_default}"/>
-</parameter>
--------
-=====
-
-Once these requirements are satisfied, the cluster will automatically
-know to reload the resource (instead of restarting) when a non-unique
-field changes.
-
-[NOTE]
-======
-Metadata will not be re-read unless the resource needs to be started. This may
-mean that the resource will be restarted the first time, even though you
-changed a parameter with +unique=0+.
-======
-
-[NOTE]
-======
-If both a unique and non-unique field are changed simultaneously, the
-resource will still be restarted.
-======
diff --git a/doc/Pacemaker_Explained/en-US/Ch-Advanced-Resources.txt b/doc/Pacemaker_Explained/en-US/Ch-Advanced-Resources.txt
deleted file mode 100644
index c80a7b479f..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ch-Advanced-Resources.txt
+++ /dev/null
@@ -1,1478 +0,0 @@
-:compat-mode: legacy
-= Advanced Resource Types =
-
-[[group-resources]]
-== Groups - A Syntactic Shortcut ==
-indexterm:[Group Resources]
-indexterm:[Resource,Groups]
-
-
-One of the most common elements of a cluster is a set of resources
-that need to be located together, start sequentially, and stop in the
-reverse order. To simplify this configuration, we support the concept
-of groups.
-
-.A group of two primitive resources
-======
-[source,XML]
--------
-<group id="shortcut">
- <primitive id="Public-IP" class="ocf" type="IPaddr" provider="heartbeat">
- <instance_attributes id="params-public-ip">
- <nvpair id="public-ip-addr" name="ip" value="192.0.2.2"/>
- </instance_attributes>
- </primitive>
- <primitive id="Email" class="lsb" type="exim"/>
-</group>
--------
-======
-
-
-Although the example above contains only two resources, there is no
-limit to the number of resources a group can contain. The example is
-also sufficient to explain the fundamental properties of a group:
-
-* Resources are started in the order they appear in (+Public-IP+
- first, then +Email+)
-* Resources are stopped in the reverse order to which they appear in
- (+Email+ first, then +Public-IP+)
-
-If a resource in the group can't run anywhere, then nothing after that
-is allowed to run, too.
-
-* If +Public-IP+ can't run anywhere, neither can +Email+;
-* but if +Email+ can't run anywhere, this does not affect +Public-IP+
- in any way
-
-The group above is logically equivalent to writing:
-
-.How the cluster sees a group resource
-======
-[source,XML]
--------
-<configuration>
- <resources>
- <primitive id="Public-IP" class="ocf" type="IPaddr" provider="heartbeat">
- <instance_attributes id="params-public-ip">
- <nvpair id="public-ip-addr" name="ip" value="192.0.2.2"/>
- </instance_attributes>
- </primitive>
- <primitive id="Email" class="lsb" type="exim"/>
- </resources>
- <constraints>
- <rsc_colocation id="xxx" rsc="Email" with-rsc="Public-IP" score="INFINITY"/>
- <rsc_order id="yyy" first="Public-IP" then="Email"/>
- </constraints>
-</configuration>
--------
-======
-
-Obviously as the group grows bigger, the reduced configuration effort
-can become significant.
-
-Another (typical) example of a group is a DRBD volume, the filesystem
-mount, an IP address, and an application that uses them.
-
-=== Group Properties ===
-.Properties of a Group Resource
-[width="95%",cols="3m,<5",options="header",align="center"]
-|=========================================================
-
-|Field
-|Description
-
-|id
-|A unique name for the group
- indexterm:[id,Group Resource Property]
- indexterm:[Resource,Group Property,id]
-
-|=========================================================
-
-=== Group Options ===
-
-Groups inherit the +priority+, +target-role+, and +is-managed+ properties
-from primitive resources. See <<s-resource-options>> for information about
-those properties.
-
-=== Group Instance Attributes ===
-
-Groups have no instance attributes. However, any that are set for the group
-object will be inherited by the group's children.
-
-=== Group Contents ===
-
-Groups may only contain a collection of cluster resources (see
-<<primitive-resource>>). To refer to a child of a group resource, just use
-the child's +id+ instead of the group's.
-
-=== Group Constraints ===
-
-Although it is possible to reference a group's children in
-constraints, it is usually preferable to reference the group itself.
-
-.Some constraints involving groups
-======
-[source,XML]
--------
-<constraints>
- <rsc_location id="group-prefers-node1" rsc="shortcut" node="node1" score="500"/>
- <rsc_colocation id="webserver-with-group" rsc="Webserver" with-rsc="shortcut"/>
- <rsc_order id="start-group-then-webserver" first="Webserver" then="shortcut"/>
-</constraints>
--------
-======
-
-=== Group Stickiness ===
-indexterm:[resource-stickiness,Groups]
-
-Stickiness, the measure of how much a resource wants to stay where it
-is, is additive in groups. Every active resource of the group will
-contribute its stickiness value to the group's total. So if the
-default +resource-stickiness+ is 100, and a group has seven members,
-five of which are active, then the group as a whole will prefer its
-current location with a score of 500.
-
-[[s-resource-clone]]
-== Clones - Resources That Can Have Multiple Active Instances ==
-indexterm:[Clone Resources]
-indexterm:[Resource,Clones]
-
-'Clone' resources are resources that can have more than one copy active at the
-same time. This allows you, for example, to run a copy of a daemon on every
-node. You can clone any primitive or group resource.
-footnote:[
-Of course, the service must support running multiple instances.
-]
-
-=== Anonymous versus Unique Clones ===
-
-A clone resource is configured to be either 'anonymous' or 'globally unique'.
-
-Anonymous clones are the simplest. These behave completely identically
-everywhere they are running. Because of this, there can be only one instance of
-an anonymous clone active per node.
-
-The instances of globally unique clones are distinct entities. All instances
-are launched identically, but one instance of the clone is not identical to any
-other instance, whether running on the same node or a different node. As an
-example, a cloned IP address can use special kernel functionality such that
-each instance handles a subset of requests for the same IP address.
-
-[[s-resource-promotable]]
-=== Promotable clones ===
-
-indexterm:[Promotable Clone Resources]
-indexterm:[Resource,Promotable]
-
-If a clone is 'promotable', its instances can perform a special role that
-Pacemaker will manage via the +promote+ and +demote+ actions of the resource
-agent.
-
-Services that support such a special role have various terms for the special
-role and the default role: primary and secondary, master and replica,
-controller and worker, etc. Pacemaker uses the terms 'master' and 'slave',
-footnote:[
-These are historical terms that will eventually be replaced, but the extensive
-use of them and the need for backward compatibility makes it a long process.
-You may see examples using a +master+ tag instead of a +clone+ tag with the
-+promotable+ meta-attribute set to +true+; the +master+ tag is supported, but
-deprecated, and will be removed in a future version. You may also see such
-services referred to as 'multi-state' or 'stateful'; these means the same thing
-as 'promotable'.
-]
-but is agnostic to what the service calls them or what they do.
-
-All that Pacemaker cares about is that an instance comes up in the default role
-when started, and the resource agent supports the +promote+ and +demote+ actions
-to manage entering and exiting the special role.
-
-=== Clone Properties ===
-
-.Properties of a Clone Resource
-[width="95%",cols="3m,<5",options="header",align="center"]
-|=========================================================
-
-|Field
-|Description
-
-|id
-|A unique name for the clone
- indexterm:[id,Clone Property]
- indexterm:[Clone,Property,id]
-
-|=========================================================
-
-=== Clone Options ===
-
-<<s-resource-options,Options>> inherited from primitive resources:
-+priority, target-role, is-managed+
-
-.Clone-specific configuration options
-[width="95%",cols="1m,1,<3",options="header",align="center"]
-|=========================================================
-
-|Field
-|Default
-|Description
-
-|globally-unique
-|false
-|If +true+, each clone instance performs a distinct function
- indexterm:[globally-unique,Clone Option]
- indexterm:[Clone,Option,globally-unique]
-
-|clone-max
-|number of nodes in cluster
-|The maximum number of clone instances that can be started across the entire
- cluster
- indexterm:[clone-max,Clone Option]
- indexterm:[Clone,Option,clone-max]
-
-|clone-node-max
-|1
-|If +globally-unique+ is +true+, the maximum number of clone instances that can
- be started on a single node
- indexterm:[clone-node-max,Clone Option]
- indexterm:[Clone,Option,clone-node-max]
-
-|clone-min
-|0
-|Require at least this number of clone instances to be runnable before allowing
- resources depending on the clone to be runnable. A value of 0 means require
- all clone instances to be runnable.
- indexterm:[clone-min,Clone Option]
- indexterm:[Clone,Option,clone-min]
-
-|notify
-|false
-|Call the resource agent's +notify+ action for all active instances, before and
- after starting or stopping any clone instance. The resource agent must support
- this action. Allowed values: +false+, +true+
- indexterm:[notify,Clone Option]
- indexterm:[Clone,Option,notify]
-
-|ordered
-|false
-|If +true+, clone instances must be started sequentially instead of in parallel
- Allowed values: +false+, +true+
- indexterm:[ordered,Clone Option]
- indexterm:[Clone,Option,ordered]
-
-|interleave
-|false
-|When this clone is ordered relative to another clone, if this option is
- +false+ (the default), the ordering is relative to 'all' instances of the
- other clone, whereas if this option is +true+, the ordering is relative only
- to instances on the same node.
- Allowed values: +false+, +true+
- indexterm:[interleave,Clone Option]
- indexterm:[Clone,Option,interleave]
-
-|promotable
-|false
-|If +true+, clone instances can perform a special role that Pacemaker will
- manage via the resource agent's +promote+ and +demote+ actions. The resource
- agent must support these actions.
- Allowed values: +false+, +true+
- indexterm:[promotable,Clone Option]
- indexterm:[Clone,Option,promotable]
-
-|promoted-max
-|1
-|If +promotable+ is +true+, the number of instances that can be promoted at one
- time across the entire cluster
- indexterm:[promoted-max,Clone Option]
- indexterm:[Clone,Option,promoted-max]
-
-|promoted-node-max
-|1
-|If +promotable+ is +true+ and +globally-unique+ is +false+, the number of
- clone instances can be promoted at one time on a single node
- indexterm:[promoted-node-max,Clone Option]
- indexterm:[Clone,Option,promoted-node-max]
-
-|=========================================================
-
-For backward compatibility, +master-max+ and +master-node-max+ are accepted as
-aliases for +promoted-max+ and +promoted-node-max+, but are deprecated since
-2.0.0, and support for them will be removed in a future version.
-
-=== Clone Contents ===
-
-Clones must contain exactly one primitive or group resource.
-
-.A clone that runs a web server on all nodes
-====
-[source,XML]
-----
-<clone id="apache-clone">
- <primitive id="apache" class="lsb" type="apache">
- <operations>
- <op id="apache-monitor" name="monitor" interval="30"/>
- </operations>
- </primitive>
-</clone>
-----
-====
-
-[WARNING]
-You should never reference the name of a clone's child (the primitive or group
-resource being cloned). If you think you need to do this, you probably need to
-re-evaluate your design.
-
-=== Clone Instance Attributes ===
-
-Clones have no instance attributes; however, any that are set here will be
-inherited by the clone's child.
-
-=== Clone Constraints ===
-
-In most cases, a clone will have a single instance on each active cluster
-node. If this is not the case, you can indicate which nodes the
-cluster should preferentially assign copies to with resource location
-constraints. These constraints are written no differently from those
-for primitive resources except that the clone's +id+ is used.
-
-.Some constraints involving clones
-======
-[source,XML]
--------
-<constraints>
- <rsc_location id="clone-prefers-node1" rsc="apache-clone" node="node1" score="500"/>
- <rsc_colocation id="stats-with-clone" rsc="apache-stats" with="apache-clone"/>
- <rsc_order id="start-clone-then-stats" first="apache-clone" then="apache-stats"/>
-</constraints>
--------
-======
-
-Ordering constraints behave slightly differently for clones. In the
-example above, +apache-stats+ will wait until all copies of +apache-clone+
-that need to be started have done so before being started itself.
-Only if _no_ copies can be started will +apache-stats+ be prevented
-from being active. Additionally, the clone will wait for
-+apache-stats+ to be stopped before stopping itself.
-
-Colocation of a primitive or group resource with a clone means that
-the resource can run on any node with an active instance of the clone.
-The cluster will choose an instance based on where the clone is running and
-the resource's own location preferences.
-
-Colocation between clones is also possible. If one clone +A+ is colocated
-with another clone +B+, the set of allowed locations for +A+ is limited to
-nodes on which +B+ is (or will be) active. Placement is then performed
-normally.
-
-==== Promotable Clone Constraints ====
-
-For promotable clone resources, the +first-action+ and/or +then-action+ fields
-for ordering constraints may be set to +promote+ or +demote+ to constrain the
-master role, and colocation constraints may contain +rsc-role+ and/or
-+with-rsc-role+ fields.
-
-.Additional colocation constraint options for promotable clone resources
-[width="95%",cols="1m,1,<3",options="header",align="center"]
-|=========================================================
-
-|Field
-|Default
-|Description
-
-|rsc-role
-|Started
-|An additional attribute of colocation constraints that specifies the
- role that +rsc+ must be in. Allowed values: +Started+, +Master+,
- +Slave+.
- indexterm:[rsc-role,Ordering Constraints]
- indexterm:[Constraints,Ordering,rsc-role]
-
-|with-rsc-role
-|Started
-|An additional attribute of colocation constraints that specifies the
- role that +with-rsc+ must be in. Allowed values: +Started+,
- +Master+, +Slave+.
- indexterm:[with-rsc-role,Ordering Constraints]
- indexterm:[Constraints,Ordering,with-rsc-role]
-
-|=========================================================
-
-.Constraints involving promotable clone resources
-======
-[source,XML]
--------
-<constraints>
- <rsc_location id="db-prefers-node1" rsc="database" node="node1" score="500"/>
- <rsc_colocation id="backup-with-db-slave" rsc="backup"
- with-rsc="database" with-rsc-role="Slave"/>
- <rsc_colocation id="myapp-with-db-master" rsc="myApp"
- with-rsc="database" with-rsc-role="Master"/>
- <rsc_order id="start-db-before-backup" first="database" then="backup"/>
- <rsc_order id="promote-db-then-app" first="database" first-action="promote"
- then="myApp" then-action="start"/>
-</constraints>
--------
-======
-
-In the example above, +myApp+ will wait until one of the database
-copies has been started and promoted to master before being started
-itself on the same node. Only if no copies can be promoted will +myApp+ be
-prevented from being active. Additionally, the cluster will wait for
-+myApp+ to be stopped before demoting the database.
-
-Colocation of a primitive or group resource with a promotable clone
-resource means that it can run on any node with an active instance of
-the promotable clone resource that has the specified role (+master+ or
-+slave+). In the example above, the cluster will choose a location based on
-where database is running as a +master+, and if there are multiple
-+master+ instances it will also factor in +myApp+'s own location
-preferences when deciding which location to choose.
-
-Colocation with regular clones and other promotable clone resources is also
-possible. In such cases, the set of allowed locations for the +rsc+
-clone is (after role filtering) limited to nodes on which the
-+with-rsc+ promotable clone resource is (or will be) in the specified role.
-Placement is then performed as normal.
-
-==== Using Promotable Clone Resources in Colocation Sets ====
-
-.Additional colocation set options relevant to promotable clone resources
-[width="95%",cols="1m,1,<6",options="header",align="center"]
-|=========================================================
-
-|Field
-|Default
-|Description
-
-|role
-|Started
-|The role that 'all members' of the set must be in. Allowed values: +Started+, +Master+,
- +Slave+.
- indexterm:[role,Ordering Constraints]
- indexterm:[Constraints,Ordering,role]
-
-|=========================================================
-
-In the following example +B+'s master must be located on the same node as +A+'s master.
-Additionally resources +C+ and +D+ must be located on the same node as +A+'s
-and +B+'s masters.
-
-.Colocate C and D with A's and B's master instances
-======
-[source,XML]
--------
-<constraints>
- <rsc_colocation id="coloc-1" score="INFINITY" >
- <resource_set id="colocated-set-example-1" sequential="true" role="Master">
- <resource_ref id="A"/>
- <resource_ref id="B"/>
- </resource_set>
- <resource_set id="colocated-set-example-2" sequential="true">
- <resource_ref id="C"/>
- <resource_ref id="D"/>
- </resource_set>
- </rsc_colocation>
-</constraints>
--------
-======
-
-==== Using Promotable Clone Resources in Ordered Sets ====
-
-.Additional ordered set options relevant to promotable clone resources
-[width="95%",cols="1m,1,<3",options="header",align="center"]
-|=========================================================
-
-|Field
-|Default
-|Description
-
-|action
-|value of +first-action+
-|An additional attribute of ordering constraint sets that specifies the
- action that applies to 'all members' of the set. Allowed
- values: +start+, +stop+, +promote+, +demote+.
- indexterm:[action,Ordering Constraints]
- indexterm:[Constraints,Ordering,action]
-
-|=========================================================
-
-.Start C and D after first promoting A and B
-======
-[source,XML]
--------
-<constraints>
- <rsc_order id="order-1" score="INFINITY" >
- <resource_set id="ordered-set-1" sequential="true" action="promote">
- <resource_ref id="A"/>
- <resource_ref id="B"/>
- </resource_set>
- <resource_set id="ordered-set-2" sequential="true" action="start">
- <resource_ref id="C"/>
- <resource_ref id="D"/>
- </resource_set>
- </rsc_order>
-</constraints>
--------
-======
-
-In the above example, +B+ cannot be promoted to a master role until +A+ has
-been promoted. Additionally, resources +C+ and +D+ must wait until +A+ and +B+
-have been promoted before they can start.
-
-
-[[s-clone-stickiness]]
-=== Clone Stickiness ===
-
-indexterm:[resource-stickiness,Clones]
-
-To achieve a stable allocation pattern, clones are slightly sticky by
-default. If no value for +resource-stickiness+ is provided, the clone
-will use a value of 1. Being a small value, it causes minimal
-disturbance to the score calculations of other resources but is enough
-to prevent Pacemaker from needlessly moving copies around the cluster.
-
-[NOTE]
-====
-For globally unique clones, this may result in multiple instances of the
-clone staying on a single node, even after another eligible node becomes
-active (for example, after being put into standby mode then made active again).
-If you do not want this behavior, specify a +resource-stickiness+ of 0
-for the clone temporarily and let the cluster adjust, then set it back
-to 1 if you want the default behavior to apply again.
-====
-
-[IMPORTANT]
-====
-If +resource-stickiness+ is set in the +rsc_defaults+ section, it will
-apply to clone instances as well. This means an explicit +resource-stickiness+
-of 0 in +rsc_defaults+ works differently from the implicit default used when
-+resource-stickiness+ is not specified.
-====
-
-=== Clone Resource Agent Requirements ===
-
-Any resource can be used as an anonymous clone, as it requires no
-additional support from the resource agent. Whether it makes sense to
-do so depends on your resource and its resource agent.
-
-==== Resource Agent Requirements for Globally Unique Clones ====
-
-Globally unique clones require additional support in the resource agent. In
-particular, it must only respond with +$\{OCF_SUCCESS}+ if the node has that
-exact instance active. All other probes for instances of the clone should
-result in +$\{OCF_NOT_RUNNING}+ (or one of the other OCF error codes if
-they are failed).
-
-Individual instances of a clone are identified by appending a colon and a
-numerical offset, e.g. +apache:2+.
-
-Resource agents can find out how many copies there are by examining
-the +OCF_RESKEY_CRM_meta_clone_max+ environment variable and which
-instance it is by examining +OCF_RESKEY_CRM_meta_clone+.
-
-The resource agent must not make any assumptions (based on
-+OCF_RESKEY_CRM_meta_clone+) about which numerical instances are active. In
-particular, the list of active copies will not always be an unbroken
-sequence, nor always start at 0.
-
-==== Resource Agent Requirements for Promotable Clones ====
-
-Promotable clone resources require two extra actions, +demote+ and +promote+,
-which are responsible for changing the state of the resource. Like +start+ and
-+stop+, they should return +$\{OCF_SUCCESS}+ if they completed successfully or
-a relevant error code if they did not.
-
-The states can mean whatever you wish, but when the resource is
-started, it must come up in the mode called +slave+. From there the
-cluster will decide which instances to promote to +master+.
-
-In addition to the clone requirements for monitor actions, agents must
-also _accurately_ report which state they are in. The cluster relies
-on the agent to report its status (including role) accurately and does
-not indicate to the agent what role it currently believes it to be in.
-
-.Role implications of OCF return codes
-[width="95%",cols="1,<1",options="header",align="center"]
-|=========================================================
-
-|Monitor Return Code
-|Description
-
-|OCF_NOT_RUNNING
-|Stopped
- indexterm:[Return Code,OCF_NOT_RUNNING]
-
-|OCF_SUCCESS
-|Running (Slave)
- indexterm:[Return Code,OCF_SUCCESS]
-
-|OCF_RUNNING_MASTER
-|Running (Master)
- indexterm:[Return Code,OCF_RUNNING_MASTER]
-
-|OCF_FAILED_MASTER
-|Failed (Master)
- indexterm:[Return Code,OCF_FAILED_MASTER]
-
-|Other
-|Failed (Slave)
-
-|=========================================================
-
-==== Clone Notifications ====
-
-If the clone has the +notify+ meta-attribute set to +true+, and the resource
-agent supports the +notify+ action, Pacemaker will call the action when
-appropriate, passing a number of extra variables which, when combined with
-additional context, can be used to calculate the current state of the cluster
-and what is about to happen to it.
-
-.Environment variables supplied with Clone notify actions
-[width="95%",cols="5,<3",options="header",align="center"]
-|=========================================================
-
-|Variable
-|Description
-
-|OCF_RESKEY_CRM_meta_notify_type
-|Allowed values: +pre+, +post+
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,type]
- indexterm:[type,Notification Environment Variable]
-
-|OCF_RESKEY_CRM_meta_notify_operation
-|Allowed values: +start+, +stop+
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,operation]
- indexterm:[operation,Notification Environment Variable]
-
-|OCF_RESKEY_CRM_meta_notify_start_resource
-|Resources to be started
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,start_resource]
- indexterm:[start_resource,Notification Environment Variable]
-
-|OCF_RESKEY_CRM_meta_notify_stop_resource
-|Resources to be stopped
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,stop_resource]
- indexterm:[stop_resource,Notification Environment Variable]
-
-|OCF_RESKEY_CRM_meta_notify_active_resource
-|Resources that are running
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,active_resource]
- indexterm:[active_resource,Notification Environment Variable]
-
-|OCF_RESKEY_CRM_meta_notify_inactive_resource
-|Resources that are not running
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,inactive_resource]
- indexterm:[inactive_resource,Notification Environment Variable]
-
-|OCF_RESKEY_CRM_meta_notify_start_uname
-|Nodes on which resources will be started
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,start_uname]
- indexterm:[start_uname,Notification Environment Variable]
-
-|OCF_RESKEY_CRM_meta_notify_stop_uname
-|Nodes on which resources will be stopped
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,stop_uname]
- indexterm:[stop_uname,Notification Environment Variable]
-
-|OCF_RESKEY_CRM_meta_notify_active_uname
-|Nodes on which resources are running
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,active_uname]
- indexterm:[active_uname,Notification Environment Variable]
-
-|=========================================================
-
-The variables come in pairs, such as
-+OCF_RESKEY_CRM_meta_notify_start_resource+ and
-+OCF_RESKEY_CRM_meta_notify_start_uname+, and should be treated as an
-array of whitespace-separated elements.
-
-+OCF_RESKEY_CRM_meta_notify_inactive_resource+ is an exception, as the
-matching +uname+ variable does not exist since inactive resources
-are not running on any node.
-
-Thus, in order to indicate that +clone:0+ will be started on +sles-1+,
-+clone:2+ will be started on +sles-3+, and +clone:3+ will be started
-on +sles-2+, the cluster would set:
-
-.Notification variables
-======
-[source,Bash]
--------
-OCF_RESKEY_CRM_meta_notify_start_resource="clone:0 clone:2 clone:3"
-OCF_RESKEY_CRM_meta_notify_start_uname="sles-1 sles-3 sles-2"
--------
-======
-
-[NOTE]
-====
-Pacemaker will log but otherwise ignore failures of notify actions.
-====
-
-==== Interpretation of Notification Variables ====
-
-.Pre-notification (stop):
-
-* Active resources: +$OCF_RESKEY_CRM_meta_notify_active_resource+
-* Inactive resources: +$OCF_RESKEY_CRM_meta_notify_inactive_resource+
-* Resources to be started: +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* Resources to be stopped: +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-
-
-.Post-notification (stop) / Pre-notification (start):
-
-* Active resources
-** +$OCF_RESKEY_CRM_meta_notify_active_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-* Inactive resources
-** +$OCF_RESKEY_CRM_meta_notify_inactive_resource+
-** plus +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-* Resources that were started: +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* Resources that were stopped: +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-
-
-.Post-notification (start):
-
-* Active resources:
-** +$OCF_RESKEY_CRM_meta_notify_active_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-** plus +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* Inactive resources:
-** +$OCF_RESKEY_CRM_meta_notify_inactive_resource+
-** plus +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* Resources that were started: +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* Resources that were stopped: +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-
-==== Extra Notifications for Promotable Clones ====
-
-.Extra environment variables supplied for promotable clones
-[width="95%",cols="5,<3",options="header",align="center"]
-|=========================================================
-
-|Variable
-|Description
-
-|OCF_RESKEY_CRM_meta_notify_master_resource
-|Resources that are running in +Master+ mode
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,master_resource]
- indexterm:[master_resource,Notification Environment Variable]
-
-|OCF_RESKEY_CRM_meta_notify_slave_resource
-|Resources that are running in +Slave+ mode
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,slave_resource]
- indexterm:[slave_resource,Notification Environment Variable]
-
-|OCF_RESKEY_CRM_meta_notify_promote_resource
-|Resources to be promoted
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,promote_resource]
- indexterm:[promote_resource,Notification Environment Variable]
-
-|OCF_RESKEY_CRM_meta_notify_demote_resource
-|Resources to be demoted
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,demote_resource]
- indexterm:[demote_resource,Notification Environment Variable]
-
-|OCF_RESKEY_CRM_meta_notify_promote_uname
-|Nodes on which resources will be promoted
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,promote_uname]
- indexterm:[promote_uname,Notification Environment Variable]
-
-|OCF_RESKEY_CRM_meta_notify_demote_uname
-|Nodes on which resources will be demoted
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,demote_uname]
- indexterm:[demote_uname,Notification Environment Variable]
-
-|OCF_RESKEY_CRM_meta_notify_master_uname
-|Nodes on which resources are running in +Master+ mode
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,master_uname]
- indexterm:[master_uname,Notification Environment Variable]
-
-|OCF_RESKEY_CRM_meta_notify_slave_uname
-|Nodes on which resources are running in +Slave+ mode
- indexterm:[Environment Variable,OCF_RESKEY_CRM_meta_notify_,slave_uname]
- indexterm:[slave_uname,Notification Environment Variable]
-
-|=========================================================
-
-==== Interpretation of Promotable Notification Variables ====
-
-.Pre-notification (demote):
-
-* +Active+ resources: +$OCF_RESKEY_CRM_meta_notify_active_resource+
-* +Master+ resources: +$OCF_RESKEY_CRM_meta_notify_master_resource+
-* +Slave+ resources: +$OCF_RESKEY_CRM_meta_notify_slave_resource+
-* Inactive resources: +$OCF_RESKEY_CRM_meta_notify_inactive_resource+
-* Resources to be started: +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* Resources to be promoted: +$OCF_RESKEY_CRM_meta_notify_promote_resource+
-* Resources to be demoted: +$OCF_RESKEY_CRM_meta_notify_demote_resource+
-* Resources to be stopped: +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-
-
-.Post-notification (demote) / Pre-notification (stop):
-
-* +Active+ resources: +$OCF_RESKEY_CRM_meta_notify_active_resource+
-* +Master+ resources:
-** +$OCF_RESKEY_CRM_meta_notify_master_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_demote_resource+
-* +Slave+ resources: +$OCF_RESKEY_CRM_meta_notify_slave_resource+
-* Inactive resources: +$OCF_RESKEY_CRM_meta_notify_inactive_resource+
-* Resources to be started: +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* Resources to be promoted: +$OCF_RESKEY_CRM_meta_notify_promote_resource+
-* Resources to be demoted: +$OCF_RESKEY_CRM_meta_notify_demote_resource+
-* Resources to be stopped: +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-* Resources that were demoted: +$OCF_RESKEY_CRM_meta_notify_demote_resource+
-
-
-.Post-notification (stop) / Pre-notification (start)
-
-* +Active+ resources:
-** +$OCF_RESKEY_CRM_meta_notify_active_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-* +Master+ resources:
-** +$OCF_RESKEY_CRM_meta_notify_master_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_demote_resource+
-* +Slave+ resources:
-** +$OCF_RESKEY_CRM_meta_notify_slave_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-* Inactive resources:
-** +$OCF_RESKEY_CRM_meta_notify_inactive_resource+
-** plus +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-* Resources to be started: +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* Resources to be promoted: +$OCF_RESKEY_CRM_meta_notify_promote_resource+
-* Resources to be demoted: +$OCF_RESKEY_CRM_meta_notify_demote_resource+
-* Resources to be stopped: +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-* Resources that were demoted: +$OCF_RESKEY_CRM_meta_notify_demote_resource+
-* Resources that were stopped: +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-
-
-.Post-notification (start) / Pre-notification (promote)
-
-* +Active+ resources:
-** +$OCF_RESKEY_CRM_meta_notify_active_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-** plus +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* +Master+ resources:
-** +$OCF_RESKEY_CRM_meta_notify_master_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_demote_resource+
-* +Slave+ resources:
-** +$OCF_RESKEY_CRM_meta_notify_slave_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-** plus +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* Inactive resources:
-** +$OCF_RESKEY_CRM_meta_notify_inactive_resource+
-** plus +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* Resources to be started: +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* Resources to be promoted: +$OCF_RESKEY_CRM_meta_notify_promote_resource+
-* Resources to be demoted: +$OCF_RESKEY_CRM_meta_notify_demote_resource+
-* Resources to be stopped: +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-* Resources that were started: +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* Resources that were demoted: +$OCF_RESKEY_CRM_meta_notify_demote_resource+
-* Resources that were stopped: +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-
-.Post-notification (promote)
-
-* +Active+ resources:
-** +$OCF_RESKEY_CRM_meta_notify_active_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-** plus +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* +Master+ resources:
-** +$OCF_RESKEY_CRM_meta_notify_master_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_demote_resource+
-** plus +$OCF_RESKEY_CRM_meta_notify_promote_resource+
-* +Slave+ resources:
-** +$OCF_RESKEY_CRM_meta_notify_slave_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-** plus +$OCF_RESKEY_CRM_meta_notify_start_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_promote_resource+
-* Inactive resources:
-** +$OCF_RESKEY_CRM_meta_notify_inactive_resource+
-** plus +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-** minus +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* Resources to be started: +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* Resources to be promoted: +$OCF_RESKEY_CRM_meta_notify_promote_resource+
-* Resources to be demoted: +$OCF_RESKEY_CRM_meta_notify_demote_resource+
-* Resources to be stopped: +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-* Resources that were started: +$OCF_RESKEY_CRM_meta_notify_start_resource+
-* Resources that were promoted: +$OCF_RESKEY_CRM_meta_notify_promote_resource+
-* Resources that were demoted: +$OCF_RESKEY_CRM_meta_notify_demote_resource+
-* Resources that were stopped: +$OCF_RESKEY_CRM_meta_notify_stop_resource+
-
-=== Monitoring Promotable Clone Resources ===
-
-The usual monitor actions are insufficient to monitor a promotable clone
-resource, because Pacemaker needs to verify not only that the resource is
-active, but also that its actual role matches its intended one.
-
-Define two monitoring actions: the usual one will cover the slave role,
-and an additional one with +role="master"+ will cover the master role.
-
-.Monitoring both states of a promotable clone resource
-======
-[source,XML]
--------
-<clone id="myMasterRsc">
- <meta_attributes id="myMasterRsc-meta">
- <nvpair name="promotable" value="true"/>
- </meta_attributes>
- <primitive id="myRsc" class="ocf" type="myApp" provider="myCorp">
- <operations>
- <op id="public-ip-slave-check" name="monitor" interval="60"/>
- <op id="public-ip-master-check" name="monitor" interval="61" role="Master"/>
- </operations>
- </primitive>
-</clone>
--------
-======
-
-[IMPORTANT]
-===========
-It is crucial that _every_ monitor operation has a different interval!
-Pacemaker currently differentiates between operations
-only by resource and interval; so if (for example) a promotable clone resource
-had the same monitor interval for both roles, Pacemaker would ignore the
-role when checking the status -- which would cause unexpected return
-codes, and therefore unnecessary complications.
-===========
-
-[[s-promotion-scores]]
-=== Determining Which Instance is Promoted ===
-
-Pacemaker can choose a promotable clone instance to be promoted in one of two
-ways:
-
-* Promotion scores: These are node attributes set via the `crm_master` utility,
- which generally would be called by the resource agent's start action if it
- supports promotable clones. This tool automatically detects both the resource
- and host, and should be used to set a preference for being promoted. Based on
- this, +promoted-max+, and +promoted-node-max+, the instance(s) with the
- highest preference will be promoted.
-
-* Constraints: Location constraints can indicate which nodes are most preferred
- as masters.
-
-.Explicitly preferring node1 to be promoted to master
-======
-[source,XML]
--------
-<rsc_location id="master-location" rsc="myMasterRsc">
- <rule id="master-rule" score="100" role="Master">
- <expression id="master-exp" attribute="#uname" operation="eq" value="node1"/>
- </rule>
-</rsc_location>
--------
-======
-
-[[s-resource-bundle]]
-== Bundles - Isolated Environments ==
-indexterm:[Resource,Bundle]
-indexterm:[Container,Docker,Bundle]
-indexterm:[Container,podman,Bundle]
-indexterm:[Container,rkt,Bundle]
-
-Pacemaker supports a special syntax for launching a
-https://en.wikipedia.org/wiki/Operating-system-level_virtualization[container]
-with any infrastructure it requires: the 'bundle'.
-
-Pacemaker bundles support https://www.docker.com/[Docker],
-https://podman.io/[podman], and https://coreos.com/rkt/[rkt]
-container technologies.
-footnote:[Docker is a trademark of Docker, Inc. No endorsement by or
-association with Docker, Inc. is implied.]
-
-.A bundle for a containerized web server
-====
-[source,XML]
-----
-<bundle id="httpd-bundle">
- <podman image="pcmk:http" replicas="3"/>
- <network ip-range-start="192.168.122.131"
- host-netmask="24"
- host-interface="eth0">
- <port-mapping id="httpd-port" port="80"/>
- </network>
- <storage>
- <storage-mapping id="httpd-syslog"
- source-dir="/dev/log"
- target-dir="/dev/log"
- options="rw"/>
- <storage-mapping id="httpd-root"
- source-dir="/srv/html"
- target-dir="/var/www/html"
- options="rw,Z"/>
- <storage-mapping id="httpd-logs"
- source-dir-root="/var/log/pacemaker/bundles"
- target-dir="/etc/httpd/logs"
- options="rw,Z"/>
- </storage>
- <primitive class="ocf" id="httpd" provider="heartbeat" type="apache"/>
-</bundle>
-----
-====
-
-=== Bundle Prerequisites ===
-indexterm:[Resource,Bundle,Prerequisites]
-
-Before configuring a bundle in Pacemaker, the user must install the appropriate
-container launch technology (Docker, podman, or rkt), and supply a fully
-configured container image, on every node allowed to run the bundle.
-
-Pacemaker will create an implicit resource of type +ocf:heartbeat:docker+,
-+ocf:heartbeat:podman+, or +ocf:heartbeat:rkt+ to manage a bundle's
-container. The user must ensure that the appropriate resource agent is
-installed on every node allowed to run the bundle.
-
-=== Bundle Properties ===
-
-indexterm:[XML element,bundle element]
-
-.XML Attributes of a bundle Element
-[width="95%",cols="3m,<5",options="header",align="center"]
-|=========================================================
-
-|Attribute
-|Description
-
-|id
-|A unique name for the bundle (required)
- indexterm:[XML attribute,id attribute,bundle element]
- indexterm:[XML element,bundle element,id attribute]
-
-|description
-|Arbitrary text (not used by Pacemaker)
- indexterm:[XML attribute,description attribute,bundle element]
- indexterm:[XML element,bundle element,description attribute]
-
-|=========================================================
-
-A bundle must contain exactly one +docker+, +podman+, or +rkt+ element.
-
-=== Bundle Container Properties ===
-indexterm:[XML element,docker element]
-indexterm:[XML element,podman element]
-indexterm:[XML element,rkt element]
-indexterm:[Resource,Bundle,Container]
-
-.XML attributes of a docker, podman, or rkt Element
-[width="95%",cols="3m,4,<5",options="header",align="center"]
-|====
-
-|Attribute
-|Default
-|Description
-
-|image
-|
-|Container image tag (required)
- indexterm:[XML attribute,image attribute,docker element]
- indexterm:[XML element,docker element,image attribute]
- indexterm:[XML attribute,image attribute,podman element]
- indexterm:[XML element,podman element,image attribute]
- indexterm:[XML attribute,image attribute,rkt element]
- indexterm:[XML element,rkt element,image attribute]
-
-|replicas
-|Value of +promoted-max+ if that is positive, else 1
-|A positive integer specifying the number of container instances to launch
- indexterm:[XML attribute,replicas attribute,docker element]
- indexterm:[XML element,docker element,replicas attribute]
- indexterm:[XML attribute,replicas attribute,podman element]
- indexterm:[XML element,podman element,replicas attribute]
- indexterm:[XML attribute,replicas attribute,rkt element]
- indexterm:[XML element,rkt element,replicas attribute]
-
-|replicas-per-host
-|1
-|A positive integer specifying the number of container instances allowed to run
- on a single node
- indexterm:[XML attribute,replicas-per-host attribute,docker element]
- indexterm:[XML element,docker element,replicas-per-host attribute]
- indexterm:[XML attribute,replicas-per-host attribute,podman element]
- indexterm:[XML element,podman element,replicas-per-host attribute]
- indexterm:[XML attribute,replicas-per-host attribute,rkt element]
- indexterm:[XML element,rkt element,replicas-per-host attribute]
-
-|promoted-max
-|0
-|A non-negative integer that, if positive, indicates that the containerized
- service should be treated as a promotable service, with this many replicas
- allowed to run the service in the master role
- indexterm:[XML attribute,promoted-max attribute,docker element]
- indexterm:[XML element,docker element,promoted-max attribute]
- indexterm:[XML attribute,promoted-max attribute,podman element]
- indexterm:[XML element,podman element,promoted-max attribute]
- indexterm:[XML attribute,promoted-max attribute,rkt element]
- indexterm:[XML element,rkt element,promoted-max attribute]
-
-|network
-|
-|If specified, this will be passed to the `docker run`, `podman run`, or
- `rkt run` command as the network setting for the container.
- indexterm:[XML attribute,network attribute,docker element]
- indexterm:[XML element,docker element,network attribute]
- indexterm:[XML attribute,network attribute,podman element]
- indexterm:[XML element,podman element,network attribute]
- indexterm:[XML attribute,network attribute,rkt element]
- indexterm:[XML element,rkt element,network attribute]
-
-|run-command
-|`/usr/sbin/pacemaker-remoted` if bundle contains a +primitive+, otherwise none
-|This command will be run inside the container when launching it ("PID 1"). If
- the bundle contains a +primitive+, this command 'must' start pacemaker-remoted
- (but could, for example, be a script that does other stuff, too).
- indexterm:[XML attribute,run-command attribute,docker element]
- indexterm:[XML element,docker element,run-command attribute]
- indexterm:[XML attribute,run-command attribute,podman element]
- indexterm:[XML element,podman element,run-command attribute]
- indexterm:[XML attribute,run-command attribute,rkt element]
- indexterm:[XML element,rkt element,run-command attribute]
-
-|options
-|
-|Extra command-line options to pass to the `docker run`, `podman run`, or
- `rkt run` command
- indexterm:[XML attribute,options attribute,docker element]
- indexterm:[XML element,docker element,options attribute]
- indexterm:[XML attribute,options attribute,podman element]
- indexterm:[XML element,podman element,options attribute]
- indexterm:[XML attribute,options attribute,rkt element]
- indexterm:[XML element,rkt element,options attribute]
-
-|====
-
-[NOTE]
-====
-Considerations when using cluster configurations or container images from
-Pacemaker 1.1:
-
-- If the container image has a pre-2.0.0 version of Pacemaker, set +run-command+
-to +/usr/sbin/pacemaker_remoted+ (note the underbar instead of dash).
-
-- +masters+ is accepted as an alias for +promoted-max+, but is deprecated since
-2.0.0, and support for it will be removed in a future version.
-====
-
-=== Bundle Network Properties ===
-
-A bundle may optionally contain one +<network>+ element.
-indexterm:[XML element,network element]
-indexterm:[Resource,Bundle,Networking]
-
-.XML attributes of a network Element
-[width="95%",cols="2m,1,<4",options="header",align="center"]
-|=========================================================
-
-|Attribute
-|Default
-|Description
-
-|add-host
-|TRUE
-|If TRUE, and +ip-range-start+ is used, Pacemaker will automatically ensure
- that +/etc/hosts+ inside the containers has entries for each
- <<s-resource-bundle-note-replica-names,replica name>> and its assigned IP.
- indexterm:[XML element,add-host attribute,network element]
- indexterm:[XML attribute,network element,add-host attribute]
-
-|ip-range-start
-|
-|If specified, Pacemaker will create an implicit +ocf:heartbeat:IPaddr2+
- resource for each container instance, starting with this IP address,
- using up to +replicas+ sequential addresses. These addresses can be used
- from the host's network to reach the service inside the container, though
- it is not visible within the container itself. Only IPv4 addresses are
- currently supported.
- indexterm:[XML element,ip-range-start attribute,network element]
- indexterm:[XML attribute,network element,ip-range-start attribute]
-
-|host-netmask
-|32
-|If +ip-range-start+ is specified, the IP addresses are created with this
- CIDR netmask (as a number of bits).
- indexterm:[XML element,host-netmask attribute,network element]
- indexterm:[XML attribute,network element,host-netmask attribute]
-
-|host-interface
-|
-|If +ip-range-start+ is specified, the IP addresses are created on this
- host interface (by default, it will be determined from the IP address).
- indexterm:[XML element,host-interface attribute,network element]
- indexterm:[XML attribute,network element,host-interface attribute]
-
-|control-port
-|3121
-|If the bundle contains a +primitive+, the cluster will use this integer TCP
- port for communication with Pacemaker Remote inside the container. Changing
- this is useful when the container is unable to listen on the default port,
- for example, when the container uses the host's network rather than
- +ip-range-start+ (in which case +replicas-per-host+ must be 1), or when the
- bundle may run on a Pacemaker Remote node that is already listening on the
- default port. Any PCMK_remote_port environment variable set on the host or in
- the container is ignored for bundle connections.
- indexterm:[XML element,control-port attribute,network element]
- indexterm:[XML attribute,network element,control-port attribute]
-
-|=========================================================
-
-[[s-resource-bundle-note-replica-names]]
-[NOTE]
-====
-Replicas are named by the bundle id plus a dash and an integer counter starting
-with zero. For example, if a bundle named +httpd-bundle+ has +replicas=2+, its
-containers will be named +httpd-bundle-0+ and +httpd-bundle-1+.
-====
-
-Additionally, a +network+ element may optionally contain one or more
-+port-mapping+ elements.
-indexterm:[XML element,port-mapping]
-
-.Attributes of a port-mapping Element
-[width="95%",cols="2m,1,<4",options="header",align="center"]
-|=========================================================
-
-|Attribute
-|Default
-|Description
-
-|id
-|
-|A unique name for the port mapping (required)
- indexterm:[XML attribute,id attribute,port-mapping element]
- indexterm:[XML element,port-mapping element,id attribute]
-
-|port
-|
-|If this is specified, connections to this TCP port number on the host network
- (on the container's assigned IP address, if +ip-range-start+ is specified)
- will be forwarded to the container network. Exactly one of +port+ or +range+
- must be specified in a +port-mapping+.
- indexterm:[XML attribute,port attribute,port-mapping element]
- indexterm:[XML element,port-mapping element,port attribute]
-
-|internal-port
-|value of +port+
-|If +port+ and this are specified, connections to +port+ on the host's network
- will be forwarded to this port on the container network.
- indexterm:[XML attribute,internal-port attribute,port-mapping element]
- indexterm:[XML element,port-mapping element,internal-port attribute]
-
-|range
-|
-|If this is specified, connections to these TCP port numbers (expressed as
- 'first_port'-'last_port') on the host network (on the container's assigned IP
- address, if +ip-range-start+ is specified) will be forwarded to the same ports
- in the container network. Exactly one of +port+ or +range+ must be specified
- in a +port-mapping+.
- indexterm:[XML attribute,range attribute,port-mapping element]
- indexterm:[XML element,port-mapping element,range attribute]
-
-|=========================================================
-
-[NOTE]
-====
-If the bundle contains a +primitive+, Pacemaker will automatically map the
-+control-port+, so it is not necessary to specify that port in a
-+port-mapping+.
-====
-
-[[s-bundle-storage]]
-=== Bundle Storage Properties ===
-
-A bundle may optionally contain one +storage+ element. A +storage+ element
-has no properties of its own, but may contain one or more +storage-mapping+
-elements.
-indexterm:[XML element,storage element]
-indexterm:[XML element,storage-mapping element]
-indexterm:[Resource,Bundle,Storage]
-
-.Attributes of a storage-mapping Element
-[width="95%",cols="2m,1,<4",options="header",align="center"]
-|=========================================================
-
-|Attribute
-|Default
-|Description
-
-|id
-|
-|A unique name for the storage mapping (required)
- indexterm:[XML attribute,id attribute,storage-mapping element]
- indexterm:[XML element,storage-mapping element,id attribute]
-
-|source-dir
-|
-|The absolute path on the host's filesystem that will be mapped into the
- container. Exactly one of +source-dir+ and +source-dir-root+ must be specified
- in a +storage-mapping+.
- indexterm:[XML attribute,source-dir attribute,storage-mapping element]
- indexterm:[XML element,storage-mapping element,source-dir attribute]
-
-|source-dir-root
-|
-|The start of a path on the host's filesystem that will be mapped into the
- container, using a different subdirectory on the host for each container
- instance. The subdirectory will be named the same as the
- <<s-resource-bundle-note-replica-names,replica name>>.
- Exactly one of +source-dir+ and +source-dir-root+ must be specified in a
- +storage-mapping+.
- indexterm:[XML attribute,source-dir-root attribute,storage-mapping element]
- indexterm:[XML element,storage-mapping element,source-dir-root attribute]
-
-|target-dir
-|
-|The path name within the container where the host storage will be mapped
- (required)
- indexterm:[XML attribute,target-dir attribute,storage-mapping element]
- indexterm:[XML element,storage-mapping element,target-dir attribute]
-
-|options
-|
-|A comma-separated list of file system mount options to use when mapping the
- storage
- indexterm:[XML attribute,options attribute,storage-mapping element]
- indexterm:[XML element,storage-mapping element,options attribute]
-
-|=========================================================
-
-[NOTE]
-====
-Pacemaker does not define the behavior if the source directory does not already
-exist on the host. However, it is expected that the container technology and/or
-its resource agent will create the source directory in that case.
-====
-
-[NOTE]
-====
-If the bundle contains a +primitive+,
-Pacemaker will automatically map the equivalent of
-+source-dir=/etc/pacemaker/authkey target-dir=/etc/pacemaker/authkey+
-and +source-dir-root=/var/log/pacemaker/bundles target-dir=/var/log+ into the
-container, so it is not necessary to specify those paths in a
-+storage-mapping+.
-====
-
-[IMPORTANT]
-====
-The +PCMK_authkey_location+ environment variable must not be set to anything
-other than the default of `/etc/pacemaker/authkey` on any node in the cluster.
-====
-
-[IMPORTANT]
-====
-If SELinux is used in enforcing mode on the host, you must ensure the container
-is allowed to use any storage you mount into it. For Docker and podman bundles,
-adding "Z" to the mount options will create a container-specific label for the
-mount that allows the container access.
-====
-
-=== Bundle Primitive ===
-
-indexterm:[Resource,Bundle,Primitive]
-
-A bundle may optionally contain one <<s-resource-primitive,primitive>>
-resource. The primitive may have operations, instance attributes, and
-meta-attributes defined, as usual.
-
-If a bundle contains a primitive resource, the container image must include
-the Pacemaker Remote daemon, and at least one of +ip-range-start+ or
-+control-port+ must be configured in the bundle. Pacemaker will create an
-implicit +ocf:pacemaker:remote+ resource for the connection, launch
-Pacemaker Remote within the container, and monitor and manage the primitive
-resource via Pacemaker Remote.
-
-If the bundle has more than one container instance (replica), the primitive
-resource will function as an implicit <<s-resource-clone,clone>> -- a
-<<s-resource-promotable,promotable clone>> if the bundle has +masters+ greater
-than zero.
-
-[NOTE]
-====
-If you want to pass environment variables to a bundle's Pacemaker Remote
-connection or primitive, you have two options:
-
-* Environment variables whose value is the same regardless of the underlying host
- may be set using the container element's +options+ attribute.
-* If you want variables to have host-specific values, you can use the
- <<s-bundle-storage,+storage-mapping+>> element to map a file on the host as
- +/etc/pacemaker/pcmk-init.env+ in the container. Pacemaker Remote will parse
- this file as a shell-like format, with variables set as NAME=VALUE, ignoring
- blank lines and comments starting with "#".
-====
-
-[IMPORTANT]
-====
-When a bundle has a +primitive+, Pacemaker on all cluster nodes must be able to
-contact Pacemaker Remote inside the bundle's containers.
-
-* The containers must have an accessible network (for example, +network+ should
- not be set to "none" with a +primitive+).
-* The default, using a distinct network space inside the container, works in
- combination with +ip-range-start+. Any firewall must allow access from all
- cluster nodes to the +control-port+ on the container IPs.
-* If the container shares the host's network space (for example, by setting
- +network+ to "host"), a unique +control-port+ should be specified for each
- bundle. Any firewall must allow access from all cluster nodes to the
- +control-port+ on all cluster and remote node IPs.
-====
-
-[[s-bundle-attributes]]
-=== Bundle Node Attributes ===
-
-indexterm:[Resource,Bundle,Node Attributes]
-
-If the bundle has a +primitive+, the primitive's resource agent may want to set
-node attributes such as <<s-promotion-scores,promotion scores>>. However, with
-containers, it is not apparent which node should get the attribute.
-
-If the container uses shared storage that is the same no matter which node the
-container is hosted on, then it is appropriate to use the promotion score on the
-bundle node itself.
-
-On the other hand, if the container uses storage exported from the underlying host,
-then it may be more appropriate to use the promotion score on the underlying host.
-
-Since this depends on the particular situation, the
-+container-attribute-target+ resource meta-attribute allows the user to specify
-which approach to use. If it is set to +host+, then user-defined node attributes
-will be checked on the underlying host. If it is anything else, the local node
-(in this case the bundle node) is used as usual.
-
-This only applies to user-defined attributes; the cluster will always check the
-local node for cluster-defined attributes such as +#uname+.
-
-If +container-attribute-target+ is +host+, the cluster will pass additional
-environment variables to the primitive's resource agent that allow it to set
-node attributes appropriately: +CRM_meta_container_attribute_target+ (identical
-to the meta-attribute value) and +CRM_meta_physical_host+ (the name of the
-underlying host).
-
-[NOTE]
-====
-When called by a resource agent, the `attrd_updater` and `crm_attribute`
-commands will automatically check those environment variables and set
-attributes appropriately.
-====
-
-=== Bundle Meta-Attributes ===
-
-indexterm:[Resource,Bundle,Meta-attributes]
-
-Any meta-attribute set on a bundle will be inherited by the bundle's
-primitive and any resources implicitly created by Pacemaker for the bundle.
-
-This includes options such as +priority+, +target-role+, and +is-managed+. See
-<<s-resource-options>> for more information.
-
-=== Limitations of Bundles ===
-
-Restarting pacemaker while a bundle is unmanaged or the cluster is in
-maintenance mode may cause the bundle to fail.
-
-Bundles may not be explicitly cloned or included in groups. This includes the
-bundle's primitive and any resources implicitly created by Pacemaker for the
-bundle. (If +replicas+ is greater than 1, the bundle will behave like a clone
-implicitly.)
-
-Bundles do not have instance attributes, utilization attributes, or operations,
-though a bundle's primitive may have them.
-
-A bundle with a primitive can run on a Pacemaker Remote node only if the bundle
-uses a distinct +control-port+.
diff --git a/doc/Pacemaker_Explained/en-US/Ch-Alerts.txt b/doc/Pacemaker_Explained/en-US/Ch-Alerts.txt
deleted file mode 100644
index 34efbb284b..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ch-Alerts.txt
+++ /dev/null
@@ -1,424 +0,0 @@
-:compat-mode: legacy
-= Alerts =
-
-////
-We prefer [[ch-alerts]], but older versions of asciidoc don't deal well
-with that construct for chapter headings
-////
-anchor:ch-alerts[Chapter 7, Alerts]
-indexterm:[Resource,Alerts]
-
-'Alerts' may be configured to take some external action when a cluster event
-occurs (node failure, resource starting or stopping, etc.).
-
-
-== Alert Agents ==
-
-As with resource agents, the cluster calls an external program (an
-'alert agent') to handle alerts. The cluster passes information about the event
-to the agent via environment variables. Agents can do anything
-desired with this information (send an e-mail, log to a file,
-update a monitoring system, etc.).
-
-
-.Simple alert configuration
-=====
-[source,XML]
------
-<configuration>
- <alerts>
- <alert id="my-alert" path="/path/to/my-script.sh" />
- </alerts>
-</configuration>
------
-=====
-
-In the example above, the cluster will call +my-script.sh+ for each event.
-
-Multiple alert agents may be configured; the cluster will call all of them for
-each event.
-
-Alert agents will be called only on cluster nodes. They will be called for
-events involving Pacemaker Remote nodes, but they will never be called _on_
-those nodes.
-
-== Alert Recipients ==
-
-Usually alerts are directed towards a recipient. Thus each alert may be additionally configured with one or more recipients.
-The cluster will call the agent separately for each recipient.
-
-.Alert configuration with recipient
-=====
-[source,XML]
------
-<configuration>
- <alerts>
- <alert id="my-alert" path="/path/to/my-script.sh">
- <recipient id="my-alert-recipient" value="some-address"/>
- </alert>
- </alerts>
-</configuration>
------
-=====
-
-In the above example, the cluster will call +my-script.sh+ for each event,
-passing the recipient +some-address+ as an environment variable.
-
-The recipient may be anything the alert agent can recognize --
-an IP address, an e-mail address, a file name, whatever the particular
-agent supports.
-
-
-== Alert Meta-Attributes ==
-
-As with resource agents, meta-attributes can be configured for alert agents
-to affect how Pacemaker calls them.
-
-.Meta-Attributes of an Alert
-
-[width="95%",cols="m,1,<2",options="header",align="center"]
-|=========================================================
-
-|Meta-Attribute
-|Default
-|Description
-
-|timestamp-format
-|%H:%M:%S.%06N
-|Format the cluster will use when sending the event's timestamp to the agent.
- This is a string as used with the `date(1)` command.
- indexterm:[Alert,Option,timestamp-format]
-
-|timeout
-|30s
-|If the alert agent does not complete within this amount of time, it will be
- terminated.
- indexterm:[Alert,Option,timeout]
-
-|=========================================================
-
-Meta-attributes can be configured per alert agent and/or per recipient.
-
-.Alert configuration with meta-attributes
-=====
-[source,XML]
------
-<configuration>
- <alerts>
- <alert id="my-alert" path="/path/to/my-script.sh">
- <meta_attributes id="my-alert-attributes">
- <nvpair id="my-alert-attributes-timeout" name="timeout"
- value="15s"/>
- </meta_attributes>
- <recipient id="my-alert-recipient1" value="someuser@example.com">
- <meta_attributes id="my-alert-recipient1-attributes">
- <nvpair id="my-alert-recipient1-timestamp-format"
- name="timestamp-format" value="%D %H:%M"/>
- </meta_attributes>
- </recipient>
- <recipient id="my-alert-recipient2" value="otheruser@example.com">
- <meta_attributes id="my-alert-recipient2-attributes">
- <nvpair id="my-alert-recipient2-timestamp-format"
- name="timestamp-format" value="%c"/>
- </meta_attributes>
- </recipient>
- </alert>
- </alerts>
-</configuration>
------
-=====
-
-In the above example, the +my-script.sh+ will get called twice for each event,
-with each call using a 15-second timeout. One call will be passed the recipient
-+someuser@example.com+ and a timestamp in the format +%D %H:%M+, while the
-other call will be passed the recipient +otheruser@example.com+ and a timestamp
-in the format +%c+.
-
-
-== Alert Instance Attributes ==
-
-As with resource agents, agent-specific configuration values may be configured
-as instance attributes. These will be passed to the agent as additional
-environment variables. The number, names and allowed values of these
-instance attributes are completely up to the particular agent.
-
-.Alert configuration with instance attributes
-=====
-[source,XML]
------
-<configuration>
- <alerts>
- <alert id="my-alert" path="/path/to/my-script.sh">
- <meta_attributes id="my-alert-attributes">
- <nvpair id="my-alert-attributes-timeout" name="timeout"
- value="15s"/>
- </meta_attributes>
- <instance_attributes id="my-alert-options">
- <nvpair id="my-alert-options-debug" name="debug" value="false"/>
- </instance_attributes>
- <recipient id="my-alert-recipient1" value="someuser@example.com"/>
- </alert>
- </alerts>
-</configuration>
------
-=====
-
-
-== Alert Filters ==
-
-By default, an alert agent will be called for node events, fencing events, and
-resource events. An agent may choose to ignore certain types of events, but
-there is still the overhead of calling it for those events. To eliminate that
-overhead, you may select which types of events the agent should receive.
-
-.Alert configuration to receive only node events and fencing events
-=====
-[source,XML]
------
-<configuration>
- <alerts>
- <alert id="my-alert" path="/path/to/my-script.sh">
- <select>
- <select_nodes />
- <select_fencing />
- </select>
- <recipient id="my-alert-recipient1" value="someuser@example.com"/>
- </alert>
- </alerts>
-</configuration>
------
-=====
-
-The possible options within +<select>+ are +<select_nodes>+,
-+<select_fencing>+, +<select_resources>+, and +<select_attributes>+.
-
-With +<select_attributes>+ (the only event type not enabled by default), the
-agent will receive alerts when a node attribute changes. If you wish the agent
-to be called only when certain attributes change, you can configure that as well.
-
-.Alert configuration to be called when certain node attributes change
-=====
-[source,XML]
------
-<configuration>
- <alerts>
- <alert id="my-alert" path="/path/to/my-script.sh">
- <select>
- <select_attributes>
- <attribute id="alert-standby" name="standby" />
- <attribute id="alert-shutdown" name="shutdown" />
- </select_attributes>
- </select>
- <recipient id="my-alert-recipient1" value="someuser@example.com"/>
- </alert>
- </alerts>
-</configuration>
------
-=====
-
-Node attribute alerts are currently considered experimental. Alerts may be
-limited to attributes set via attrd_updater, and agents may be called multiple
-times with the same attribute value.
-
-
-== Using the Sample Alert Agents ==
-
-Pacemaker provides several sample alert agents, installed in
-+/usr/share/pacemaker/alerts+ by default.
-
-While these sample scripts may be copied and used as-is, they are provided
-mainly as templates to be edited to suit your purposes.
-See their source code for the full set of instance attributes they support.
-
-.Sending cluster events as SNMP traps
-=====
-[source,XML]
------
-<configuration>
- <alerts>
- <alert id="snmp_alert" path="/path/to/alert_snmp.sh">
- <instance_attributes id="config_for_alert_snmp">
- <nvpair id="trap_node_states" name="trap_node_states" value="all"/>
- </instance_attributes>
- <meta_attributes id="config_for_timestamp">
- <nvpair id="ts_fmt" name="timestamp-format"
- value="%Y-%m-%d,%H:%M:%S.%01N"/>
- </meta_attributes>
- <recipient id="snmp_destination" value="192.168.1.2"/>
- </alert>
- </alerts>
-</configuration>
------
-=====
-
-.Sending cluster events as e-mails
-=====
-[source,XML]
------
- <configuration>
- <alerts>
- <alert id="smtp_alert" path="/path/to/alert_smtp.sh">
- <instance_attributes id="config_for_alert_smtp">
- <nvpair id="email_sender" name="email_sender"
- value="donotreply@example.com"/>
- </instance_attributes>
- <recipient id="smtp_destination" value="admin@example.com"/>
- </alert>
- </alerts>
- </configuration>
------
-=====
-
-
-== Writing an Alert Agent ==
-
-.Environment variables passed to alert agents
-
-[width="95%",cols="m,<2",options="header",align="center"]
-|=========================================================
-
-|Environment Variable
-|Description
-
-|CRM_alert_kind
-|The type of alert (+node+, +fencing+, +resource+, or +attribute+)
- indexterm:[Environment Variable,CRM_alert_,kind]
-
-|CRM_alert_version
-|The version of Pacemaker sending the alert
- indexterm:[Environment Variable,CRM_alert_,version]
-
-|CRM_alert_recipient
-|The configured recipient
- indexterm:[Environment Variable,CRM_alert_,recipient]
-
-|CRM_alert_node_sequence
-|A sequence number increased whenever an alert is being issued on the
- local node, which can be used to reference the order in which alerts have been
- issued by Pacemaker. An alert for an event that happened later in time
- reliably has a higher sequence number than alerts for earlier events.
- Be aware that this number has no cluster-wide meaning.
- indexterm:[Environment Variable,CRM_alert_node_,sequence]
-
-|CRM_alert_timestamp
-|A timestamp created prior to executing the agent, in the format
- specified by the +timestamp-format+ meta-attribute. This allows the agent
- to have a reliable, high-precision time of when the event occurred,
- regardless of when the agent itself was invoked (which could potentially
- be delayed due to system load, etc.).
- indexterm:[Environment Variable,CRM_alert_,timestamp]
-
-|CRM_alert_timestamp_epoch
-|The same time as +CRM_alert_timestamp+, expressed as the integer number of
- seconds since January 1, 1970. This (along with +CRM_alert_timestamp_usec+)
- can be useful for alert agents that need to format time in a specific way
- rather than let the user configure it.
- indexterm:[Environment Variable,CRM_alert_,timestamp_epoch]
-
-|CRM_alert_timestamp_usec
-|The same time as +CRM_alert_timestamp+, expressed as the integer number of
- microseconds since +CRM_alert_timestamp_epoch+.
- indexterm:[Environment Variable,CRM_alert_,timestamp_usec]
-
-|CRM_alert_node
-|Name of affected node
- indexterm:[Environment Variable,CRM_alert_,node]
-
-|CRM_alert_desc
-|Detail about event. For +node+ alerts, this is the node's current state
- (+member+ or +lost+). For +fencing+ alerts, this is a summary of the
- requested fencing operation, including origin, target, and fencing operation
- error code, if any. For +resource+ alerts, this is a readable string
- equivalent of +CRM_alert_status+.
- indexterm:[Environment Variable,CRM_alert_,desc]
-
-|CRM_alert_nodeid
-|ID of node whose status changed (provided with +node+ alerts only)
- indexterm:[Environment Variable,CRM_alert_,nodeid]
-
-|CRM_alert_task
-|The requested fencing or resource operation
- (provided with +fencing+ and +resource+ alerts only)
- indexterm:[Environment Variable,CRM_alert_,task]
-
-|CRM_alert_rc
-|The numerical return code of the fencing or resource operation
- (provided with +fencing+ and +resource+ alerts only)
- indexterm:[Environment Variable,CRM_alert_,rc]
-
-|CRM_alert_rsc
-|The name of the affected resource (+resource+ alerts only)
- indexterm:[Environment Variable,CRM_alert_,rsc]
-
-|CRM_alert_interval
-|The interval of the resource operation (+resource+ alerts only)
- indexterm:[Environment Variable,CRM_alert_,interval]
-
-|CRM_alert_target_rc
-|The expected numerical return code of the operation (+resource+ alerts only)
- indexterm:[Environment Variable,CRM_alert_,target_rc]
-
-|CRM_alert_status
-|A numerical code used by Pacemaker to represent the operation result
- (+resource+ alerts only)
- indexterm:[Environment Variable,CRM_alert_,status]
-
-|CRM_alert_exec_time
-|The (wall-clock) time, in milliseconds, that it took to execute the action. If
- the action timed out, +CRM_alert_status+ will be 2, +CRM_alert_desc+ will be
- "Timed Out", and this value will be the action timeout. May not be supported
- on all platforms. (+resource+ alerts only)
- indexterm:[Environment Variable,CRM_alert_,exec_time]
-
-|CRM_alert_attribute_name
-|The name of the node attribute that changed (+attribute+ alerts only)
- indexterm:[Environment Variable,CRM_alert_,attribute_name]
-
-|CRM_alert_attribute_value
-|The new value of the node attribute that changed (+attribute+ alerts only)
- indexterm:[Environment Variable,CRM_alert_,attribute_value]
-
-|=========================================================
-
-Special concerns when writing alert agents:
-
-* Alert agents may be called with no recipient (if none is configured),
- so the agent must be able to handle this situation, even if it
- only exits in that case. (Users may modify the configuration in
- stages, and add a recipient later.)
-
-* If more than one recipient is configured for an alert, the alert agent will
- be called once per recipient. If an agent is not able to run concurrently, it
- should be configured with only a single recipient. The agent is free,
- however, to interpret the recipient as a list.
-
-* When a cluster event occurs, all alerts are fired off at the same time as
- separate processes. Depending on how many alerts and recipients are
- configured, and on what is done within the alert agents,
- a significant load burst may occur. The agent could be written to take
- this into consideration, for example by queueing resource-intensive actions
- into some other instance, instead of directly executing them.
-
-* Alert agents are run as the +hacluster+ user, which has a minimal set
- of permissions. If an agent requires additional privileges, it is
- recommended to configure +sudo+ to allow the agent to run the necessary
- commands as another user with the appropriate privileges.
-
-* As always, take care to validate and sanitize user-configured parameters,
- such as CRM_alert_timestamp (whose content is specified by the
- user-configured timestamp-format), CRM_alert_recipient, and all instance
- attributes. Mostly this is needed simply to protect against configuration
- errors, but if some user can modify the CIB without having hacluster-level
- access to the cluster nodes, it is a potential security concern as well, to
- avoid the possibility of code injection.
-
-[NOTE]
-=====
-The alerts interface is designed to be backward compatible with the external
-scripts interface used by the +ocf:pacemaker:ClusterMon+ resource, which is
-now deprecated. To preserve this compatibility, the environment variables
-passed to alert agents are available prepended with +CRM_notify_+
-as well as +CRM_alert_+. One break in compatibility is that ClusterMon ran
-external scripts as the +root+ user, while alert agents are run as the
-+hacluster+ user.
-=====
diff --git a/doc/Pacemaker_Explained/en-US/Ch-Constraints.txt b/doc/Pacemaker_Explained/en-US/Ch-Constraints.txt
deleted file mode 100644
index 46295c9812..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ch-Constraints.txt
+++ /dev/null
@@ -1,922 +0,0 @@
-:compat-mode: legacy
-= Resource Constraints =
-
-////
-We prefer [[ch-constraints]], but older versions of asciidoc don't deal well
-with that construct for chapter headings
-////
-anchor:ch-constraints[Chapter 7, Alerts]
-indexterm:[Resource,Constraint]
-
-== Scores ==
-
-indexterm:[Resource,Score]
-indexterm:[Node,Score]
-Scores of all kinds are integral to how the cluster works.
-Practically everything from moving a resource to deciding which
-resource to stop in a degraded cluster is achieved by manipulating
-scores in some way.
-
-Scores are calculated per resource and node. Any node with a
-negative score for a resource can't run that resource. The cluster
-places a resource on the node with the highest score for it.
-
-=== Infinity Math ===
-
-Pacemaker implements +INFINITY+ (or equivalently, ++INFINITY+) internally as a
-score of 1,000,000. Addition and subtraction with it follow these three basic
-rules:
-
-* Any value + +INFINITY+ = +INFINITY+
-* Any value - +INFINITY+ = +-INFINITY+
-* +INFINITY+ - +INFINITY+ = +-INFINITY+
-
-[NOTE]
-======
-What if you want to use a score higher than 1,000,000? Typically this possibility
-arises when someone wants to base the score on some external metric that might
-go above 1,000,000.
-
-The short answer is you can't.
-
-The long answer is it is sometimes possible work around this limitation
-creatively. You may be able to set the score to some computed value based on
-the external metric rather than use the metric directly. For nodes, you can
-store the metric as a node attribute, and query the attribute when computing
-the score (possibly as part of a custom resource agent).
-======
-
-== Deciding Which Nodes a Resource Can Run On ==
-
-indexterm:[Constraint,Location Constraint]
-'Location constraints' tell the cluster which nodes a resource can run on.
-
-There are two alternative strategies. One way is to say that, by default,
-resources can run anywhere, and then the location constraints specify nodes
-that are not allowed (an 'opt-out' cluster). The other way is to start with
-nothing able to run anywhere, and use location constraints to selectively
-enable allowed nodes (an 'opt-in' cluster).
-
-Whether you should choose opt-in or opt-out depends on your
-personal preference and the make-up of your cluster. If most of your
-resources can run on most of the nodes, then an opt-out arrangement is
-likely to result in a simpler configuration. On the other-hand, if
-most resources can only run on a small subset of nodes, an opt-in
-configuration might be simpler.
-
-=== Location Properties ===
-
-indexterm:[XML element,rsc_location element]
-indexterm:[Constraint,Location Constraint,rsc_location element]
-
-.Attributes of a rsc_location Element
-[width="95%",cols="2m,1,<5",options="header",align="center"]
-|=========================================================
-
-|Attribute
-|Default
-|Description
-
-|id
-|
-|A unique name for the constraint (required)
-indexterm:[XML attribute,id attribute,rsc_location element]
-indexterm:[XML element,rsc_location element,id attribute]
-
-|rsc
-|
-|The name of the resource to which this constraint applies. A location
- constraint must either have a +rsc+, have a +rsc-pattern+, or contain at least
- one resource set.
-indexterm:[XML attribute,rsc attribute,rsc_location element]
-indexterm:[XML element,rsc_location element,rsc attribute]
-
-|rsc-pattern
-|
-|A pattern matching the names of resources to which this constraint applies.
- The syntax is the same as
- http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_04[POSIX]
- extended regular expressions, with the addition of an initial '!' indicating
- that resources 'not' matching the pattern are selected. If the regular
- expression contains submatches, and the constraint is governed by a
- <<ch-rules,rule>>, the submatches can be referenced as +%0+ through +%9+ in
- the rule's +score-attribute+ or a rule expression's +attribute+. A location
- constraint must either have a +rsc+, have a +rsc-pattern+, or contain at least
- one resource set.
-indexterm:[XML attribute,rsc-pattern attribute,rsc_location element]
-indexterm:[XML element,rsc_location element,rsc-pattern attribute]
-
-|node
-|
-|The name of the node to which this constraint applies. A location constraint
- must either have a +node+ and +score+, or contain at least one rule.
-indexterm:[XML attribute,node attribute,rsc_location element]
-indexterm:[XML element,rsc_location element,node attribute]
-
-|score
-|
-|Positive values indicate a preference for running the affected resource(s) on
- +node+ -- the higher the value, the stronger the preference. Negative values
- indicate the resource(s) should avoid this node (a value of +-INFINITY+
- changes "should" to "must"). A location constraint must either have a +node+
- and +score+, or contain at least one rule.
-indexterm:[XML attribute,score attribute,rsc_location element]
-indexterm:[XML element,rsc_location element,score attribute]
-
-|resource-discovery
-|always
-a|Whether Pacemaker should perform resource discovery (that is, check whether
- the resource is already running) for this resource on this node. This should
- normally be left as the default, so that rogue instances of a service can be
- stopped when they are running where they are not supposed to be. However,
- there are two situations where disabling resource discovery is a good idea:
- when a service is not installed on a node, discovery might return an error
- (properly written OCF agents will not, so this is usually only seen with other
- agent types); and when Pacemaker Remote is used to scale a cluster to hundreds
- of nodes, limiting resource discovery to allowed nodes can significantly boost
- performance.
-
-* +always:+ Always perform resource discovery for the specified resource on this node.
-* +never:+ Never perform resource discovery for the specified resource on this node.
- This option should generally be used with a -INFINITY score, although that is not strictly
- required.
-* +exclusive:+ Perform resource discovery for the specified resource only on
- this node (and other nodes similarly marked as +exclusive+). Multiple location
- constraints using +exclusive+ discovery for the same resource across
- different nodes creates a subset of nodes resource-discovery is exclusive to.
- If a resource is marked for +exclusive+ discovery on one or more nodes, that
- resource is only allowed to be placed within that subset of nodes.
-
-indexterm:[XML attribute,resource-discovery attribute,rsc_location element]
-indexterm:[XML element,rsc_location element,resource-discovery attribute]
-indexterm:[Constraint,Location Constraint,Resource Discovery]
-
-|=========================================================
-
-[WARNING]
-=========
-Setting resource-discovery to +never+ or +exclusive+ removes Pacemaker's
-ability to detect and stop unwanted instances of a service running
-where it's not supposed to be. It is up to the system administrator (you!)
-to make sure that the service can 'never' be active on nodes without
-resource-discovery (such as by leaving the relevant software uninstalled).
-=========
-
-=== Asymmetrical "Opt-In" Clusters ===
-indexterm:[Asymmetrical Clusters]
-indexterm:[Opt-In Clusters]
-
-To create an opt-in cluster, start by preventing resources from
-running anywhere by default:
-
-----
-# crm_attribute --name symmetric-cluster --update false
-----
-
-Then start enabling nodes. The following fragment says that the web
-server prefers *sles-1*, the database prefers *sles-2* and both can
-fail over to *sles-3* if their most preferred node fails.
-
-.Opt-in location constraints for two resources
-======
-[source,XML]
--------
-<constraints>
- <rsc_location id="loc-1" rsc="Webserver" node="sles-1" score="200"/>
- <rsc_location id="loc-2" rsc="Webserver" node="sles-3" score="0"/>
- <rsc_location id="loc-3" rsc="Database" node="sles-2" score="200"/>
- <rsc_location id="loc-4" rsc="Database" node="sles-3" score="0"/>
-</constraints>
--------
-======
-
-=== Symmetrical "Opt-Out" Clusters ===
-indexterm:[Symmetrical Clusters]
-indexterm:[Opt-Out Clusters]
-
-To create an opt-out cluster, start by allowing resources to run
-anywhere by default:
-
-----
-# crm_attribute --name symmetric-cluster --update true
-----
-
-Then start disabling nodes. The following fragment is the equivalent
-of the above opt-in configuration.
-
-.Opt-out location constraints for two resources
-======
-[source,XML]
--------
-<constraints>
- <rsc_location id="loc-1" rsc="Webserver" node="sles-1" score="200"/>
- <rsc_location id="loc-2-do-not-run" rsc="Webserver" node="sles-2" score="-INFINITY"/>
- <rsc_location id="loc-3-do-not-run" rsc="Database" node="sles-1" score="-INFINITY"/>
- <rsc_location id="loc-4" rsc="Database" node="sles-2" score="200"/>
-</constraints>
--------
-======
-
-[[node-score-equal]]
-=== What if Two Nodes Have the Same Score ===
-
-If two nodes have the same score, then the cluster will choose one.
-This choice may seem random and may not be what was intended, however
-the cluster was not given enough information to know any better.
-
-.Constraints where a resource prefers two nodes equally
-======
-[source,XML]
--------
-<constraints>
- <rsc_location id="loc-1" rsc="Webserver" node="sles-1" score="INFINITY"/>
- <rsc_location id="loc-2" rsc="Webserver" node="sles-2" score="INFINITY"/>
- <rsc_location id="loc-3" rsc="Database" node="sles-1" score="500"/>
- <rsc_location id="loc-4" rsc="Database" node="sles-2" score="300"/>
- <rsc_location id="loc-5" rsc="Database" node="sles-2" score="200"/>
-</constraints>
--------
-======
-
-In the example above, assuming no other constraints and an inactive
-cluster, +Webserver+ would probably be placed on +sles-1+ and +Database+ on
-+sles-2+. It would likely have placed +Webserver+ based on the node's
-uname and +Database+ based on the desire to spread the resource load
-evenly across the cluster. However other factors can also be involved
-in more complex configurations.
-
-[[s-resource-ordering]]
-== Specifying the Order in which Resources Should Start/Stop ==
-
-indexterm:[Constraint,Ordering Constraint]
-indexterm:[Resource,Start Order]
-
-'Ordering constraints' tell the cluster the order in which certain
-resource actions should occur.
-
-[IMPORTANT]
-====
-Ordering constraints affect 'only' the ordering of resource actions;
-they do 'not' require that the resources be placed on the
-same node. If you want resources to be started on the same node
-'and' in a specific order, you need both an ordering constraint 'and'
-a colocation constraint (see <<s-resource-colocation>>), or
-alternatively, a group (see <<group-resources>>).
-====
-
-=== Ordering Properties ===
-
-indexterm:[XML element,rsc_order element]
-indexterm:[Constraint,Ordering Constraint,rsc_order element]
-
-.Attributes of a rsc_order Element
-[width="95%",cols="1m,1,<4",options="header",align="center"]
-|=========================================================
-
-|Field
-|Default
-|Description
-
-|id
-|
-|A unique name for the constraint
-indexterm:[XML attribute,id attribute,rsc_order element]
-indexterm:[XML element,rsc_order element,id attribute]
-
-|first
-|
-|Name of the resource that the +then+ resource depends on
-indexterm:[XML attribute,first attribute,rsc_order element]
-indexterm:[XML element,rsc_order element,first attribute]
-
-|then
-|
-|Name of the dependent resource
-indexterm:[XML attribute,then attribute,rsc_order element]
-indexterm:[XML element,rsc_order element,then attribute]
-
-|first-action
-|start
-|The action that the +first+ resource must complete before +then-action+
- can be initiated for the +then+ resource. Allowed values: +start+,
- +stop+, +promote+, +demote+.
-indexterm:[XML attribute,first-action attribute,rsc_order element]
-indexterm:[XML element,rsc_order element,first-action attribute]
-
-|then-action
-|value of +first-action+
-|The action that the +then+ resource can execute only after the
- +first-action+ on the +first+ resource has completed. Allowed
- values: +start+, +stop+, +promote+, +demote+.
-indexterm:[XML attribute,then-action attribute,rsc_order element]
-indexterm:[XML element,rsc_order element,then-action attribute]
-
-|kind
-|Mandatory
-a|How to enforce the constraint. Allowed values:
-
-* +Mandatory:+ +then-action+ will never be initiated for the +then+ resource
- unless and until +first-action+ successfully completes for the +first+
- resource.
-* +Optional:+ The constraint applies only if both specified resource actions
- are scheduled in the same transition (that is, in response to the same
- cluster state). This means that +then-action+ is allowed on the +then+
- resource regardless of the state of the +first+ resource, but if both actions
- happen to be scheduled at the same time, they will be ordered.
-* +Serialize:+ Ensure that the specified actions are never performed
- concurrently for the specified resources. +First-action+ and +then-action+
- can be executed in either order, but one must complete before the other can
- be initiated. An example use case is when resource start-up puts a high load
- on the host.
-
-indexterm:[XML attribute,kind attribute,rsc_order element]
-indexterm:[XML element,rsc_order element,kind attribute]
-
-|symmetrical
-|TRUE for +Mandatory+ and +Optional+ kinds. FALSE for +Serialize+ kind.
-|If true, the reverse of the constraint applies for the opposite action (for
- example, if B starts after A starts, then B stops before A stops).
- +Serialize+ orders cannot be symmetrical.
-indexterm:[XML attribute,symmetrical attribute,rsc_order element]
-indexterm:[XML element,rsc_order element,symmetrical attribute]
-
-|=========================================================
-
-+Promote+ and +demote+ apply to the master role of
-<<s-resource-promotable,promotable>> resources.
-
-=== Optional and mandatory ordering ===
-
-Here is an example of ordering constraints where +Database+ 'must' start before
-+Webserver+, and +IP+ 'should' start before +Webserver+ if they both need to be
-started:
-
-.Optional and mandatory ordering constraints
-======
-[source,XML]
--------
-<constraints>
-<rsc_order id="order-1" first="IP" then="Webserver" kind="Optional"/>
-<rsc_order id="order-2" first="Database" then="Webserver" kind="Mandatory" />
-</constraints>
--------
-======
-
-Because the above example lets +symmetrical+ default to TRUE,
-+Webserver+ must be stopped before +Database+ can be stopped,
-and +Webserver+ should be stopped before +IP+
-if they both need to be stopped.
-
-[[s-resource-colocation]]
-== Placing Resources Relative to other Resources ==
-
-indexterm:[Constraint,Colocation Constraint]
-indexterm:[Resource,Location Relative to Other Resources]
-'Colocation constraints' tell the cluster that the location of one resource
-depends on the location of another one.
-
-Colocation has an important side-effect: it affects the order in which
-resources are assigned to a node. Think about it: You can't place A relative to
-B unless you know where B is.
-footnote:[
-While the human brain is sophisticated enough to read the constraint
-in any order and choose the correct one depending on the situation,
-the cluster is not quite so smart. Yet.
-]
-
-So when you are creating colocation constraints, it is important to
-consider whether you should colocate A with B, or B with A.
-
-Another thing to keep in mind is that, assuming A is colocated with
-B, the cluster will take into account A's preferences when
-deciding which node to choose for B.
-
-For a detailed look at exactly how this occurs, see
-http://clusterlabs.org/doc/Colocation_Explained.pdf[Colocation Explained].
-
-[IMPORTANT]
-====
-Colocation constraints affect 'only' the placement of resources; they do 'not'
-require that the resources be started in a particular order. If you want
-resources to be started on the same node 'and' in a specific order, you need
-both an ordering constraint (see <<s-resource-ordering>>) 'and' a colocation
-constraint, or alternatively, a group (see <<group-resources>>).
-====
-
-=== Colocation Properties ===
-
-indexterm:[XML element,rsc_colocation element]
-indexterm:[Constraint,Colocation Constraint,rsc_colocation element]
-
-.Attributes of a rsc_colocation Constraint
-[width="95%",cols="1m,1,<4",options="header",align="center"]
-|=========================================================
-
-|Field
-|Default
-|Description
-
-|id
-|
-|A unique name for the constraint (required).
-indexterm:[XML attribute,id attribute,rsc_colocation element]
-indexterm:[XML element,rsc_colocation element,id attribute]
-
-|rsc
-|
-|The name of a resource that should be located relative to +with-rsc+ (required).
-indexterm:[XML attribute,rsc attribute,rsc_colocation element]
-indexterm:[XML element,rsc_colocation element,rsc attribute]
-
-|with-rsc
-|
-|The name of the resource used as the colocation target. The cluster will
- decide where to put this resource first and then decide where to put +rsc+ (required).
-indexterm:[XML attribute,with-rsc attribute,rsc_colocation element]
-indexterm:[XML element,rsc_colocation element,with-rsc attribute]
-
-|node-attribute
-|#uname
-|The node attribute that must be the same on the node running +rsc+ and the
- node running +with-rsc+ for the constraint to be satisfied. (For details,
- see <<s-coloc-attribute>>.)
-indexterm:[XML attribute,node-attribute attribute,rsc_colocation element]
-indexterm:[XML element,rsc_colocation element,node-attribute attribute]
-
-|score
-|
-|Positive values indicate the resources should run on the same
- node. Negative values indicate the resources should run on
- different nodes. Values of \+/- +INFINITY+ change "should" to "must".
-indexterm:[XML attribute,score attribute,rsc_colocation element]
-indexterm:[XML element,rsc_colocation element,score attribute]
-
-|=========================================================
-
-=== Mandatory Placement ===
-
-Mandatory placement occurs when the constraint's score is
-++INFINITY+ or +-INFINITY+. In such cases, if the constraint can't be
-satisfied, then the +rsc+ resource is not permitted to run. For
-+score=INFINITY+, this includes cases where the +with-rsc+ resource is
-not active.
-
-If you need resource +A+ to always run on the same machine as
-resource +B+, you would add the following constraint:
-
-.Mandatory colocation constraint for two resources
-====
-[source,XML]
-<rsc_colocation id="colocate" rsc="A" with-rsc="B" score="INFINITY"/>
-====
-
-Remember, because +INFINITY+ was used, if +B+ can't run on any
-of the cluster nodes (for whatever reason) then +A+ will not
-be allowed to run. Whether +A+ is running or not has no effect on +B+.
-
-Alternatively, you may want the opposite -- that +A+ 'cannot'
-run on the same machine as +B+. In this case, use
-+score="-INFINITY"+.
-
-.Mandatory anti-colocation constraint for two resources
-====
-[source,XML]
-<rsc_colocation id="anti-colocate" rsc="A" with-rsc="B" score="-INFINITY"/>
-====
-
-Again, by specifying +-INFINITY+, the constraint is binding. So if the
-only place left to run is where +B+ already is, then
-+A+ may not run anywhere.
-
-As with +INFINITY+, +B+ can run even if +A+ is stopped.
-However, in this case +A+ also can run if +B+ is stopped, because it still
-meets the constraint of +A+ and +B+ not running on the same node.
-
-=== Advisory Placement ===
-
-If mandatory placement is about "must" and "must not", then advisory
-placement is the "I'd prefer if" alternative. For constraints with
-scores greater than +-INFINITY+ and less than +INFINITY+, the cluster
-will try to accommodate your wishes but may ignore them if the
-alternative is to stop some of the cluster resources.
-
-As in life, where if enough people prefer something it effectively
-becomes mandatory, advisory colocation constraints can combine with
-other elements of the configuration to behave as if they were
-mandatory.
-
-.Advisory colocation constraint for two resources
-====
-[source,XML]
-<rsc_colocation id="colocate-maybe" rsc="A" with-rsc="B" score="500"/>
-====
-
-[[s-coloc-attribute]]
-=== Colocation by Node Attribute ===
-
-The +node-attribute+ property of a colocation constraints allows you to express
-the requirement, "these resources must be on similar nodes".
-
-As an example, imagine that you have two Storage Area Networks (SANs) that are
-not controlled by the cluster, and each node is connected to one or the other.
-You may have two resources +r1+ and +r2+ such that +r2+ needs to use the same
-SAN as +r1+, but doesn't necessarily have to be on the same exact node.
-In such a case, you could define a <<s-node-attributes,node attribute>> named
-+san+, with the value +san1+ or +san2+ on each node as appropriate. Then, you
-could colocate +r2+ with +r1+ using +node-attribute+ set to +san+.
-
-[[s-resource-sets]]
-== Resource Sets ==
-
-'Resource sets' allow multiple resources to be affected by a single constraint.
-indexterm:[Constraint,Resource Set]
-indexterm:[Resource,Resource Set]
-
-.A set of 3 resources
-====
-[source,XML]
-----
-<resource_set id="resource-set-example">
- <resource_ref id="A"/>
- <resource_ref id="B"/>
- <resource_ref id="C"/>
-</resource_set>
-----
-====
-
-Resource sets are valid inside +rsc_location+,
-+rsc_order+ (see <<s-resource-sets-ordering>>),
-+rsc_colocation+ (see <<s-resource-sets-colocation>>),
-and +rsc_ticket+ (see <<s-ticket-constraints>>) constraints.
-
-A resource set has a number of properties that can be set,
-though not all have an effect in all contexts.
-
-.Attributes of a resource_set Element
-[width="95%",cols="2m,1,<5",options="header",align="center"]
-|=========================================================
-
-|Field
-|Default
-|Description
-
-|id
-|
-|A unique name for the set
-indexterm:[XML attribute,id attribute,resource_set element]
-indexterm:[XML element,resource_set element,id attribute]
-
-|sequential
-|true
-|Whether the members of the set must be acted on in order.
- Meaningful within +rsc_order+ and +rsc_colocation+.
-indexterm:[XML attribute,sequential attribute,resource_set element]
-indexterm:[XML element,resource_set element,sequential attribute]
-
-|require-all
-|true
-|Whether all members of the set must be active before continuing.
- With the current implementation, the cluster may continue even if only one
- member of the set is started, but if more than one member of the set is
- starting at the same time, the cluster will still wait until all of those have
- started before continuing (this may change in future versions).
- Meaningful within +rsc_order+.
-indexterm:[XML attribute,require-all attribute,resource_set element]
-indexterm:[XML element,resource_set element,require-all attribute]
-
-|role
-|
-|Limit the effect of the constraint to the specified role.
- Meaningful within +rsc_location+, +rsc_colocation+ and +rsc_ticket+.
-indexterm:[XML attribute,role attribute,resource_set element]
-indexterm:[XML element,resource_set element,role attribute]
-
-|action
-|
-|Limit the effect of the constraint to the specified action.
- Meaningful within +rsc_order+.
-indexterm:[XML attribute,action attribute,resource_set element]
-indexterm:[XML element,resource_set element,action attribute]
-
-|score
-|
-|'Advanced use only.' Use a specific score for this set within the constraint.
-indexterm:[XML attribute,score attribute,resource_set element]
-indexterm:[XML element,resource_set element,score attribute]
-
-|=========================================================
-
-[[s-resource-sets-ordering]]
-== Ordering Sets of Resources ==
-
-A common situation is for an administrator to create a chain of
-ordered resources, such as:
-
-.A chain of ordered resources
-======
-[source,XML]
--------
-<constraints>
- <rsc_order id="order-1" first="A" then="B" />
- <rsc_order id="order-2" first="B" then="C" />
- <rsc_order id="order-3" first="C" then="D" />
-</constraints>
--------
-======
-
-.Visual representation of the four resources' start order for the above constraints
-image::images/resource-set.png["Ordered set",width="16cm",height="2.5cm",align="center"]
-
-=== Ordered Set ===
-
-To simplify this situation, resource sets (see <<s-resource-sets>>) can be used
-within ordering constraints:
-
-.A chain of ordered resources expressed as a set
-======
-[source,XML]
--------
-<constraints>
- <rsc_order id="order-1">
- <resource_set id="ordered-set-example" sequential="true">
- <resource_ref id="A"/>
- <resource_ref id="B"/>
- <resource_ref id="C"/>
- <resource_ref id="D"/>
- </resource_set>
- </rsc_order>
-</constraints>
--------
-======
-
-While the set-based format is not less verbose, it is significantly
-easier to get right and maintain.
-
-[IMPORTANT]
-=========
-If you use a higher-level tool, pay attention to how it exposes this
-functionality. Depending on the tool, creating a set +A B+ may be equivalent to
-+A then B+, or +B then A+.
-=========
-
-=== Ordering Multiple Sets ===
-
-The syntax can be expanded to allow sets of resources to be ordered relative to
-each other, where the members of each individual set may be ordered or
-unordered (controlled by the +sequential+ property). In the example below, +A+
-and +B+ can both start in parallel, as can +C+ and +D+, however +C+ and +D+ can
-only start once _both_ +A+ _and_ +B+ are active.
-
-.Ordered sets of unordered resources
-======
-[source,XML]
--------
-<constraints>
- <rsc_order id="order-1">
- <resource_set id="ordered-set-1" sequential="false">
- <resource_ref id="A"/>
- <resource_ref id="B"/>
- </resource_set>
- <resource_set id="ordered-set-2" sequential="false">
- <resource_ref id="C"/>
- <resource_ref id="D"/>
- </resource_set>
- </rsc_order>
- </constraints>
--------
-======
-
-.Visual representation of the start order for two ordered sets of unordered resources
-image::images/two-sets.png["Two ordered sets",width="13cm",height="7.5cm",align="center"]
-
-Of course either set -- or both sets -- of resources can also be
-internally ordered (by setting +sequential="true"+) and there is no
-limit to the number of sets that can be specified.
-
-.Advanced use of set ordering - Three ordered sets, two of which are internally unordered
-======
-[source,XML]
--------
-<constraints>
- <rsc_order id="order-1">
- <resource_set id="ordered-set-1" sequential="false">
- <resource_ref id="A"/>
- <resource_ref id="B"/>
- </resource_set>
- <resource_set id="ordered-set-2" sequential="true">
- <resource_ref id="C"/>
- <resource_ref id="D"/>
- </resource_set>
- <resource_set id="ordered-set-3" sequential="false">
- <resource_ref id="E"/>
- <resource_ref id="F"/>
- </resource_set>
- </rsc_order>
-</constraints>
--------
-======
-
-.Visual representation of the start order for the three sets defined above
-image::images/three-sets.png["Three ordered sets",width="16cm",height="7.5cm",align="center"]
-
-[IMPORTANT]
-====
-An ordered set with +sequential=false+ makes sense only if there is another
-set in the constraint. Otherwise, the constraint has no effect.
-====
-
-=== Resource Set OR Logic ===
-
-The unordered set logic discussed so far has all been "AND" logic.
-To illustrate this take the 3 resource set figure in the previous section.
-Those sets can be expressed, +(A and B) then \(C) then (D) then (E and F)+.
-
-Say for example we want to change the first set, +(A and B)+, to use "OR" logic
-so the sets look like this: +(A or B) then \(C) then (D) then (E and F)+.
-This functionality can be achieved through the use of the +require-all+
-option. This option defaults to TRUE which is why the
-"AND" logic is used by default. Setting +require-all=false+ means only one
-resource in the set needs to be started before continuing on to the next set.
-
-.Resource Set "OR" logic: Three ordered sets, where the first set is internally unordered with "OR" logic
-======
-[source,XML]
--------
-<constraints>
- <rsc_order id="order-1">
- <resource_set id="ordered-set-1" sequential="false" require-all="false">
- <resource_ref id="A"/>
- <resource_ref id="B"/>
- </resource_set>
- <resource_set id="ordered-set-2" sequential="true">
- <resource_ref id="C"/>
- <resource_ref id="D"/>
- </resource_set>
- <resource_set id="ordered-set-3" sequential="false">
- <resource_ref id="E"/>
- <resource_ref id="F"/>
- </resource_set>
- </rsc_order>
-</constraints>
--------
-======
-
-[IMPORTANT]
-====
-An ordered set with +require-all=false+ makes sense only in conjunction with
-+sequential=false+. Think of it like this: +sequential=false+ modifies the set
-to be an unordered set using "AND" logic by default, and adding
-+require-all=false+ flips the unordered set's "AND" logic to "OR" logic.
-====
-
-[[s-resource-sets-colocation]]
-== Colocating Sets of Resources ==
-
-Another common situation is for an administrator to create a set of
-colocated resources.
-
-The simplest way to do this is to define a resource group (see
-<<group-resources>>), but that cannot always accurately express the desired
-relationships. For example, maybe the resources do not need to be ordered.
-
-Another way would be to define each relationship as an individual constraint,
-but that causes a difficult-to-follow constraint explosion as the number of
-resources and combinations grow.
-
-.Colocation chain as individual constraints, where A is placed first, then B, then C, then D
-======
-[source,XML]
--------
-<constraints>
- <rsc_colocation id="coloc-1" rsc="D" with-rsc="C" score="INFINITY"/>
- <rsc_colocation id="coloc-2" rsc="C" with-rsc="B" score="INFINITY"/>
- <rsc_colocation id="coloc-3" rsc="B" with-rsc="A" score="INFINITY"/>
-</constraints>
--------
-======
-
-To express complicated relationships with a simplified syntax
-footnote:[which is not the same as saying easy to follow],
-<<s-resource-sets,resource sets>> can be used within colocation constraints.
-
-.Equivalent colocation chain expressed using +resource_set+
-======
-[source,XML]
--------
-<constraints>
- <rsc_colocation id="coloc-1" score="INFINITY" >
- <resource_set id="colocated-set-example" sequential="true">
- <resource_ref id="A"/>
- <resource_ref id="B"/>
- <resource_ref id="C"/>
- <resource_ref id="D"/>
- </resource_set>
- </rsc_colocation>
-</constraints>
--------
-======
-
-[NOTE]
-====
-Within a +resource_set+, the resources are listed in the order they are
-_placed_, which is the reverse of the order in which they are _colocated_.
-In the above example, resource +A+ is placed before resource +B+, which is
-the same as saying resource +B+ is colocated with resource +A+.
-====
-
-As with individual constraints, a resource that can't be active prevents any
-resource that must be colocated with it from being active. In both of the two
-previous examples, if +B+ is unable to run, then both +C+ and by inference +D+
-must remain stopped.
-
-[IMPORTANT]
-=========
-If you use a higher-level tool, pay attention to how it exposes this
-functionality. Depending on the tool, creating a set +A B+ may be equivalent to
-+A with B+, or +B with A+.
-=========
-
-Resource sets can also be used to tell the cluster that entire _sets_ of
-resources must be colocated relative to each other, while the individual
-members within any one set may or may not be colocated relative to each other
-(determined by the set's +sequential+ property).
-
-In the following example, resources +B+, +C+, and +D+ will each be colocated
-with +A+ (which will be placed first). +A+ must be able to run in order for any
-of the resources to run, but any of +B+, +C+, or +D+ may be stopped without
-affecting any of the others.
-
-.Using colocated sets to specify a shared dependency
-======
-[source,XML]
--------
-<constraints>
- <rsc_colocation id="coloc-1" score="INFINITY" >
- <resource_set id="colocated-set-2" sequential="false">
- <resource_ref id="B"/>
- <resource_ref id="C"/>
- <resource_ref id="D"/>
- </resource_set>
- <resource_set id="colocated-set-1" sequential="true">
- <resource_ref id="A"/>
- </resource_set>
- </rsc_colocation>
-</constraints>
--------
-======
-
-[NOTE]
-====
-Pay close attention to the order in which resources and sets are listed.
-While the members of any one sequential set are placed first to last (i.e., the
-colocation dependency is last with first), multiple sets are placed last to
-first (i.e. the colocation dependency is first with last).
-====
-
-[IMPORTANT]
-====
-A colocated set with +sequential="false"+ makes sense only if there is
-another set in the constraint. Otherwise, the constraint has no effect.
-====
-
-There is no inherent limit to the number and size of the sets used.
-The only thing that matters is that in order for any member of one set
-in the constraint to be active, all members of sets listed after it must also
-be active (and naturally on the same node); and if a set has +sequential="true"+,
-then in order for one member of that set to be active, all members listed
-before it must also be active.
-
-If desired, you can restrict the dependency to instances of promotable clone
-resources that are in a specific role, using the set's +role+ property.
-
-.Colocation in which the members of the middle set have no interdependencies, and the last set listed applies only to instances in the master role
-======
-[source,XML]
--------
-<constraints>
- <rsc_colocation id="coloc-1" score="INFINITY" >
- <resource_set id="colocated-set-1" sequential="true">
- <resource_ref id="F"/>
- <resource_ref id="G"/>
- </resource_set>
- <resource_set id="colocated-set-2" sequential="false">
- <resource_ref id="C"/>
- <resource_ref id="D"/>
- <resource_ref id="E"/>
- </resource_set>
- <resource_set id="colocated-set-3" sequential="true" role="Master">
- <resource_ref id="A"/>
- <resource_ref id="B"/>
- </resource_set>
- </rsc_colocation>
-</constraints>
--------
-======
-
-.Visual representation of the above example (resources are placed from left to right)
-image::images/pcmk-colocated-sets.png["Colocation chain",width="960px",height="431px",align="center"]
-
-[NOTE]
-====
-Unlike ordered sets, colocated sets do not use the +require-all+ option.
-====
diff --git a/doc/Pacemaker_Explained/en-US/Ch-Fencing.txt b/doc/Pacemaker_Explained/en-US/Ch-Fencing.txt
deleted file mode 100644
index aebf1d0489..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ch-Fencing.txt
+++ /dev/null
@@ -1,1028 +0,0 @@
-:compat-mode: legacy
-= Fencing =
-
-////
-We prefer [[ch-fencing]], but older versions of asciidoc don't deal well
-with that construct for chapter headings
-////
-anchor:ch-fencing[Chapter 6, Fencing]
-indexterm:[Fencing, Configuration]
-indexterm:[STONITH, Configuration]
-
-== What Is Fencing? ==
-
-'Fencing' is the ability to make a node unable to run resources, even when that
-node is unresponsive to cluster commands.
-
-Fencing is also known as 'STONITH', an acronym for "Shoot The Other Node In The
-Head", since the most common fencing method is cutting power to the node.
-Another method is "fabric fencing", cutting the node's access to some
-capability required to run resources (such as network access or a shared disk).
-
-== Why Is Fencing Necessary? ==
-
-Fencing protects your data from being corrupted by malfunctioning nodes or
-unintentional concurrent access to shared resources.
-
-Fencing protects against the "split brain" failure scenario, where cluster
-nodes have lost the ability to reliably communicate with each other but are
-still able to run resources. If the cluster just assumed that uncommunicative
-nodes were down, then multiple instances of a resource could be started on
-different nodes.
-
-The effect of split brain depends on the resource type. For example, an IP
-address brought up on two hosts on a network will cause packets to randomly be
-sent to one or the other host, rendering the IP useless. For a database or
-clustered file system, the effect could be much more severe, causing data
-corruption or divergence.
-
-Fencing also is used when a resource cannot otherwise be stopped. If a failed
-resource fails to stop, it cannot be recovered elsewhere. Fencing the
-resource's node is the only way to ensure the resource is recoverable.
-
-Users may also configure the +on-fail+ property of any resource operation to
-+fencing+, in which case the cluster will fence the resource's node if the
-operation fails.
-
-== Fence Devices ==
-
-A 'fence device' (or 'fencing device') is a special type of resource that
-provides the means to fence a node.
-
-Examples of fencing devices include intelligent power switches and IPMI devices
-that accept SNMP commands to cut power to a node, and iSCSI controllers that
-allow SCSI reservations to be used to cut a node's access to a shared disk.
-
-Since fencing devices will be used to recover from loss of networking
-connectivity to other nodes, it is essential that they do not rely on the same
-network as the cluster itself, otherwise that network becomes a single point of
-failure.
-
-Since loss of a node due to power outage is indistinguishable from loss of
-network connectivity to that node, it is also essential that at least one fence
-device for a node does not share power with that node. For example, an on-board
-IPMI controller that shares power with its host should not be used as the sole
-fencing device for that host.
-
-Since fencing is used to isolate malfunctioning nodes, no fence device should
-rely on its target functioning properly. This includes, for example, devices
-that ssh into a node and issue a shutdown command (such devices might be
-suitable for testing, but never for production).
-
-== Fence Agents ==
-
-A 'fence agent' (or 'fencing agent') is a +stonith+-class resource agent.
-
-The fence agent standard provides commands (such as +off+ and +reboot+) that
-the cluster can use to fence nodes. As with other resource agent classes,
-this allows a layer of abstraction so that Pacemaker doesn't need any knowledge
-about specific fencing technologies -- that knowledge is isolated in the agent.
-
-== When a Fence Device Can Be Used ==
-
-Fencing devices do not actually "run" like most services. Typically, they just
-provide an interface for sending commands to an external device.
-
-Additionally, fencing may be initiated by Pacemaker, by other cluster-aware software
-such as DRBD or DLM, or manually by an administrator, at any point in the
-cluster life cycle, including before any resources have been started.
-
-To accommodate this, Pacemaker does not require the fence device resource to be
-"started" in order to be used. Whether a fence device is started or not
-determines whether a node runs any recurring monitor for the device, and gives
-the node a slight preference for being chosen to execute fencing using that
-device.
-
-By default, any node can execute any fencing device. If a fence device is
-disabled by setting its +target-role+ to Stopped, then no node can use that
-device. If mandatory location constraints prevent a specific node from
-"running" a fence device, then that node will never be chosen to execute
-fencing using the device. A node may fence itself, but the cluster will choose
-that only if no other nodes can do the fencing.
-
-A common configuration scenario is to have one fence device per target node.
-In such a case, users often configure anti-location constraints so that
-the target node does not monitor its own device. The best practice is to make
-the constraint optional (i.e. a finite negative score rather than +-INFINITY+),
-so that the node can fence itself if no other nodes can.
-
-== Limitations of Fencing Resources ==
-
-Fencing resources have certain limitations that other resource classes don't:
-
-* They may have only one set of meta-attributes and one set of instance
- attributes.
-* If <<ch-rules,rules>> are used to determine fencing resource options, these
- may only be evaluated when first read, meaning that later changes to the
- rules will have no effect. Therefore, it is better to avoid confusion and not
- use rules at all with fencing resources.
-
-These limitations could be revisited if there is significant user demand.
-
-== Special Options for Fencing Resources ==
-
-The table below lists special instance attributes that may be set for any
-fencing resource ('not' meta-attributes, even though they are interpreted by
-pacemaker rather than the fence agent). These are also listed in the man page
-for +pacemaker-fenced+.
-
-.Additional Properties of Fencing Resources
-[width="95%",cols="8m,3,6,<12",options="header",align="center"]
-|=========================================================
-
-|Field
-|Type
-|Default
-|Description
-
-|stonith-timeout
-|NA
-|NA
-a|Older versions used this to override the default period to wait for a STONITH (reboot, on, off) action to complete for this device.
- It has been replaced by the +pcmk_reboot_timeout+ and +pcmk_off_timeout+ properties.
- indexterm:[stonith-timeout,Fencing]
- indexterm:[Fencing,Property,stonith-timeout]
-
-////
- (not yet implemented)
- priority
- integer
- 0
- The priority of the STONITH resource. Devices are tried in order of highest priority to lowest.
- indexterm priority,Fencing
- indexterm Fencing,Property,priority
-////
-
-|provides
-|string
-|
-|Any special capability provided by the fence device. Currently, only one such
- capability is meaningful: +unfencing+ (see <<s-unfencing>>).
- indexterm:[provides,Fencing]
- indexterm:[Fencing,Property,provides]
-
-|pcmk_host_map
-|string
-|
-|A mapping of host names to ports numbers for devices that do not support host names.
- Example: +node1:1;node2:2,3+ tells the cluster to use port 1 for
- *node1* and ports 2 and 3 for *node2*. If +pcmk_host_check+ is explicitly set
- to +static-list+, either this or +pcmk_host_list+ must be set.
- indexterm:[pcmk_host_map,Fencing]
- indexterm:[Fencing,Property,pcmk_host_map]
-
-|pcmk_host_list
-|string
-|
-|A list of machines controlled by this device. If +pcmk_host_check+ is
- explicitly set to +static-list+, either this or +pcmk_host_map+ must be set.
- indexterm:[pcmk_host_list,Fencing]
- indexterm:[Fencing,Property,pcmk_host_list]
-
-|pcmk_host_check
-|string
-|A value appropriate to other configuration options and
- device capabilities (see note below)
-a|How to determine which machines are controlled by the device.
- Allowed values:
-
-* +dynamic-list:+ query the device via the "list" command
-* +static-list:+ check the +pcmk_host_list+ or +pcmk_host_map+ attribute
-* +status:+ query the device via the "status" command
-* +none:+ assume every device can fence every machine
-
-indexterm:[pcmk_host_check,Fencing]
-indexterm:[Fencing,Property,pcmk_host_check]
-
-|pcmk_delay_max
-|time
-|0s
-|Enable a random delay of up to the time specified before executing fencing
-actions. This is sometimes used in two-node clusters to ensure that the
-nodes don't fence each other at the same time. The overall delay introduced
-by pacemaker is derived from this random delay value adding a static delay so
-that the sum is kept below the maximum delay.
-
-indexterm:[pcmk_delay_max,Fencing]
-indexterm:[Fencing,Property,pcmk_delay_max]
-
-|pcmk_delay_base
-|time
-|0s
-|Enable a static delay before executing fencing actions. This can be used
- e.g. in two-node clusters to ensure that the nodes don't fence each other,
- by having separate fencing resources with different values. The node that is
- fenced with the shorter delay will lose a fencing race. The overall delay
- introduced by pacemaker is derived from this value plus a random delay such
- that the sum is kept below the maximum delay.
-
-indexterm:[pcmk_delay_base,Fencing]
-indexterm:[Fencing,Property,pcmk_delay_base]
-
-|pcmk_action_limit
-|integer
-|1
-|The maximum number of actions that can be performed in parallel on this
- device, if the cluster option +concurrent-fencing+ is +true+. -1 is unlimited.
-
-indexterm:[pcmk_action_limit,Fencing]
-indexterm:[Fencing,Property,pcmk_action_limit]
-
-|pcmk_host_argument
-|string
-|+port+ otherwise +plug+ if supported according to the metadata of the fence agent
-|'Advanced use only.' Which parameter should be supplied to the fence agent to
-identify the node to be fenced. Some devices support neither the standard +plug+
-nor the deprecated +port+ parameter, or may provide additional ones. Use this to
-specify an alternate, device-specific parameter. A value of +none+ tells the
-cluster not to supply any additional parameters.
- indexterm:[pcmk_host_argument,Fencing]
- indexterm:[Fencing,Property,pcmk_host_argument]
-
-|pcmk_reboot_action
-|string
-|reboot
-|'Advanced use only.' The command to send to the resource agent in order to
-reboot a node. Some devices do not support the standard commands or may provide
-additional ones. Use this to specify an alternate, device-specific command.
- indexterm:[pcmk_reboot_action,Fencing]
- indexterm:[Fencing,Property,pcmk_reboot_action]
-
-|pcmk_reboot_timeout
-|time
-|60s
-|'Advanced use only.' Specify an alternate timeout to use for `reboot` actions
-instead of the value of +stonith-timeout+. Some devices need much more or less
-time to complete than normal. Use this to specify an alternate, device-specific
-timeout.
- indexterm:[pcmk_reboot_timeout,Fencing]
- indexterm:[Fencing,Property,pcmk_reboot_timeout]
- indexterm:[stonith-timeout,Fencing]
- indexterm:[Fencing,Property,stonith-timeout]
-
-|pcmk_reboot_retries
-|integer
-|2
-|'Advanced use only.' The maximum number of times to retry the `reboot` command
-within the timeout period. Some devices do not support multiple connections, and
-operations may fail if the device is busy with another task, so Pacemaker will
-automatically retry the operation, if there is time remaining. Use this option
-to alter the number of times Pacemaker retries before giving up.
- indexterm:[pcmk_reboot_retries,Fencing]
- indexterm:[Fencing,Property,pcmk_reboot_retries]
-
-|pcmk_off_action
-|string
-|off
-|'Advanced use only.' The command to send to the resource agent in order to
-shut down a node. Some devices do not support the standard commands or may provide
-additional ones. Use this to specify an alternate, device-specific command.
- indexterm:[pcmk_off_action,Fencing]
- indexterm:[Fencing,Property,pcmk_off_action]
-
-|pcmk_off_timeout
-|time
-|60s
-|'Advanced use only.' Specify an alternate timeout to use for `off` actions
-instead of the value of +stonith-timeout+. Some devices need much more or less
-time to complete than normal. Use this to specify an alternate, device-specific
-timeout.
- indexterm:[pcmk_off_timeout,Fencing]
- indexterm:[Fencing,Property,pcmk_off_timeout]
- indexterm:[stonith-timeout,Fencing]
- indexterm:[Fencing,Property,stonith-timeout]
-
-|pcmk_off_retries
-|integer
-|2
-|'Advanced use only.' The maximum number of times to retry the `off` command
-within the timeout period. Some devices do not support multiple connections, and
-operations may fail if the device is busy with another task, so Pacemaker will
-automatically retry the operation, if there is time remaining. Use this option
-to alter the number of times Pacemaker retries before giving up.
- indexterm:[pcmk_off_retries,Fencing]
- indexterm:[Fencing,Property,pcmk_off_retries]
-
-|pcmk_list_action
-|string
-|list
-|'Advanced use only.' The command to send to the resource agent in order to
-list nodes. Some devices do not support the standard commands or may provide
-additional ones. Use this to specify an alternate, device-specific command.
- indexterm:[pcmk_list_action,Fencing]
- indexterm:[Fencing,Property,pcmk_list_action]
-
-|pcmk_list_timeout
-|time
-|60s
-|'Advanced use only.' Specify an alternate timeout to use for `list` actions
-instead of the value of +stonith-timeout+. Some devices need much more or less
-time to complete than normal. Use this to specify an alternate, device-specific
-timeout.
- indexterm:[pcmk_list_timeout,Fencing]
- indexterm:[Fencing,Property,pcmk_list_timeout]
-
-|pcmk_list_retries
-|integer
-|2
-|'Advanced use only.' The maximum number of times to retry the `list` command
-within the timeout period. Some devices do not support multiple connections, and
-operations may fail if the device is busy with another task, so Pacemaker will
-automatically retry the operation, if there is time remaining. Use this option
-to alter the number of times Pacemaker retries before giving up.
- indexterm:[pcmk_list_retries,Fencing]
- indexterm:[Fencing,Property,pcmk_list_retries]
-
-|pcmk_monitor_action
-|string
-|monitor
-|'Advanced use only.' The command to send to the resource agent in order to
-report extended status. Some devices do not support the standard commands or may provide
-additional ones. Use this to specify an alternate, device-specific command.
- indexterm:[pcmk_monitor_action,Fencing]
- indexterm:[Fencing,Property,pcmk_monitor_action]
-
-|pcmk_monitor_timeout
-|time
-|60s
-|'Advanced use only.' Specify an alternate timeout to use for `monitor` actions
-instead of the value of +stonith-timeout+. Some devices need much more or less
-time to complete than normal. Use this to specify an alternate, device-specific
-timeout.
- indexterm:[pcmk_monitor_timeout,Fencing]
- indexterm:[Fencing,Property,pcmk_monitor_timeout]
-
-|pcmk_monitor_retries
-|integer
-|2
-|'Advanced use only.' The maximum number of times to retry the `monitor` command
-within the timeout period. Some devices do not support multiple connections, and
-operations may fail if the device is busy with another task, so Pacemaker will
-automatically retry the operation, if there is time remaining. Use this option
-to alter the number of times Pacemaker retries before giving up.
- indexterm:[pcmk_monitor_retries,Fencing]
- indexterm:[Fencing,Property,pcmk_monitor_retries]
-
-|pcmk_status_action
-|string
-|status
-|'Advanced use only.' The command to send to the resource agent in order to
-report status. Some devices do not support the standard commands or may provide
-additional ones. Use this to specify an alternate, device-specific command.
- indexterm:[pcmk_status_action,Fencing]
- indexterm:[Fencing,Property,pcmk_status_action]
-
-|pcmk_status_timeout
-|time
-|60s
-|'Advanced use only.' Specify an alternate timeout to use for `status` actions
-instead of the value of +stonith-timeout+. Some devices need much more or less
-time to complete than normal. Use this to specify an alternate, device-specific
-timeout.
- indexterm:[pcmk_status_timeout,Fencing]
- indexterm:[Fencing,Property,pcmk_status_timeout]
-
-|pcmk_status_retries
-|integer
-|2
-|'Advanced use only.' The maximum number of times to retry the `status` command
-within the timeout period. Some devices do not support multiple connections, and
-operations may fail if the device is busy with another task, so Pacemaker will
-automatically retry the operation, if there is time remaining. Use this option
-to alter the number of times Pacemaker retries before giving up.
- indexterm:[pcmk_status_retries,Fencing]
- indexterm:[Fencing,Property,pcmk_status_retries]
-
-|=========================================================
-
-[NOTE]
-====
-The default value for +pcmk_host_check+ is +static-list+ if either
-+pcmk_host_list+ or +pcmk_host_map+ is configured. If neither of those are
-configured, the default is +dynamic-list+ if the fence device supports the list
-action, or +status+ if the fence device supports the status action but not the
-list action. If none of those conditions apply, the default is +none+.
-====
-
-[[s-unfencing]]
-== Unfencing ==
-
-With fabric fencing (such as cutting network or shared disk access rather than
-power), it is expected that the cluster will fence the node, and
-then a system administrator must manually investigate what went wrong, correct
-any issues found, then reboot (or restart the cluster services on) the node.
-
-Once the node reboots and rejoins the cluster, some fabric fencing devices
-require an explicit command to restore the node's access. This capability is
-called 'unfencing' and is typically implemented as the fence agent's +on+
-command.
-
-If any cluster resource has +requires+ set to +unfencing+, then that resource
-will not be probed or started on a node until that node has been unfenced.
-
-== Fence Devices Dependent on Other Resources ==
-
-In some cases, a fence device may require some other cluster resource (such as
-an IP address) to be active in order to function properly.
-
-This is obviously undesirable in general: fencing may be required when the
-depended-on resource is not active, or fencing may be required because the node
-running the depended-on resource is no longer responding.
-
-However, this may be acceptable under certain conditions:
-
-* The dependent fence device should not be able to target any node that is
- allowed to run the depended-on resource.
-
-* The depended-on resource should not be disabled during production operation.
-
-* The +concurrent-fencing+ cluster property should be set to +true+. Otherwise,
- if both the node running the depended-on resource and some node targeted by
- the dependent fence device need to be fenced, the fencing of the node
- running the depended-on resource might be ordered first, making the second
- fencing impossible and blocking further recovery. With concurrent fencing,
- the dependent fence device might fail at first due to the depended-on
- resource being unavailable, but it will be retried and eventually succeed
- once the resource is brought back up.
-
-Even under those conditions, there is one unlikely problem scenario. The DC
-always schedules fencing of itself after any other fencing needed, to avoid
-unnecessary repeated DC elections. If the dependent fence device targets the
-DC, and both the DC and a different node running the depended-on resource need
-to be fenced, the DC fencing will always fail and block further recovery. Note,
-however, that losing a DC node entirely causes some other node to become DC and
-schedule the fencing, so this is only a risk when a stop or other operation
-with +on-fail+ set to +fencing+ fails on the DC.
-
-== Configuring Fencing ==
-
-. Find the correct driver:
-+
-----
-# stonith_admin --list-installed
-----
-
-. Find the required parameters associated with the device
- (replacing $AGENT_NAME with the name obtained from the previous step):
-+
-----
-# stonith_admin --metadata --agent $AGENT_NAME
-----
-
-. Create a file called +stonith.xml+ containing a primitive resource
- with a class of +stonith+, a type equal to the agent name obtained earlier,
- and a parameter for each of the values returned in the previous step.
-
-. If the device does not know how to fence nodes based on their uname,
- you may also need to set the special +pcmk_host_map+ parameter. See
- `man pacemaker-fenced` for details.
-
-. If the device does not support the `list` command, you may also need
- to set the special +pcmk_host_list+ and/or +pcmk_host_check+
- parameters. See `man pacemaker-fenced` for details.
-
-. If the device does not expect the victim to be specified with the
- `port` parameter, you may also need to set the special
- +pcmk_host_argument+ parameter. See `man pacemaker-fenced` for details.
-
-. Upload it into the CIB using cibadmin:
-+
-----
-# cibadmin -C -o resources --xml-file stonith.xml
-----
-
-. Set +stonith-enabled+ to true:
-+
-----
-# crm_attribute -t crm_config -n stonith-enabled -v true
-----
-
-. Once the stonith resource is running, you can test it by executing the
- following (although you might want to stop the cluster on that machine
- first):
-+
-----
-# stonith_admin --reboot nodename
-----
-
-=== Example Fencing Configuration ===
-
-Assume we have a chassis containing four nodes and an IPMI device
-active on 192.0.2.1. We would choose the `fence_ipmilan` driver,
-and obtain the following list of parameters:
-
-.Obtaining a list of Fence Agent Parameters
-====
-----
-# stonith_admin --metadata -a fence_ipmilan
-----
-
-[source,XML]
-----
-<resource-agent name="fence_ipmilan" shortdesc="Fence agent for IPMI over LAN">
- <symlink name="fence_ilo3" shortdesc="Fence agent for HP iLO3"/>
- <symlink name="fence_ilo4" shortdesc="Fence agent for HP iLO4"/>
- <symlink name="fence_idrac" shortdesc="Fence agent for Dell iDRAC"/>
- <symlink name="fence_imm" shortdesc="Fence agent for IBM Integrated Management Module"/>
- <longdesc>
- </longdesc>
- <vendor-url>
- </vendor-url>
- <parameters>
- <parameter name="auth" unique="0" required="0">
- <getopt mixed="-A"/>
- <content type="string"/>
- <shortdesc lang="en">
- </shortdesc>
- </parameter>
- <parameter name="ipaddr" unique="0" required="1">
- <getopt mixed="-a"/>
- <content type="string"/>
- <shortdesc lang="en">
- </shortdesc>
- </parameter>
- <parameter name="passwd" unique="0" required="0">
- <getopt mixed="-p"/>
- <content type="string"/>
- <shortdesc lang="en">
- </shortdesc>
- </parameter>
- <parameter name="passwd_script" unique="0" required="0">
- <getopt mixed="-S"/>
- <content type="string"/>
- <shortdesc lang="en">
- </shortdesc>
- </parameter>
- <parameter name="lanplus" unique="0" required="0">
- <getopt mixed="-P"/>
- <content type="boolean"/>
- <shortdesc lang="en">
- </shortdesc>
- </parameter>
- <parameter name="login" unique="0" required="0">
- <getopt mixed="-l"/>
- <content type="string"/>
- <shortdesc lang="en">
- </shortdesc>
- </parameter>
- <parameter name="action" unique="0" required="0">
- <getopt mixed="-o"/>
- <content type="string" default="reboot"/>
- <shortdesc lang="en">
- </shortdesc>
- </parameter>
- <parameter name="timeout" unique="0" required="0">
- <getopt mixed="-t"/>
- <content type="string"/>
- <shortdesc lang="en">
- </shortdesc>
- </parameter>
- <parameter name="cipher" unique="0" required="0">
- <getopt mixed="-C"/>
- <content type="string"/>
- <shortdesc lang="en">
- </shortdesc>
- </parameter>
- <parameter name="method" unique="0" required="0">
- <getopt mixed="-M"/>
- <content type="string" default="onoff"/>
- <shortdesc lang="en">
- </shortdesc>
- </parameter>
- <parameter name="power_wait" unique="0" required="0">
- <getopt mixed="-T"/>
- <content type="string" default="2"/>
- <shortdesc lang="en">
- </shortdesc>
- </parameter>
- <parameter name="delay" unique="0" required="0">
- <getopt mixed="-f"/>
- <content type="string"/>
- <shortdesc lang="en">
- </shortdesc>
- </parameter>
- <parameter name="privlvl" unique="0" required="0">
- <getopt mixed="-L"/>
- <content type="string"/>
- <shortdesc lang="en">
- </shortdesc>
- </parameter>
- <parameter name="verbose" unique="0" required="0">
- <getopt mixed="-v"/>
- <content type="boolean"/>
- <shortdesc lang="en">
- </shortdesc>
- </parameter>
- </parameters>
- <actions>
- <action name="on"/>
- <action name="off"/>
- <action name="reboot"/>
- <action name="status"/>
- <action name="diag"/>
- <action name="list"/>
- <action name="monitor"/>
- <action name="metadata"/>
- <action name="stop" timeout="20s"/>
- <action name="start" timeout="20s"/>
- </actions>
-</resource-agent>
-----
-====
-
-Based on that, we would create a fencing resource fragment that might look
-like this:
-
-.An IPMI-based Fencing Resource
-====
-[source,XML]
-----
-<primitive id="Fencing" class="stonith" type="fence_ipmilan" >
- <instance_attributes id="Fencing-params" >
- <nvpair id="Fencing-passwd" name="passwd" value="testuser" />
- <nvpair id="Fencing-login" name="login" value="abc123" />
- <nvpair id="Fencing-ipaddr" name="ipaddr" value="192.0.2.1" />
- <nvpair id="Fencing-pcmk_host_list" name="pcmk_host_list" value="pcmk-1 pcmk-2" />
- </instance_attributes>
- <operations >
- <op id="Fencing-monitor-10m" interval="10m" name="monitor" timeout="300s" />
- </operations>
-</primitive>
-----
-====
-
-Finally, we need to enable fencing:
-----
-# crm_attribute -t crm_config -n stonith-enabled -v true
-----
-
-== Fencing Topologies ==
-
-Pacemaker supports fencing nodes with multiple devices through a feature called
-'fencing topologies'. Fencing topologies may be used to provide alternative
-devices in case one fails, or to require multiple devices to all be executed
-successfully in order to consider the node successfully fenced, or even a
-combination of the two.
-
-Create the individual devices as you normally would, then define one or more
-+fencing-level+ entries in the +fencing-topology+ section of the configuration.
-
-* Each fencing level is attempted in order of ascending +index+. Allowed
- values are 1 through 9.
-* If a device fails, processing terminates for the current level.
- No further devices in that level are exercised, and the next level is attempted instead.
-* If the operation succeeds for all the listed devices in a level, the level is deemed to have passed.
-* The operation is finished when a level has passed (success), or all levels have been attempted (failed).
-* If the operation failed, the next step is determined by the scheduler
- and/or the controller.
-
-Some possible uses of topologies include:
-
-* Try on-board IPMI, then an intelligent power switch if that fails
-* Try fabric fencing of both disk and network, then fall back to power fencing
- if either fails
-* Wait up to a certain time for a kernel dump to complete, then cut power to
- the node
-
-.Properties of Fencing Levels
-[width="95%",cols="1m,<3",options="header",align="center"]
-|=========================================================
-
-|Field
-|Description
-
-|id
-|A unique name for the level
- indexterm:[id,fencing-level]
- indexterm:[Fencing,fencing-level,id]
-
-|target
-|The name of a single node to which this level applies
- indexterm:[target,fencing-level]
- indexterm:[Fencing,fencing-level,target]
-
-|target-pattern
-|An extended regular expression (as defined in
- http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_04[POSIX])
- matching the names of nodes to which this level applies
- indexterm:[target-pattern,fencing-level]
- indexterm:[Fencing,fencing-level,target-pattern]
-
-|target-attribute
-|The name of a node attribute that is set (to +target-value+) for nodes to
- which this level applies
- indexterm:[target-attribute,fencing-level]
- indexterm:[Fencing,fencing-level,target-attribute]
-
-|target-value
-|The node attribute value (of +target-attribute+) that is set for nodes to
- which this level applies
- indexterm:[target-attribute,fencing-level]
- indexterm:[Fencing,fencing-level,target-attribute]
-
-|index
-|The order in which to attempt the levels.
- Levels are attempted in ascending order 'until one succeeds'.
- Valid values are 1 through 9.
- indexterm:[index,fencing-level]
- indexterm:[Fencing,fencing-level,index]
-
-|devices
-|A comma-separated list of devices that must all be tried for this level
- indexterm:[devices,fencing-level]
- indexterm:[Fencing,fencing-level,devices]
-
-|=========================================================
-
-.Fencing topology with different devices for different nodes
-====
-[source,XML]
-----
- <cib crm_feature_set="3.0.6" validate-with="pacemaker-1.2" admin_epoch="1" epoch="0" num_updates="0">
- <configuration>
- ...
- <fencing-topology>
- <!-- For pcmk-1, try poison-pill and fail back to power -->
- <fencing-level id="f-p1.1" target="pcmk-1" index="1" devices="poison-pill"/>
- <fencing-level id="f-p1.2" target="pcmk-1" index="2" devices="power"/>
-
- <!-- For pcmk-2, try disk and network, and fail back to power -->
- <fencing-level id="f-p2.1" target="pcmk-2" index="1" devices="disk,network"/>
- <fencing-level id="f-p2.2" target="pcmk-2" index="2" devices="power"/>
- </fencing-topology>
- ...
- <configuration>
- <status/>
-</cib>
-----
-====
-
-=== Example Dual-Layer, Dual-Device Fencing Topologies ===
-
-The following example illustrates an advanced use of +fencing-topology+ in a cluster with the following properties:
-
-* 3 nodes (2 active prod-mysql nodes, 1 prod_mysql-rep in standby for quorum purposes)
-* the active nodes have an IPMI-controlled power board reached at 192.0.2.1 and 192.0.2.2
-* the active nodes also have two independent PSUs (Power Supply Units)
- connected to two independent PDUs (Power Distribution Units) reached at
- 198.51.100.1 (port 10 and port 11) and 203.0.113.1 (port 10 and port 11)
-* the first fencing method uses the `fence_ipmi` agent
-* the second fencing method uses the `fence_apc_snmp` agent targetting 2 fencing devices (one per PSU, either port 10 or 11)
-* fencing is only implemented for the active nodes and has location constraints
-* fencing topology is set to try IPMI fencing first then default to a "sure-kill" dual PDU fencing
-
-In a normal failure scenario, STONITH will first select +fence_ipmi+ to try to kill the faulty node.
-Using a fencing topology, if that first method fails, STONITH will then move on to selecting +fence_apc_snmp+ twice:
-
-* once for the first PDU
-* again for the second PDU
-
-The fence action is considered successful only if both PDUs report the required status. If any of them fails, STONITH loops back to the first fencing method, +fence_ipmi+, and so on until the node is fenced or fencing action is cancelled.
-
-.First fencing method: single IPMI device
-
-Each cluster node has it own dedicated IPMI channel that can be called for fencing using the following primitives:
-[source,XML]
-----
-<primitive class="stonith" id="fence_prod-mysql1_ipmi" type="fence_ipmilan">
- <instance_attributes id="fence_prod-mysql1_ipmi-instance_attributes">
- <nvpair id="fence_prod-mysql1_ipmi-instance_attributes-ipaddr" name="ipaddr" value="192.0.2.1"/>
- <nvpair id="fence_prod-mysql1_ipmi-instance_attributes-action" name="action" value="off"/>
- <nvpair id="fence_prod-mysql1_ipmi-instance_attributes-login" name="login" value="fencing"/>
- <nvpair id="fence_prod-mysql1_ipmi-instance_attributes-passwd" name="passwd" value="finishme"/>
- <nvpair id="fence_prod-mysql1_ipmi-instance_attributes-verbose" name="verbose" value="true"/>
- <nvpair id="fence_prod-mysql1_ipmi-instance_attributes-pcmk_host_list" name="pcmk_host_list" value="prod-mysql1"/>
- <nvpair id="fence_prod-mysql1_ipmi-instance_attributes-lanplus" name="lanplus" value="true"/>
- </instance_attributes>
-</primitive>
-<primitive class="stonith" id="fence_prod-mysql2_ipmi" type="fence_ipmilan">
- <instance_attributes id="fence_prod-mysql2_ipmi-instance_attributes">
- <nvpair id="fence_prod-mysql2_ipmi-instance_attributes-ipaddr" name="ipaddr" value="192.0.2.2"/>
- <nvpair id="fence_prod-mysql2_ipmi-instance_attributes-action" name="action" value="off"/>
- <nvpair id="fence_prod-mysql2_ipmi-instance_attributes-login" name="login" value="fencing"/>
- <nvpair id="fence_prod-mysql2_ipmi-instance_attributes-passwd" name="passwd" value="finishme"/>
- <nvpair id="fence_prod-mysql2_ipmi-instance_attributes-verbose" name="verbose" value="true"/>
- <nvpair id="fence_prod-mysql2_ipmi-instance_attributes-pcmk_host_list" name="pcmk_host_list" value="prod-mysql2"/>
- <nvpair id="fence_prod-mysql2_ipmi-instance_attributes-lanplus" name="lanplus" value="true"/>
- </instance_attributes>
-</primitive>
-----
-
-.Second fencing method: dual PDU devices
-
-Each cluster node also has two distinct power channels controlled by two
-distinct PDUs. That means a total of 4 fencing devices configured as follows:
-
-- Node 1, PDU 1, PSU 1 @ port 10
-- Node 1, PDU 2, PSU 2 @ port 10
-- Node 2, PDU 1, PSU 1 @ port 11
-- Node 2, PDU 2, PSU 2 @ port 11
-
-The matching fencing agents are configured as follows:
-[source,XML]
-----
-<primitive class="stonith" id="fence_prod-mysql1_apc1" type="fence_apc_snmp">
- <instance_attributes id="fence_prod-mysql1_apc1-instance_attributes">
- <nvpair id="fence_prod-mysql1_apc1-instance_attributes-ipaddr" name="ipaddr" value="198.51.100.1"/>
- <nvpair id="fence_prod-mysql1_apc1-instance_attributes-action" name="action" value="off"/>
- <nvpair id="fence_prod-mysql1_apc1-instance_attributes-port" name="port" value="10"/>
- <nvpair id="fence_prod-mysql1_apc1-instance_attributes-login" name="login" value="fencing"/>
- <nvpair id="fence_prod-mysql1_apc1-instance_attributes-passwd" name="passwd" value="fencing"/>
- <nvpair id="fence_prod-mysql1_apc1-instance_attributes-pcmk_host_list" name="pcmk_host_list" value="prod-mysql1"/>
- </instance_attributes>
-</primitive>
-<primitive class="stonith" id="fence_prod-mysql1_apc2" type="fence_apc_snmp">
- <instance_attributes id="fence_prod-mysql1_apc2-instance_attributes">
- <nvpair id="fence_prod-mysql1_apc2-instance_attributes-ipaddr" name="ipaddr" value="203.0.113.1"/>
- <nvpair id="fence_prod-mysql1_apc2-instance_attributes-action" name="action" value="off"/>
- <nvpair id="fence_prod-mysql1_apc2-instance_attributes-port" name="port" value="10"/>
- <nvpair id="fence_prod-mysql1_apc2-instance_attributes-login" name="login" value="fencing"/>
- <nvpair id="fence_prod-mysql1_apc2-instance_attributes-passwd" name="passwd" value="fencing"/>
- <nvpair id="fence_prod-mysql1_apc2-instance_attributes-pcmk_host_list" name="pcmk_host_list" value="prod-mysql1"/>
- </instance_attributes>
-</primitive>
-<primitive class="stonith" id="fence_prod-mysql2_apc1" type="fence_apc_snmp">
- <instance_attributes id="fence_prod-mysql2_apc1-instance_attributes">
- <nvpair id="fence_prod-mysql2_apc1-instance_attributes-ipaddr" name="ipaddr" value="198.51.100.1"/>
- <nvpair id="fence_prod-mysql2_apc1-instance_attributes-action" name="action" value="off"/>
- <nvpair id="fence_prod-mysql2_apc1-instance_attributes-port" name="port" value="11"/>
- <nvpair id="fence_prod-mysql2_apc1-instance_attributes-login" name="login" value="fencing"/>
- <nvpair id="fence_prod-mysql2_apc1-instance_attributes-passwd" name="passwd" value="fencing"/>
- <nvpair id="fence_prod-mysql2_apc1-instance_attributes-pcmk_host_list" name="pcmk_host_list" value="prod-mysql2"/>
- </instance_attributes>
-</primitive>
-<primitive class="stonith" id="fence_prod-mysql2_apc2" type="fence_apc_snmp">
- <instance_attributes id="fence_prod-mysql2_apc2-instance_attributes">
- <nvpair id="fence_prod-mysql2_apc2-instance_attributes-ipaddr" name="ipaddr" value="203.0.113.1"/>
- <nvpair id="fence_prod-mysql2_apc2-instance_attributes-action" name="action" value="off"/>
- <nvpair id="fence_prod-mysql2_apc2-instance_attributes-port" name="port" value="11"/>
- <nvpair id="fence_prod-mysql2_apc2-instance_attributes-login" name="login" value="fencing"/>
- <nvpair id="fence_prod-mysql2_apc2-instance_attributes-passwd" name="passwd" value="fencing"/>
- <nvpair id="fence_prod-mysql2_apc2-instance_attributes-pcmk_host_list" name="pcmk_host_list" value="prod-mysql2"/>
- </instance_attributes>
-</primitive>
-----
-
-.Location Constraints
-
-To prevent STONITH from trying to run a fencing agent on the same node it is
-supposed to fence, constraints are placed on all the fencing primitives:
-[source,XML]
-----
-<constraints>
- <rsc_location id="l_fence_prod-mysql1_ipmi" node="prod-mysql1" rsc="fence_prod-mysql1_ipmi" score="-INFINITY"/>
- <rsc_location id="l_fence_prod-mysql2_ipmi" node="prod-mysql2" rsc="fence_prod-mysql2_ipmi" score="-INFINITY"/>
- <rsc_location id="l_fence_prod-mysql1_apc2" node="prod-mysql1" rsc="fence_prod-mysql1_apc2" score="-INFINITY"/>
- <rsc_location id="l_fence_prod-mysql1_apc1" node="prod-mysql1" rsc="fence_prod-mysql1_apc1" score="-INFINITY"/>
- <rsc_location id="l_fence_prod-mysql2_apc1" node="prod-mysql2" rsc="fence_prod-mysql2_apc1" score="-INFINITY"/>
- <rsc_location id="l_fence_prod-mysql2_apc2" node="prod-mysql2" rsc="fence_prod-mysql2_apc2" score="-INFINITY"/>
-</constraints>
-----
-
-.Fencing topology
-
-Now that all the fencing resources are defined, it's time to create the right topology.
-We want to first fence using IPMI and if that does not work, fence both PDUs to effectively and surely kill the node.
-[source,XML]
-----
-<fencing-topology>
- <fencing-level devices="fence_prod-mysql1_ipmi" id="fencing-2" index="1" target="prod-mysql1"/>
- <fencing-level devices="fence_prod-mysql1_apc1,fence_prod-mysql1_apc2" id="fencing-3" index="2" target="prod-mysql1"/>
- <fencing-level devices="fence_prod-mysql2_ipmi" id="fencing-0" index="1" target="prod-mysql2"/>
- <fencing-level devices="fence_prod-mysql2_apc1,fence_prod-mysql2_apc2" id="fencing-1" index="2" target="prod-mysql2"/>
-</fencing-topology>
-----
-Please note, in +fencing-topology+, the lowest +index+ value determines the priority of the first fencing method.
-
-.Final configuration
-
-Put together, the configuration looks like this:
-[source,XML]
-----
-<cib admin_epoch="0" crm_feature_set="3.0.7" epoch="292" have-quorum="1" num_updates="29" validate-with="pacemaker-1.2">
- <configuration>
- <crm_config>
- <cluster_property_set id="cib-bootstrap-options">
- <nvpair id="cib-bootstrap-options-stonith-enabled" name="stonith-enabled" value="true"/>
- <nvpair id="cib-bootstrap-options-stonith-action" name="stonith-action" value="off"/>
- <nvpair id="cib-bootstrap-options-expected-quorum-votes" name="expected-quorum-votes" value="3"/>
- ...
- </cluster_property_set>
- </crm_config>
- <nodes>
- <node id="prod-mysql1" uname="prod-mysql1">
- <node id="prod-mysql2" uname="prod-mysql2"/>
- <node id="prod-mysql-rep1" uname="prod-mysql-rep1"/>
- <instance_attributes id="prod-mysql-rep1">
- <nvpair id="prod-mysql-rep1-standby" name="standby" value="on"/>
- </instance_attributes>
- </node>
- </nodes>
- <resources>
- <primitive class="stonith" id="fence_prod-mysql1_ipmi" type="fence_ipmilan">
- <instance_attributes id="fence_prod-mysql1_ipmi-instance_attributes">
- <nvpair id="fence_prod-mysql1_ipmi-instance_attributes-ipaddr" name="ipaddr" value="192.0.2.1"/>
- <nvpair id="fence_prod-mysql1_ipmi-instance_attributes-action" name="action" value="off"/>
- <nvpair id="fence_prod-mysql1_ipmi-instance_attributes-login" name="login" value="fencing"/>
- <nvpair id="fence_prod-mysql1_ipmi-instance_attributes-passwd" name="passwd" value="finishme"/>
- <nvpair id="fence_prod-mysql1_ipmi-instance_attributes-verbose" name="verbose" value="true"/>
- <nvpair id="fence_prod-mysql1_ipmi-instance_attributes-pcmk_host_list" name="pcmk_host_list" value="prod-mysql1"/>
- <nvpair id="fence_prod-mysql1_ipmi-instance_attributes-lanplus" name="lanplus" value="true"/>
- </instance_attributes>
- </primitive>
- <primitive class="stonith" id="fence_prod-mysql2_ipmi" type="fence_ipmilan">
- <instance_attributes id="fence_prod-mysql2_ipmi-instance_attributes">
- <nvpair id="fence_prod-mysql2_ipmi-instance_attributes-ipaddr" name="ipaddr" value="192.0.2.2"/>
- <nvpair id="fence_prod-mysql2_ipmi-instance_attributes-action" name="action" value="off"/>
- <nvpair id="fence_prod-mysql2_ipmi-instance_attributes-login" name="login" value="fencing"/>
- <nvpair id="fence_prod-mysql2_ipmi-instance_attributes-passwd" name="passwd" value="finishme"/>
- <nvpair id="fence_prod-mysql2_ipmi-instance_attributes-verbose" name="verbose" value="true"/>
- <nvpair id="fence_prod-mysql2_ipmi-instance_attributes-pcmk_host_list" name="pcmk_host_list" value="prod-mysql2"/>
- <nvpair id="fence_prod-mysql2_ipmi-instance_attributes-lanplus" name="lanplus" value="true"/>
- </instance_attributes>
- </primitive>
- <primitive class="stonith" id="fence_prod-mysql1_apc1" type="fence_apc_snmp">
- <instance_attributes id="fence_prod-mysql1_apc1-instance_attributes">
- <nvpair id="fence_prod-mysql1_apc1-instance_attributes-ipaddr" name="ipaddr" value="198.51.100.1"/>
- <nvpair id="fence_prod-mysql1_apc1-instance_attributes-action" name="action" value="off"/>
- <nvpair id="fence_prod-mysql1_apc1-instance_attributes-port" name="port" value="10"/>
- <nvpair id="fence_prod-mysql1_apc1-instance_attributes-login" name="login" value="fencing"/>
- <nvpair id="fence_prod-mysql1_apc1-instance_attributes-passwd" name="passwd" value="fencing"/>
- <nvpair id="fence_prod-mysql1_apc1-instance_attributes-pcmk_host_list" name="pcmk_host_list" value="prod-mysql1"/>
- </instance_attributes>
- </primitive>
- <primitive class="stonith" id="fence_prod-mysql1_apc2" type="fence_apc_snmp">
- <instance_attributes id="fence_prod-mysql1_apc2-instance_attributes">
- <nvpair id="fence_prod-mysql1_apc2-instance_attributes-ipaddr" name="ipaddr" value="203.0.113.1"/>
- <nvpair id="fence_prod-mysql1_apc2-instance_attributes-action" name="action" value="off"/>
- <nvpair id="fence_prod-mysql1_apc2-instance_attributes-port" name="port" value="10"/>
- <nvpair id="fence_prod-mysql1_apc2-instance_attributes-login" name="login" value="fencing"/>
- <nvpair id="fence_prod-mysql1_apc2-instance_attributes-passwd" name="passwd" value="fencing"/>
- <nvpair id="fence_prod-mysql1_apc2-instance_attributes-pcmk_host_list" name="pcmk_host_list" value="prod-mysql1"/>
- </instance_attributes>
- </primitive>
- <primitive class="stonith" id="fence_prod-mysql2_apc1" type="fence_apc_snmp">
- <instance_attributes id="fence_prod-mysql2_apc1-instance_attributes">
- <nvpair id="fence_prod-mysql2_apc1-instance_attributes-ipaddr" name="ipaddr" value="198.51.100.1"/>
- <nvpair id="fence_prod-mysql2_apc1-instance_attributes-action" name="action" value="off"/>
- <nvpair id="fence_prod-mysql2_apc1-instance_attributes-port" name="port" value="11"/>
- <nvpair id="fence_prod-mysql2_apc1-instance_attributes-login" name="login" value="fencing"/>
- <nvpair id="fence_prod-mysql2_apc1-instance_attributes-passwd" name="passwd" value="fencing"/>
- <nvpair id="fence_prod-mysql2_apc1-instance_attributes-pcmk_host_list" name="pcmk_host_list" value="prod-mysql2"/>
- </instance_attributes>
- </primitive>
- <primitive class="stonith" id="fence_prod-mysql2_apc2" type="fence_apc_snmp">
- <instance_attributes id="fence_prod-mysql2_apc2-instance_attributes">
- <nvpair id="fence_prod-mysql2_apc2-instance_attributes-ipaddr" name="ipaddr" value="203.0.113.1"/>
- <nvpair id="fence_prod-mysql2_apc2-instance_attributes-action" name="action" value="off"/>
- <nvpair id="fence_prod-mysql2_apc2-instance_attributes-port" name="port" value="11"/>
- <nvpair id="fence_prod-mysql2_apc2-instance_attributes-login" name="login" value="fencing"/>
- <nvpair id="fence_prod-mysql2_apc2-instance_attributes-passwd" name="passwd" value="fencing"/>
- <nvpair id="fence_prod-mysql2_apc2-instance_attributes-pcmk_host_list" name="pcmk_host_list" value="prod-mysql2"/>
- </instance_attributes>
- </primitive>
- </resources>
- <constraints>
- <rsc_location id="l_fence_prod-mysql1_ipmi" node="prod-mysql1" rsc="fence_prod-mysql1_ipmi" score="-INFINITY"/>
- <rsc_location id="l_fence_prod-mysql2_ipmi" node="prod-mysql2" rsc="fence_prod-mysql2_ipmi" score="-INFINITY"/>
- <rsc_location id="l_fence_prod-mysql1_apc2" node="prod-mysql1" rsc="fence_prod-mysql1_apc2" score="-INFINITY"/>
- <rsc_location id="l_fence_prod-mysql1_apc1" node="prod-mysql1" rsc="fence_prod-mysql1_apc1" score="-INFINITY"/>
- <rsc_location id="l_fence_prod-mysql2_apc1" node="prod-mysql2" rsc="fence_prod-mysql2_apc1" score="-INFINITY"/>
- <rsc_location id="l_fence_prod-mysql2_apc2" node="prod-mysql2" rsc="fence_prod-mysql2_apc2" score="-INFINITY"/>
- </constraints>
- <fencing-topology>
- <fencing-level devices="fence_prod-mysql1_ipmi" id="fencing-2" index="1" target="prod-mysql1"/>
- <fencing-level devices="fence_prod-mysql1_apc1,fence_prod-mysql1_apc2" id="fencing-3" index="2" target="prod-mysql1"/>
- <fencing-level devices="fence_prod-mysql2_ipmi" id="fencing-0" index="1" target="prod-mysql2"/>
- <fencing-level devices="fence_prod-mysql2_apc1,fence_prod-mysql2_apc2" id="fencing-1" index="2" target="prod-mysql2"/>
- </fencing-topology>
- ...
- </configuration>
-</cib>
-----
-
-== Remapping Reboots ==
-
-When the cluster needs to reboot a node, whether because +stonith-action+ is +reboot+ or because
-a reboot was manually requested (such as by `stonith_admin --reboot`), it will remap that to
-other commands in two cases:
-
-. If the chosen fencing device does not support the +reboot+ command, the cluster
- will ask it to perform +off+ instead.
-
-. If a fencing topology level with multiple devices must be executed, the cluster
- will ask all the devices to perform +off+, then ask the devices to perform +on+.
-
-To understand the second case, consider the example of a node with redundant
-power supplies connected to intelligent power switches. Rebooting one switch
-and then the other would have no effect on the node. Turning both switches off,
-and then on, actually reboots the node.
-
-In such a case, the fencing operation will be treated as successful as long as
-the +off+ commands succeed, because then it is safe for the cluster to recover
-any resources that were on the node. Timeouts and errors in the +on+ phase will
-be logged but ignored.
-
-When a reboot operation is remapped, any action-specific timeout for the
-remapped action will be used (for example, +pcmk_off_timeout+ will be used when
-executing the +off+ command, not +pcmk_reboot_timeout+).
diff --git a/doc/Pacemaker_Explained/en-US/Ch-Intro.txt b/doc/Pacemaker_Explained/en-US/Ch-Intro.txt
deleted file mode 100644
index 49994a92cb..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ch-Intro.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-:compat-mode: legacy
-= Read-Me-First =
-
-== The Scope of this Document ==
-
-This document is intended to be an exhaustive reference for
-configuring Pacemaker.
-
-To achieve this, it focuses on the XML syntax used to configure the CIB.
-For those that are allergic to XML, multiple higher-level front-ends
-(both command-line and GUI) are available. These tools will not be covered at
-all in this document
-footnote:[
-I hope, however, that the concepts explained here make the functionality of
-these tools more easily understood.
-].
-
-Users may be interested in other parts of the
-https://www.clusterlabs.org/pacemaker/doc/[Pacemaker documentation set],
-such as 'Clusters from Scratch', a step-by-step guide to setting up an
-example cluster, and 'Pacemaker Administration', a guide to maintaining a
-cluster.
-
-include::../../shared/en-US/pacemaker-intro.txt[]
diff --git a/doc/Pacemaker_Explained/en-US/Ch-Multi-site-Clusters.txt b/doc/Pacemaker_Explained/en-US/Ch-Multi-site-Clusters.txt
deleted file mode 100644
index f10272d5fa..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ch-Multi-site-Clusters.txt
+++ /dev/null
@@ -1,340 +0,0 @@
-:compat-mode: legacy
-= Multi-Site Clusters and Tickets =
-
-Apart from local clusters, Pacemaker also supports multi-site clusters.
-That means you can have multiple, geographically dispersed sites, each with a
-local cluster. Failover between these clusters can be coordinated
-manually by the administrator, or automatically by a higher-level entity called
-a 'Cluster Ticket Registry (CTR)'.
-
-== Challenges for Multi-Site Clusters ==
-
-Typically, multi-site environments are too far apart to support
-synchronous communication and data replication between the sites.
-That leads to significant challenges:
-
-- How do we make sure that a cluster site is up and running?
-
-- How do we make sure that resources are only started once?
-
-- How do we make sure that quorum can be reached between the different
-sites and a split-brain scenario avoided?
-
-- How do we manage failover between sites?
-
-- How do we deal with high latency in case of resources that need to be
-stopped?
-
-In the following sections, learn how to meet these challenges.
-
-== Conceptual Overview ==
-
-Multi-site clusters can be considered as “overlay” clusters where
-each cluster site corresponds to a cluster node in a traditional cluster.
-The overlay cluster can be managed by a CTR in order to
-guarantee that any cluster resource will be active
-on no more than one cluster site. This is achieved by using
-'tickets' that are treated as failover domain between cluster
-sites, in case a site should be down.
-
-The following sections explain the individual components and mechanisms
-that were introduced for multi-site clusters in more detail.
-
-=== Ticket ===
-
-Tickets are, essentially, cluster-wide attributes. A ticket grants the
-right to run certain resources on a specific cluster site. Resources can
-be bound to a certain ticket by +rsc_ticket+ constraints. Only if the
-ticket is available at a site can the respective resources be started there.
-Vice versa, if the ticket is revoked, the resources depending on that
-ticket must be stopped.
-
-The ticket thus is similar to a 'site quorum', i.e. the permission to
-manage/own resources associated with that site. (One can also think of the
-current +have-quorum+ flag as a special, cluster-wide ticket that is granted in
-case of node majority.)
-
-Tickets can be granted and revoked either manually by administrators
-(which could be the default for classic enterprise clusters), or via
-the automated CTR mechanism described below.
-
-A ticket can only be owned by one site at a time. Initially, none
-of the sites has a ticket. Each ticket must be granted once by the cluster
-administrator.
-
-The presence or absence of tickets for a site is stored in the CIB as a
-cluster status. With regards to a certain ticket, there are only two states
-for a site: +true+ (the site has the ticket) or +false+ (the site does
-not have the ticket). The absence of a certain ticket (during the initial
-state of the multi-site cluster) is the same as the value +false+.
-
-=== Dead Man Dependency ===
-
-A site can only activate resources safely if it can be sure that the
-other site has deactivated them. However after a ticket is revoked, it can
-take a long time until all resources depending on that ticket are stopped
-"cleanly", especially in case of cascaded resources. To cut that process
-short, the concept of a 'Dead Man Dependency' was introduced.
-
-If a dead man dependency is in force, if a ticket is revoked from a site, the
-nodes that are hosting dependent resources are fenced. This considerably speeds
-up the recovery process of the cluster and makes sure that resources can be
-migrated more quickly.
-
-This can be configured by specifying a +loss-policy="fence"+ in
-+rsc_ticket+ constraints.
-
-=== Cluster Ticket Registry ===
-
-A CTR is a coordinated group of network daemons that automatically handles
-granting, revoking, and timing out tickets (instead of the administrator
-revoking the ticket somewhere, waiting for everything to stop, and then
-granting it on the desired site).
-
-Pacemaker does not implement its own CTR, but interoperates with external
-software designed for that purpose (similar to how resource and fencing agents
-are not directly part of pacemaker).
-
-Participating clusters run the CTR daemons, which connect to each other, exchange
-information about their connectivity, and vote on which sites gets which
-tickets.
-
-A ticket is granted to a site only once the CTR is sure that the ticket
-has been relinquished by the previous owner, implemented via a timer in most
-scenarios. If a site loses connection to its peers, its tickets time out and
-recovery occurs. After the connection timeout plus the recovery timeout has
-passed, the other sites are allowed to re-acquire the ticket and start the
-resources again.
-
-This can also be thought of as a "quorum server", except that it is not
-a single quorum ticket, but several.
-
-=== Configuration Replication ===
-
-As usual, the CIB is synchronized within each cluster, but it is 'not' synchronized
-across cluster sites of a multi-site cluster. You have to configure the resources
-that will be highly available across the multi-site cluster for every site
-accordingly.
-
-
-[[s-ticket-constraints]]
-== Configuring Ticket Dependencies ==
-
-The `rsc_ticket` constraint lets you specify the resources depending on a certain
-ticket. Together with the constraint, you can set a `loss-policy` that defines
-what should happen to the respective resources if the ticket is revoked.
-
-The attribute `loss-policy` can have the following values:
-
-* +fence:+ Fence the nodes that are running the relevant resources.
-
-* +stop:+ Stop the relevant resources.
-
-* +freeze:+ Do nothing to the relevant resources.
-
-* +demote:+ Demote relevant resources that are running in master mode to slave mode.
-
-
-.Constraint that fences node if +ticketA+ is revoked
-====
-[source,XML]
--------
-<rsc_ticket id="rsc1-req-ticketA" rsc="rsc1" ticket="ticketA" loss-policy="fence"/>
--------
-====
-
-The example above creates a constraint with the ID +rsc1-req-ticketA+. It
-defines that the resource +rsc1+ depends on +ticketA+ and that the node running
-the resource should be fenced if +ticketA+ is revoked.
-
-If resource +rsc1+ were a promotable resource (i.e. it could run in master or
-slave mode), you might want to configure that only master mode
-depends on +ticketA+. With the following configuration, +rsc1+ will be
-demoted to slave mode if +ticketA+ is revoked:
-
-.Constraint that demotes +rsc1+ if +ticketA+ is revoked
-====
-[source,XML]
--------
-<rsc_ticket id="rsc1-req-ticketA" rsc="rsc1" rsc-role="Master" ticket="ticketA" loss-policy="demote"/>
--------
-====
-
-You can create multiple `rsc_ticket` constraints to let multiple resources
-depend on the same ticket. However, `rsc_ticket` also supports resource sets
-(see <<s-resource-sets>>),
-so one can easily list all the resources in one `rsc_ticket` constraint instead.
-
-.Ticket constraint for multiple resources
-====
-[source,XML]
--------
-<rsc_ticket id="resources-dep-ticketA" ticket="ticketA" loss-policy="fence">
- <resource_set id="resources-dep-ticketA-0" role="Started">
- <resource_ref id="rsc1"/>
- <resource_ref id="group1"/>
- <resource_ref id="clone1"/>
- </resource_set>
- <resource_set id="resources-dep-ticketA-1" role="Master">
- <resource_ref id="ms1"/>
- </resource_set>
-</rsc_ticket>
--------
-====
-
-In the example above, there are two resource sets, so we can list resources
-with different roles in a single +rsc_ticket+ constraint. There's no dependency
-between the two resource sets, and there's no dependency among the
-resources within a resource set. Each of the resources just depends on
-+ticketA+.
-
-Referencing resource templates in +rsc_ticket+ constraints, and even
-referencing them within resource sets, is also supported.
-
-If you want other resources to depend on further tickets, create as many
-constraints as necessary with +rsc_ticket+.
-
-
-== Managing Multi-Site Clusters ==
-
-=== Granting and Revoking Tickets Manually ===
-
-You can grant tickets to sites or revoke them from sites manually.
-If you want to re-distribute a ticket, you should wait for
-the dependent resources to stop cleanly at the previous site before you
-grant the ticket to the new site.
-
-Use the `crm_ticket` command line tool to grant and revoke tickets.
-
-////
-These commands will actually just print a message telling the user that they
-require '--force'. That is probably a good exercise rather than letting novice
-users cut and paste '--force' here.
-////
-
-To grant a ticket to this site:
--------
-# crm_ticket --ticket ticketA --grant
--------
-
-To revoke a ticket from this site:
--------
-# crm_ticket --ticket ticketA --revoke
--------
-
-[IMPORTANT]
-====
-If you are managing tickets manually, use the `crm_ticket` command with
-great care, because it cannot check whether the same ticket is already
-granted elsewhere.
-====
-
-
-=== Granting and Revoking Tickets via a Cluster Ticket Registry ===
-
-We will use https://github.com/ClusterLabs/booth[Booth] here as an example of
-software that can be used with pacemaker as a Cluster Ticket Registry. Booth
-implements the
-http://en.wikipedia.org/wiki/Raft_%28computer_science%29[Raft]
-algorithm to guarantee the distributed consensus among different
-cluster sites, and manages the ticket distribution (and thus the failover
-process between sites).
-
-Each of the participating clusters and 'arbitrators' runs the Booth daemon
-`boothd`.
-
-An 'arbitrator' is the multi-site equivalent of a quorum-only node in a local
-cluster. If you have a setup with an even number of sites,
-you need an additional instance to reach consensus about decisions such
-as failover of resources across sites. In this case, add one or more
-arbitrators running at additional sites. Arbitrators are single machines
-that run a booth instance in a special mode. An arbitrator is especially
-important for a two-site scenario, otherwise there is no way for one site
-to distinguish between a network failure between it and the other site, and
-a failure of the other site.
-
-The most common multi-site scenario is probably a multi-site cluster with two
-sites and a single arbitrator on a third site. However, technically, there are
-no limitations with regards to the number of sites and the number of
-arbitrators involved.
-
-`Boothd` at each site connects to its peers running at the other sites and
-exchanges connectivity details. Once a ticket is granted to a site, the
-booth mechanism will manage the ticket automatically: If the site which
-holds the ticket is out of service, the booth daemons will vote which
-of the other sites will get the ticket. To protect against brief
-connection failures, sites that lose the vote (either explicitly or
-implicitly by being disconnected from the voting body) need to
-relinquish the ticket after a time-out. Thus, it is made sure that a
-ticket will only be re-distributed after it has been relinquished by the
-previous site. The resources that depend on that ticket will fail over
-to the new site holding the ticket. The nodes that have run the
-resources before will be treated according to the `loss-policy` you set
-within the `rsc_ticket` constraint.
-
-Before the booth can manage a certain ticket within the multi-site cluster,
-you initially need to grant it to a site manually via the `booth` command-line
-tool. After you have initially granted a ticket to a site, `boothd`
-will take over and manage the ticket automatically.
-
-[IMPORTANT]
-====
-The `booth` command-line tool can be used to grant, list, or
-revoke tickets and can be run on any machine where `boothd` is running.
-If you are managing tickets via Booth, use only `booth` for manual
-intervention, not `crm_ticket`. That ensures the same ticket
-will only be owned by one cluster site at a time.
-====
-
-==== Booth Requirements ====
-
-* All clusters that will be part of the multi-site cluster must be based on
- Pacemaker.
-
-* Booth must be installed on all cluster nodes and on all arbitrators that will
- be part of the multi-site cluster.
-
-* Nodes belonging to the same cluster site should be synchronized via NTP. However,
- time synchronization is not required between the individual cluster sites.
-
-=== General Management of Tickets ===
-
-Display the information of tickets:
--------
-# crm_ticket --info
--------
-
-Or you can monitor them with:
--------
-# crm_mon --tickets
--------
-
-Display the +rsc_ticket+ constraints that apply to a ticket:
--------
-# crm_ticket --ticket ticketA --constraints
--------
-
-When you want to do maintenance or manual switch-over of a ticket,
-revoking the ticket would trigger the loss policies. If
-+loss-policy="fence"+, the dependent resources could not be gracefully
-stopped/demoted, and other unrelated resources could even be affected.
-
-The proper way is making the ticket 'standby' first with:
--------
-# crm_ticket --ticket ticketA --standby
--------
-
-Then the dependent resources will be stopped or demoted gracefully without
-triggering the loss policies.
-
-If you have finished the maintenance and want to activate the ticket again,
-you can run:
--------
-# crm_ticket --ticket ticketA --activate
--------
-
-== For more information ==
-
-* https://www.suse.com/documentation/sle-ha-geo-12/art_ha_geo_quick/data/art_ha_geo_quick.html[SUSE's Geo Clustering quick start]
-
-* https://github.com/ClusterLabs/booth[Booth]
diff --git a/doc/Pacemaker_Explained/en-US/Ch-Nodes.txt b/doc/Pacemaker_Explained/en-US/Ch-Nodes.txt
deleted file mode 100644
index 761161d805..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ch-Nodes.txt
+++ /dev/null
@@ -1,206 +0,0 @@
-:compat-mode: legacy
-= Cluster Nodes =
-
-== Defining a Cluster Node ==
-
-Each node in the cluster will have an entry in the nodes section
-containing its UUID, uname, and type.
-
-.Example Corosync cluster node entry
-======
-[source,XML]
-<node id="101" uname="pcmk-1"/>
-======
-
-In normal circumstances, the admin should let the cluster populate
-this information automatically from the communications and membership
-data.
-
-[[s-node-name]]
-== Where Pacemaker Gets the Node Name ==
-
-Traditionally, Pacemaker required nodes to be referred to by the value
-returned by `uname -n`. This can be problematic for services that
-require the `uname -n` to be a specific value (e.g. for a licence
-file).
-
-This requirement has been relaxed for clusters using Corosync 2.0 or later.
-The name Pacemaker uses is:
-
-. The value stored in +corosync.conf+ under *ring0_addr* in the *nodelist*, if it does not contain an IP address; otherwise
-. The value stored in +corosync.conf+ under *name* in the *nodelist*; otherwise
-. The value of `uname -n`
-
-Pacemaker provides the `crm_node -n` command which displays the name
-used by a running cluster.
-
-If a Corosync *nodelist* is used, `crm_node --name-for-id` pass:[<replaceable>number</replaceable>] is also
-available to display the name used by the node with the corosync
-*nodeid* of pass:[<replaceable>number</replaceable>], for example: `crm_node --name-for-id 2`.
-
-[[s-node-attributes]]
-== Node Attributes ==
-
-indexterm:[Node,attribute]
-Pacemaker allows node-specific values to be specified using 'node attributes'.
-A node attribute has a name, and may have a distinct value for each node.
-
-While certain node attributes have specific meanings to the cluster, they are
-mainly intended to allow administrators and resource agents to track any
-information desired.
-
-For example, an administrator might choose to define node attributes for how
-much RAM and disk space each node has, which OS each uses, or which server room
-rack each node is in.
-
-Users can configure <<ch-rules,rules>> that use node attributes to affect
-where resources are placed.
-
-=== Setting and querying node attributes ===
-
-Node attributes can be set and queried using the `crm_attribute` and
-`attrd_updater` commands, so that the user does not have to deal with XML
-configuration directly.
-
-Here is an example of what XML configuration would be generated if an
-administrator ran this command:
-
-.Result of using crm_attribute to specify which kernel pcmk-1 is running
-======
--------
-# crm_attribute --type nodes --node pcmk-1 --name kernel --update $(uname -r)
--------
-[source,XML]
--------
-<node id="1" uname="pcmk-1">
- <instance_attributes id="nodes-1-attributes">
- <nvpair id="nodes-1-kernel" name="kernel" value="3.10.0-862.14.4.el7.x86_64"/>
- </instance_attributes>
-</node>
--------
-======
-
-To read back the value that was just set:
-----
-# crm_attribute --type nodes --node pcmk-1 --name kernel --query
-scope=nodes name=kernel value=3.10.0-862.14.4.el7.x86_64
-----
-
-By specifying `--type nodes` the admin tells the cluster that this
-attribute is persistent across reboots. There are also transient attributes
-which are kept in the status section and are "forgotten" whenever the node
-leaves the cluster. Administrators can use this section by specifying
-`--type status`.
-
-=== Special node attributes ===
-
-Certain node attributes have special meaning to the cluster.
-
-Node attribute names beginning with # are considered reserved for these
-special attributes. Some special attributes do not start with #, for
-historical reasons.
-
-Certain special attributes are set automatically by the cluster, should never
-be modified directly, and can be used only within <<ch-rules,rules>>;
-these are listed under <<node-attribute-expressions>>.
-
-For true/false values, the cluster considers a value of "1", "y", "yes", "on",
-or "true" (case-insensitively) to be true, "0", "n", "no", "off", "false", or
-unset to be false, and anything else to be an error.
-
-.Node attributes with special significance
-[width="95%",cols="2m,<5",options="header",align="center"]
-|====
-|Name |Description
-
-| fail-count-*
-| Attributes whose names start with +fail-count-+ are managed by the cluster
- to track how many times particular resource operations have failed on this
- node. These should be queried and cleared via the `crm_failcount` or
- `crm_resource --cleanup` commands rather than directly.
-indexterm:[Node,attribute,fail-count-]
-indexterm:[fail-count-,Node attribute]
-
-| last-failure-*
-| Attributes whose names start with +last-failure-+ are managed by the cluster
- to track when particular resource operations have most recently failed on
- this node. These should be cleared via the `crm_failcount` or
- `crm_resource --cleanup` commands rather than directly.
-indexterm:[Node,attribute,last-failure-]
-indexterm:[last-failure-,Node attribute]
-
-| maintenance
-| Similar to the +maintenance-mode+ <<s-cluster-options,cluster option>>, but for
- a single node. If true, resources will not be started or stopped on the node,
- resources and individual clone instances running on the node will become
- unmanaged, and any recurring operations for those will be cancelled.
-indexterm:[Node,attribute,maintenance]
-indexterm:[maintenance,Node attribute]
-
-| probe_complete
-| This is managed by the cluster to detect when nodes need to be reprobed, and
- should never be used directly.
-indexterm:[Node,attribute,probe_complete]
-indexterm:[probe_complete,Node attribute]
-
-| resource-discovery-enabled
-| If the node is a remote node, fencing is enabled, and this attribute is
- explicitly set to false (unset means true in this case), resource discovery
- (probes) will not be done on this node. This is highly discouraged; the
- +resource-discovery+ location constraint property is preferred for this
- purpose.
-indexterm:[Node,attribute,resource-discovery-enabled]
-indexterm:[resource-discovery-enabled,Node attribute]
-
-| shutdown
-| This is managed by the cluster to orchestrate the shutdown of a node,
- and should never be used directly.
-indexterm:[Node,attribute,shutdown]
-indexterm:[shutdown,Node attribute]
-
-| site-name
-| If set, this will be used as the value of the +#site-name+ node attribute
- used in rules. (If not set, the value of the +cluster-name+ cluster option
- will be used as +#site-name+ instead.)
-indexterm:[Node,attribute,site-name]
-indexterm:[site-name,Node attribute]
-
-| standby
-| If true, the node is in standby mode. This is typically set and queried via
- the `crm_standby` command rather than directly.
-indexterm:[Node,attribute,standby]
-indexterm:[standby,Node attribute]
-
-| terminate
-| If the value is true or begins with any nonzero number, the node will be
- fenced. This is typically set by tools rather than directly.
-indexterm:[Node,attribute,terminate]
-indexterm:[terminate,Node attribute]
-
-| #digests-*
-| Attributes whose names start with +#digests-+ are managed by the cluster to
- detect when <<s-unfencing,unfencing>> needs to be redone, and should never be
- used directly.
-indexterm:[Node,attribute,#digests-]
-indexterm:[#digests-,Node attribute]
-
-| #node-unfenced
-| When the node was last unfenced (as seconds since the epoch). This is managed
- by the cluster and should never be used directly.
-indexterm:[Node,attribute,#node-unfenced]
-indexterm:[#node-unfenced,Node attribute]
-
-|====
-
-[WARNING]
-====
-Restarting pacemaker on a node that is in single-node maintenance mode will
-likely lead to undesirable effects. If +maintenance+ is set as a transient
-attribute, it will be erased when pacemaker is stopped, which will immediately
-take the node out of maintenance mode and likely get it fenced. Even if
-permanent, if pacemaker is restarted, any resources active on the node will
-have their local history erased when the node rejoins, so the cluster will no
-longer consider them running on the node and thus will consider them managed
-again, leading them to be started elsewhere. This behavior might be improved
-in a future release.
-====
diff --git a/doc/Pacemaker_Explained/en-US/Ch-Options.txt b/doc/Pacemaker_Explained/en-US/Ch-Options.txt
deleted file mode 100644
index 7775cbc589..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ch-Options.txt
+++ /dev/null
@@ -1,498 +0,0 @@
-:compat-mode: legacy
-= Cluster-Wide Configuration =
-
-== Configuration Layout ==
-
-The cluster is defined by the Cluster Information Base (CIB),
-which uses XML notation. The simplest CIB, an empty one, looks like this:
-
-.An empty configuration
-======
-[source,XML]
--------
-<cib crm_feature_set="3.0.7" validate-with="pacemaker-1.2" admin_epoch="1" epoch="0" num_updates="0">
- <configuration>
- <crm_config/>
- <nodes/>
- <resources/>
- <constraints/>
- </configuration>
- <status/>
-</cib>
--------
-======
-
-The empty configuration above contains the major sections that make up a CIB:
-
-* +cib+: The entire CIB is enclosed with a +cib+ tag. Certain fundamental settings
- are defined as attributes of this tag.
-
- ** +configuration+: This section -- the primary focus of this document --
- contains traditional configuration information such as what resources the
- cluster serves and the relationships among them.
-
- *** +crm_config+: cluster-wide configuration options
- *** +nodes+: the machines that host the cluster
- *** +resources+: the services run by the cluster
- *** +constraints+: indications of how resources should be placed
-
- ** +status+: This section contains the history of each resource on each node.
- Based on this data, the cluster can construct the complete current
- state of the cluster. The authoritative source for this section
- is the local executor (pacemaker-execd process) on each cluster node, and
- the cluster will occasionally repopulate the entire section. For this
- reason, it is never written to disk, and administrators are advised
- against modifying it in any way.
-
-In this document, configuration settings will be described as 'properties' or 'options'
-based on how they are defined in the CIB:
-
-* Properties are XML attributes of an XML element.
-* Options are name-value pairs expressed as +nvpair+ child elements of an XML element.
-
-Normally, you will use command-line tools that abstract the XML, so the
-distinction will be unimportant; both properties and options are
-cluster settings you can tweak.
-
-== CIB Properties ==
-
-Certain settings are defined by CIB properties (that is, attributes of the
-+cib+ tag) rather than with the rest of the cluster configuration in the
-+configuration+ section.
-
-The reason is simply a matter of parsing. These options are used by the
-configuration database which is, by design, mostly ignorant of the content it
-holds. So the decision was made to place them in an easy-to-find location.
-
-.CIB Properties
-[width="95%",cols="2m,<5",options="header",align="center"]
-|=========================================================
-|Field |Description
-
-| admin_epoch |
-indexterm:[Configuration Version,Cluster]
-indexterm:[Cluster,Option,Configuration Version]
-indexterm:[admin_epoch,Cluster Option]
-indexterm:[Cluster,Option,admin_epoch]
-When a node joins the cluster, the cluster performs a check to see
-which node has the best configuration. It asks the node with the highest
-(+admin_epoch+, +epoch+, +num_updates+) tuple to replace the configuration on
-all the nodes -- which makes setting them, and setting them correctly, very
-important. +admin_epoch+ is never modified by the cluster; you can use this
-to make the configurations on any inactive nodes obsolete. _Never set this
-value to zero_. In such cases, the cluster cannot tell the difference between
-your configuration and the "empty" one used when nothing is found on disk.
-
-| epoch |
-indexterm:[epoch,Cluster Option]
-indexterm:[Cluster,Option,epoch]
-The cluster increments this every time the configuration is updated (usually by
-the administrator).
-
-| num_updates |
-indexterm:[num_updates,Cluster Option]
-indexterm:[Cluster,Option,num_updates]
-The cluster increments this every time the configuration or status is updated
-(usually by the cluster) and resets it to 0 when epoch changes.
-
-| validate-with |
-indexterm:[validate-with,Cluster Option]
-indexterm:[Cluster,Option,validate-with]
-Determines the type of XML validation that will be done on the configuration.
-If set to +none+, the cluster will not verify that updates conform to the
-DTD (nor reject ones that don't). This option can be useful when
-operating a mixed-version cluster during an upgrade.
-
-|cib-last-written |
-indexterm:[cib-last-written,Cluster Property]
-indexterm:[Cluster,Property,cib-last-written]
-Indicates when the configuration was last written to disk. Maintained by the
-cluster; for informational purposes only.
-
-|have-quorum |
-indexterm:[have-quorum,Cluster Property]
-indexterm:[Cluster,Property,have-quorum]
-Indicates if the cluster has quorum. If false, this may mean that the
-cluster cannot start resources or fence other nodes (see
-+no-quorum-policy+ below). Maintained by the cluster.
-
-|dc-uuid |
-indexterm:[dc-uuid,Cluster Property]
-indexterm:[Cluster,Property,dc-uuid]
-Indicates which cluster node is the current leader. Used by the
-cluster when placing resources and determining the order of some
-events. Maintained by the cluster.
-
-|=========================================================
-
-[[s-cluster-options]]
-== Cluster Options ==
-
-Cluster options, as you might expect, control how the cluster behaves
-when confronted with certain situations.
-
-They are grouped into sets within the +crm_config+ section, and, in advanced
-configurations, there may be more than one set. (This will be described later
-in the section on <<ch-rules>> where we will show how to have the cluster use
-different sets of options during working hours than during weekends.) For now,
-we will describe the simple case where each option is present at most once.
-
-You can obtain an up-to-date list of cluster options, including
-their default values, by running the `man pacemaker-schedulerd` and
-`man pacemaker-controld` commands.
-
-.Cluster Options
-[width="95%",cols="5m,2,<11",options="header",align="center"]
-|=========================================================
-|Option |Default |Description
-
-| cluster-name | |
-indexterm:[cluster-name,Cluster Property]
-indexterm:[Cluster,Property,cluster-name]
-An (optional) name for the cluster as a whole. This is mostly for users'
-convenience for use as desired in administration, but this can be used
-in the Pacemaker configuration in <<ch-rules,rules>> (as the
-+#cluster-name+ <<node-attribute-expressions-special,node attribute>>). It may
-also be used by higher-level tools when displaying cluster information, and by
-certain resource agents (for example, the +ocf:heartbeat:GFS2+ agent stores the
-cluster name in filesystem meta-data).
-
-| dc-version | |
-indexterm:[dc-version,Cluster Property]
-indexterm:[Cluster,Property,dc-version]
-Version of Pacemaker on the cluster's DC.
-Determined automatically by the cluster.
-Often includes the hash which identifies the exact Git changeset it was built
-from. Used for diagnostic purposes.
-
-| cluster-infrastructure | |
-indexterm:[cluster-infrastructure,Cluster Property]
-indexterm:[Cluster,Property,cluster-infrastructure]
-The messaging stack on which Pacemaker is currently running.
-Determined automatically by the cluster.
-Used for informational and diagnostic purposes.
-
-| no-quorum-policy | stop
-a|
-indexterm:[no-quorum-policy,Cluster Option]
-indexterm:[Cluster,Option,no-quorum-policy]
-What to do when the cluster does not have quorum. Allowed values:
-
-* +ignore:+ continue all resource management
-* +freeze:+ continue resource management, but don't recover resources from nodes not in the affected partition
-* +stop:+ stop all resources in the affected cluster partition
-* +demote:+ demote promotable resources and stop all other resources in the
- affected cluster partition
-* +suicide:+ fence all nodes in the affected cluster partition
-
-| batch-limit | 0 |
-indexterm:[batch-limit,Cluster Option]
-indexterm:[Cluster,Option,batch-limit]
-The maximum number of actions that the cluster may execute in parallel across
-all nodes. The "correct" value will depend on the speed and load of your
-network and cluster nodes. If zero, the cluster will impose a dynamically
-calculated limit only when any node has high load.
-
-| migration-limit | -1 |
-indexterm:[migration-limit,Cluster Option]
-indexterm:[Cluster,Option,migration-limit]
-The number of <<s-migrating-resources,live migration>> actions that the cluster
-is allowed to execute in parallel on a node. A value of -1 means unlimited.
-
-| symmetric-cluster | TRUE |
-indexterm:[symmetric-cluster,Cluster Option]
-indexterm:[Cluster,Option,symmetric-cluster]
-Can all resources run on any node by default?
-
-| stop-all-resources | FALSE |
-indexterm:[stop-all-resources,Cluster Option]
-indexterm:[Cluster,Option,stop-all-resources]
-Should the cluster stop all resources?
-
-| stop-orphan-resources | TRUE |
-indexterm:[stop-orphan-resources,Cluster Option]
-indexterm:[Cluster,Option,stop-orphan-resources]
- Should deleted resources be stopped? This value takes precedence over
- +is-managed+ (i.e. even unmanaged resources will be stopped if deleted from
- the configuration when this value is TRUE).
-
-| stop-orphan-actions | TRUE |
-indexterm:[stop-orphan-actions,Cluster Option]
-indexterm:[Cluster,Option,stop-orphan-actions]
-Should deleted actions be cancelled?
-
-| start-failure-is-fatal | TRUE |
-indexterm:[start-failure-is-fatal,Cluster Option]
-indexterm:[Cluster,Option,start-failure-is-fatal]
-Should a failure to start a resource on a particular node prevent further start
-attempts on that node? If FALSE, the cluster will decide whether the same
-node is still eligible based on the resource's current failure count
-and +migration-threshold+ (see <<s-failure-handling>>).
-
-| enable-startup-probes | TRUE |
-indexterm:[enable-startup-probes,Cluster Option]
-indexterm:[Cluster,Option,enable-startup-probes]
-Should the cluster check for active resources during startup?
-
-| maintenance-mode | FALSE |
-indexterm:[maintenance-mode,Cluster Option]
-indexterm:[Cluster,Option,maintenance-mode]
-Should the cluster refrain from monitoring, starting and stopping resources?
-
-| stonith-enabled | TRUE |
-indexterm:[stonith-enabled,Cluster Option]
-indexterm:[Cluster,Option,stonith-enabled]
-Should failed nodes and nodes with resources that can't be stopped be
-shot? If you value your data, set up a STONITH device and enable this.
-
-If true, or unset, the cluster will refuse to start resources unless
-one or more STONITH resources have been configured.
-If false, unresponsive nodes are immediately assumed to be running no
-resources, and resource takeover to online nodes starts without any
-further protection (which means _data loss_ if the unresponsive node
-still accesses shared storage, for example). See also the +requires+
-meta-attribute in <<s-resource-options>>.
-
-| stonith-action | reboot |
-indexterm:[stonith-action,Cluster Option]
-indexterm:[Cluster,Option,stonith-action]
-Action to send to STONITH device. Allowed values are +reboot+ and +off+.
-The value +poweroff+ is also allowed, but is only used for
-legacy devices.
-
-| stonith-timeout | 60s |
-indexterm:[stonith-timeout,Cluster Option]
-indexterm:[Cluster,Option,stonith-timeout]
-How long to wait for STONITH actions (reboot, on, off) to complete
-
-| stonith-max-attempts | 10 |
-indexterm:[stonith-max-attempts,Cluster Option]
-indexterm:[Cluster,Option,stonith-max-attempts]
-How many times fencing can fail for a target before the cluster will no longer
-immediately re-attempt it.
-
-| stonith-watchdog-timeout | 0 |
-indexterm:[stonith-watchdog-timeout,Cluster Option]
-indexterm:[Cluster,Option,stonith-watchdog-timeout]
-If nonzero, along with `have-watchdog=true` automatically set by the
-cluster, when fencing is required, watchdog-based self-fencing
-will be performed via SBD without requiring a fencing resource
-explicitly configured.
-If `stonith-watchdog-timeout` is set to a positive value, unseen
-nodes are assumed to self-fence within this much time. +WARNING:+
-It must be ensured that this value is larger than the
-`SBD_WATCHDOG_TIMEOUT` environment variable on all nodes.
-Pacemaker verifies the settings individually on all nodes and
-prevents startup or shuts down if configured wrongly on the fly.
-It's strongly recommended that `SBD_WATCHDOG_TIMEOUT` is set to
-the same value on all nodes.
-If `stonith-watchdog-timeout` is set to a negative value, and
-`SBD_WATCHDOG_TIMEOUT` is set, twice that value will be used.
-+WARNING:+ In this case, it's essential (currently not verified by
-pacemaker) that `SBD_WATCHDOG_TIMEOUT` is set to the same value on
-all nodes.
-
-| concurrent-fencing | FALSE |
-indexterm:[concurrent-fencing,Cluster Option]
-indexterm:[Cluster,Option,concurrent-fencing]
-Is the cluster allowed to initiate multiple fence actions concurrently?
-
-| fence-reaction | stop |
-indexterm:[fence-reaction,Cluster Option]
-indexterm:[Cluster,Option,fence-reaction]
-How should a cluster node react if notified of its own fencing? A cluster node
-may receive notification of its own fencing if fencing is misconfigured, or if
-fabric fencing is in use that doesn't cut cluster communication. Allowed values
-are +stop+ to attempt to immediately stop pacemaker and stay stopped, or
-+panic+ to attempt to immediately reboot the local node, falling back to stop
-on failure. The default is likely to be changed to +panic+ in a future release.
-'(since 2.0.3)'
-
-| priority-fencing-delay | 0 |
-indexterm:[priority-fencing-delay,Cluster Option]
-indexterm:[Cluster,Option,priority-fencing-delay]
-Apply specified delay for the fencings that are targeting the lost
-nodes with the highest total resource priority in case we don't
-have the majority of the nodes in our cluster partition, so that
-the more significant nodes potentially win any fencing match,
-which is especially meaningful under split-brain of 2-node
-cluster. A promoted resource instance takes the base priority + 1
-on calculation if the base priority is not 0. Any static/random
-delays that are introduced by `pcmk_delay_base/max` configured
-for the corresponding fencing resources will be added to this
-delay. This delay should be significantly greater than, safely
-twice, the maximum `pcmk_delay_base/max`. By default, priority
-fencing delay is disabled. '(since 2.0.4)'
-
-| cluster-delay | 60s |
-indexterm:[cluster-delay,Cluster Option]
-indexterm:[Cluster,Option,cluster-delay]
-Estimated maximum round-trip delay over the network (excluding action
-execution). If the DC requires an action to be executed on another
-node, it will consider the action failed if it does not get a response
-from the other node in this time (after considering the action's
-own timeout). The "correct" value will depend on the speed and load of your
-network and cluster nodes.
-
-| dc-deadtime | 20s |
-indexterm:[dc-deadtime,Cluster Option]
-indexterm:[Cluster,Option,dc-deadtime]
-How long to wait for a response from other nodes during startup.
-
-The "correct" value will depend on the speed/load of your network and the type of switches used.
-
-| cluster-ipc-limit | 500 |
-indexterm:[cluster-ipc-limit,Cluster Option]
-indexterm:[Cluster,Option,cluster-ipc-limit]
-The maximum IPC message backlog before one cluster daemon will disconnect
-another. This is of use in large clusters, for which a good value is the number
-of resources in the cluster multiplied by the number of nodes. The default of
-500 is also the minimum. Raise this if you see "Evicting client" messages for
-cluster daemon PIDs in the logs.
-
-| pe-error-series-max | -1 |
-indexterm:[pe-error-series-max,Cluster Option]
-indexterm:[Cluster,Option,pe-error-series-max]
-The number of PE inputs resulting in ERRORs to save. Used when reporting problems.
-A value of -1 means unlimited (report all).
-
-| pe-warn-series-max | -1 |
-indexterm:[pe-warn-series-max,Cluster Option]
-indexterm:[Cluster,Option,pe-warn-series-max]
-The number of PE inputs resulting in WARNINGs to save. Used when reporting problems.
-A value of -1 means unlimited (report all).
-
-| pe-input-series-max | -1 |
-indexterm:[pe-input-series-max,Cluster Option]
-indexterm:[Cluster,Option,pe-input-series-max]
-The number of "normal" PE inputs to save. Used when reporting problems.
-A value of -1 means unlimited (report all).
-
-| placement-strategy | default |
-indexterm:[placement-strategy,Cluster Option]
-indexterm:[Cluster,Option,placement-strategy]
- How the cluster should allocate resources to nodes (see <<s-utilization>>).
- Allowed values are +default+, +utilization+, +balanced+, and +minimal+.
-
-| node-health-strategy | none |
-indexterm:[node-health-strategy,Cluster Option]
-indexterm:[Cluster,Option,node-health-strategy]
- How the cluster should react to node health attributes (see <<s-node-health>>).
- Allowed values are +none+, +migrate-on-red+, +only-green+, +progressive+, and
- +custom+.
-
-| enable-acl | FALSE |
-indexterm:[enable-acl,Cluster Option]
-indexterm:[Cluster,Option,enable-acl]
- Whether access control lists (ACLs) (see <<ch-acls>>) can be used to authorize
- modifications to the CIB.
-
-| node-health-base | 0 |
-indexterm:[node-health-base,Cluster Option]
-indexterm:[Cluster,Option,node-health-base]
- The base health score assigned to a node. Only used when
- +node-health-strategy+ is +progressive+.
-
-| node-health-green | 0 |
-indexterm:[node-health-green,Cluster Option]
-indexterm:[Cluster,Option,node-health-green]
- The score to use for a node health attribute whose value is +green+.
- Only used when +node-health-strategy+ is +progressive+ or +custom+.
-
-| node-health-yellow | 0 |
-indexterm:[node-health-yellow,Cluster Option]
-indexterm:[Cluster,Option,node-health-yellow]
- The score to use for a node health attribute whose value is +yellow+.
- Only used when +node-health-strategy+ is +progressive+ or +custom+.
-
-| node-health-red | 0 |
-indexterm:[node-health-red,Cluster Option]
-indexterm:[Cluster,Option,node-health-red]
- The score to use for a node health attribute whose value is +red+.
- Only used when +node-health-strategy+ is +progressive+ or +custom+.
-
-| cluster-recheck-interval | 15min |
-indexterm:[cluster-recheck-interval,Cluster Option]
-indexterm:[Cluster,Option,cluster-recheck-interval]
-Pacemaker is primarily event-driven, and looks ahead to know when to recheck
-the cluster for failure timeouts and most time-based rules. However, it will
-also recheck the cluster after this amount of inactivity. This has two goals:
-rules with +date_spec+ are only guaranteed to be checked this often, and it
-also serves as a fail-safe for certain classes of scheduler bugs. A value of 0
-disables this polling; positive values are a time interval.
-
-| shutdown-lock | false |
-The default of false allows active resources to be recovered elsewhere when
-their node is cleanly shut down, which is what the vast majority of users will
-want. However, some users prefer to make resources highly available only for
-failures, with no recovery for clean shutdowns. If this option is true,
-resources active on a node when it is cleanly shut down are kept "locked" to
-that node (not allowed to run elsewhere) until they start again on that node
-after it rejoins (or for at most shutdown-lock-limit, if set). Stonith
-resources and Pacemaker Remote connections are never locked. Clone and bundle
-instances and the master role of promotable clones are currently never locked,
-though support could be added in a future release. Locks may be manually
-cleared using the `--refresh` option of `crm_resource` (both the resource and
-node must be specified; this works with remote nodes if their connection
-resource's target-role is set to Stopped, but not if Pacemaker Remote is
-stopped on the remote node without disabling the connection resource).
-'(since 2.0.4)'
-indexterm:[shutdown-lock,Cluster Option]
-indexterm:[Cluster,Option,shutdown-lock]
-
-| shutdown-lock-limit | 0 |
-If shutdown-lock is true, and this is set to a nonzero time duration, locked
-resources will be allowed to start after this much time has passed since the
-node shutdown was initiated, even if the node has not rejoined. (This works
-with remote nodes only if their connection resource's target-role is set to
-Stopped.) '(since 2.0.4)'
-indexterm:[shutdown-lock-limit,Cluster Option]
-indexterm:[Cluster,Option,shutdown-lock-limit]
-
-| remove-after-stop | FALSE |
-indexterm:[remove-after-stop,Cluster Option]
-indexterm:[Cluster,Option,remove-after-stop]
-_Advanced Use Only:_ Should the cluster remove resources from the LRM after
-they are stopped? Values other than the default are, at best, poorly tested and
-potentially dangerous.
-
-| startup-fencing | TRUE |
-indexterm:[startup-fencing,Cluster Option]
-indexterm:[Cluster,Option,startup-fencing]
-_Advanced Use Only:_ Should the cluster shoot unseen nodes?
-Not using the default is very unsafe!
-
-| election-timeout | 2min |
-indexterm:[election-timeout,Cluster Option]
-indexterm:[Cluster,Option,election-timeout]
-_Advanced Use Only:_ If you need to adjust this value, it probably indicates
-the presence of a bug.
-
-| shutdown-escalation | 20min |
-indexterm:[shutdown-escalation,Cluster Option]
-indexterm:[Cluster,Option,shutdown-escalation]
-_Advanced Use Only:_ If you need to adjust this value, it probably indicates
-the presence of a bug.
-
-| join-integration-timeout | 3min |
-indexterm:[join-integration-timeout,Cluster Option]
-indexterm:[Cluster,Option,join-integration-timeout]
-_Advanced Use Only:_ If you need to adjust this value, it probably indicates
-the presence of a bug.
-
-| join-finalization-timeout | 30min |
-indexterm:[join-finalization-timeout,Cluster Option]
-indexterm:[Cluster,Option,join-finalization-timeout]
-_Advanced Use Only:_ If you need to adjust this value, it probably indicates
-the presence of a bug.
-
-| transition-delay | 0s |
-indexterm:[transition-delay,Cluster Option]
-indexterm:[Cluster,Option,transition-delay]
-_Advanced Use Only:_ Delay cluster recovery for the configured interval to
-allow for additional/related events to occur. Useful if your configuration is
-sensitive to the order in which ping updates arrive.
-Enabling this option will slow down cluster recovery under
-all conditions.
-
-|=========================================================
diff --git a/doc/Pacemaker_Explained/en-US/Ch-Resources.txt b/doc/Pacemaker_Explained/en-US/Ch-Resources.txt
deleted file mode 100644
index 88892db342..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ch-Resources.txt
+++ /dev/null
@@ -1,948 +0,0 @@
-:compat-mode: legacy
-= Cluster Resources =
-
-[[s-resource-primitive]]
-== What is a Cluster Resource? ==
-
-indexterm:[Resource]
-
-A resource is a service made highly available by a cluster.
-The simplest type of resource, a 'primitive' resource, is described
-in this chapter. More complex forms, such as groups and clones,
-are described in later chapters.
-
-Every primitive resource has a 'resource agent'. A resource agent is an
-external program that abstracts the service it provides and present a
-consistent view to the cluster.
-
-This allows the cluster to be agnostic about the resources it manages.
-The cluster doesn't need to understand how the resource works because
-it relies on the resource agent to do the right thing when given a
-`start`, `stop` or `monitor` command. For this reason, it is crucial that
-resource agents are well-tested.
-
-Typically, resource agents come in the form of shell scripts. However,
-they can be written using any technology (such as C, Python or Perl)
-that the author is comfortable with.
-
-[[s-resource-supported]]
-== Resource Classes ==
-
-indexterm:[Resource,class]
-
-Pacemaker supports several classes of agents:
-
-* OCF
-* LSB
-* Upstart
-* Systemd
-* Service
-* Fencing
-* Nagios Plugins
-
-=== Open Cluster Framework ===
-
-indexterm:[Resource,OCF]
-indexterm:[OCF,Resources]
-indexterm:[Open Cluster Framework,Resources]
-
-The OCF standard
-footnote:[See https://github.com/ClusterLabs/OCF-spec/tree/master/ra . The
-Pacemaker implementation has been somewhat extended from the OCF specs.]
-is basically an extension of the Linux Standard Base conventions for
-init scripts to:
-
-* support parameters,
-* make them self-describing, and
-* make them extensible
-
-OCF specs have strict definitions of the exit codes that actions must return.
-footnote:[
-The resource-agents source code includes the `ocf-tester` script, which
-can be useful in this regard.
-]
-
-The cluster follows these specifications exactly, and giving the wrong
-exit code will cause the cluster to behave in ways you will likely
-find puzzling and annoying. In particular, the cluster needs to
-distinguish a completely stopped resource from one which is in some
-erroneous and indeterminate state.
-
-Parameters are passed to the resource agent as environment variables, with the
-special prefix +OCF_RESKEY_+. So, a parameter which the user thinks
-of as +ip+ will be passed to the resource agent as +OCF_RESKEY_ip+. The
-number and purpose of the parameters is left to the resource agent; however,
-the resource agent should use the `meta-data` command to advertise any that it
-supports.
-
-The OCF class is the most preferred as it is an industry standard,
-highly flexible (allowing parameters to be passed to agents in a
-non-positional manner) and self-describing.
-
-For more information, see the
-http://www.linux-ha.org/wiki/OCF_Resource_Agents[reference] and
-the 'Resource Agents' chapter of 'Pacemaker Administration'.
-
-=== Linux Standard Base ===
-indexterm:[Resource,LSB]
-indexterm:[LSB,Resources]
-indexterm:[Linux Standard Base,Resources]
-
-'LSB' resource agents are more commonly known as 'init scripts'. If a full path
-is not given, they are assumed to be located in +/etc/init.d+.
-
-Commonly, they are provided by the OS distribution. In order to be used
-with a Pacemaker cluster, they must conform to the LSB specification.
-footnote:[
-See
-http://refspecs.linux-foundation.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
-for the LSB Spec as it relates to init scripts.
-]
-
-[WARNING]
-====
-Many distributions or particular software packages claim LSB compliance
-but ship with broken init scripts. For details on how to check whether
-your init script is LSB-compatible, see the 'Resource Agents' chapter of
-'Pacemaker Administration'. Common problematic violations of the LSB
-standard include:
-
-* Not implementing the +status+ operation at all
-* Not observing the correct exit status codes for
- +start+/+stop+/+status+ actions
-* Starting a started resource returns an error
-* Stopping a stopped resource returns an error
-====
-
-[IMPORTANT]
-====
-Remember to make sure the computer is _not_ configured to start any
-services at boot time -- that should be controlled by the cluster.
-====
-
-[[s-resource-supported-systemd]]
-=== Systemd ===
-indexterm:[Resource,Systemd]
-indexterm:[Systemd,Resources]
-
-Some newer distributions have replaced the old
-http://en.wikipedia.org/wiki/Init#SysV-style["SysV"] style of
-initialization daemons and scripts with an alternative called
-http://www.freedesktop.org/wiki/Software/systemd[Systemd].
-
-Pacemaker is able to manage these services _if they are present_.
-
-Instead of init scripts, systemd has 'unit files'. Generally, the
-services (unit files) are provided by the OS distribution, but there
-are online guides for converting from init scripts.
-footnote:[For example,
-http://0pointer.de/blog/projects/systemd-for-admins-3.html]
-
-[IMPORTANT]
-====
-Remember to make sure the computer is _not_ configured to start any
-services at boot time -- that should be controlled by the cluster.
-====
-
-=== Upstart ===
-indexterm:[Resource,Upstart]
-indexterm:[Upstart,Resources]
-
-Some newer distributions have replaced the old
-http://en.wikipedia.org/wiki/Init#SysV-style["SysV"] style of
-initialization daemons (and scripts) with an alternative called
-http://upstart.ubuntu.com/[Upstart].
-
-Pacemaker is able to manage these services _if they are present_.
-
-Instead of init scripts, upstart has 'jobs'. Generally, the
-services (jobs) are provided by the OS distribution.
-
-[IMPORTANT]
-====
-Remember to make sure the computer is _not_ configured to start any
-services at boot time -- that should be controlled by the cluster.
-====
-
-=== System Services ===
-indexterm:[Resource,System Services]
-indexterm:[System Service,Resources]
-
-Since there are various types of system services (+systemd+,
-+upstart+, and +lsb+), Pacemaker supports a special +service+ alias which
-intelligently figures out which one applies to a given cluster node.
-
-This is particularly useful when the cluster contains a mix of
-+systemd+, +upstart+, and +lsb+.
-
-In order, Pacemaker will try to find the named service as:
-
-. an LSB init script
-. a Systemd unit file
-. an Upstart job
-
-=== STONITH ===
-indexterm:[Resource,STONITH]
-indexterm:[STONITH,Resources]
-
-The STONITH class is used exclusively for fencing-related resources. This is
-discussed later in <<ch-fencing>>.
-
-=== Nagios Plugins ===
-indexterm:[Resource,Nagios Plugins]
-indexterm:[Nagios Plugins,Resources]
-
-Nagios Plugins
-footnote:[The project has two independent forks, hosted at
-https://www.nagios-plugins.org/ and https://www.monitoring-plugins.org/. Output
-from both projects' plugins is similar, so plugins from either project can be
-used with pacemaker.]
-allow us to monitor services on remote hosts.
-
-Pacemaker is able to do remote monitoring with the plugins _if they are
-present_.
-
-A common use case is to configure them as resources belonging to a resource
-container (usually a virtual machine), and the container will be restarted
-if any of them has failed. Another use is to configure them as ordinary
-resources to be used for monitoring hosts or services via the network.
-
-The supported parameters are same as the long options of the plugin.
-
-[[primitive-resource]]
-== Resource Properties ==
-
-These values tell the cluster which resource agent to use for the resource,
-where to find that resource agent and what standards it conforms to.
-
-.Properties of a Primitive Resource
-[width="95%",cols="1m,<6",options="header",align="center"]
-|=========================================================
-
-|Field
-|Description
-
-|id
-|Your name for the resource
- indexterm:[id,Resource]
- indexterm:[Resource,Property,id]
-
-|class
-
-|The standard the resource agent conforms to. Allowed values:
-+lsb+, +nagios+, +ocf+, +service+, +stonith+, +systemd+, +upstart+
- indexterm:[class,Resource]
- indexterm:[Resource,Property,class]
-
-|type
-|The name of the Resource Agent you wish to use. E.g. +IPaddr+ or +Filesystem+
- indexterm:[type,Resource]
- indexterm:[Resource,Property,type]
-
-|provider
-|The OCF spec allows multiple vendors to supply the same
- resource agent. To use the OCF resource agents supplied by
- the Heartbeat project, you would specify +heartbeat+ here.
- indexterm:[provider,Resource]
- indexterm:[Resource,Property,provider]
-
-|=========================================================
-
-The XML definition of a resource can be queried with the `crm_resource` tool.
-For example:
-
-----
-# crm_resource --resource Email --query-xml
-----
-
-might produce:
-
-.A system resource definition
-=====
-[source,XML]
-<primitive id="Email" class="service" type="exim"/>
-=====
-
-[NOTE]
-=====
-One of the main drawbacks to system services (LSB, systemd or
-Upstart) resources is that they do not allow any parameters!
-=====
-
-////
-See https://tools.ietf.org/html/rfc5737 for choice of example IP address
-////
-
-.An OCF resource definition
-=====
-[source,XML]
--------
-<primitive id="Public-IP" class="ocf" type="IPaddr" provider="heartbeat">
- <instance_attributes id="Public-IP-params">
- <nvpair id="Public-IP-ip" name="ip" value="192.0.2.2"/>
- </instance_attributes>
-</primitive>
--------
-=====
-
-[[s-resource-options]]
-== Resource Options ==
-
-Resources have two types of options: 'meta-attributes' and 'instance attributes'.
-Meta-attributes apply to any type of resource, while instance attributes
-are specific to each resource agent.
-
-=== Resource Meta-Attributes ===
-
-Meta-attributes are used by the cluster to decide how a resource should
-behave and can be easily set using the `--meta` option of the
-`crm_resource` command.
-
-.Meta-attributes of a Primitive Resource
-[width="95%",cols="2m,2,<5",options="header",align="center"]
-|=========================================================
-
-|Field
-|Default
-|Description
-
-|priority
-|0
-|If not all resources can be active, the cluster will stop lower
-priority resources in order to keep higher priority ones active.
-indexterm:[priority,Resource Option]
-indexterm:[Resource,Option,priority]
-
-|target-role
-|Started
-a|What state should the cluster attempt to keep this resource in? Allowed values:
-
-* +Stopped:+ Force the resource to be stopped
-* +Started:+ Allow the resource to be started (and in the case of
- <<s-resource-promotable,promotable clone resources>>, promoted to master if
- appropriate)
-* +Slave:+ Allow the resource to be started, but only in Slave mode if
- the resource is <<s-resource-promotable,promotable>>
-* +Master:+ Equivalent to +Started+
-indexterm:[target-role,Resource Option]
-indexterm:[Resource,Option,target-role]
-
-|is-managed
-|TRUE
-|Is the cluster allowed to start and stop the resource? Allowed
- values: +true+, +false+
- indexterm:[is-managed,Resource Option]
- indexterm:[Resource,Option,is-managed]
-
-|maintenance
-|FALSE
-|Similar to the +maintenance-mode+ <<s-cluster-options,cluster option>>, but for
- a single resource. If true, the resource will not be started, stopped, or
- monitored on any node. This differs from +is-managed+ in that monitors will
- not be run. Allowed values: +true+, +false+
- indexterm:[maintenance,Resource Option]
- indexterm:[Resource,Option,maintenance]
-
-|resource-stickiness
-|1 for individual clone instances, 0 for all other resources
-|A score that will be added to the current node when a resource is already
- active. This allows running resources to stay where they are, even if
- they would be placed elsewhere if they were being started from a stopped
- state.
- indexterm:[resource-stickiness,Resource Option]
- indexterm:[Resource,Option,resource-stickiness]
-
-|requires
-|+quorum+ for resources with a +class+ of +stonith+,
- otherwise +unfencing+ if unfencing is active in the cluster,
- otherwise +fencing+ if +stonith-enabled+ is true, otherwise +quorum+
-a|Conditions under which the resource can be started
-Allowed values:
-
-* +nothing:+ can always be started
-* +quorum:+ The cluster can only start this resource if a majority of
- the configured nodes are active
-* +fencing:+ The cluster can only start this resource if a majority
- of the configured nodes are active _and_ any failed or unknown nodes
- have been <<ch-fencing,fenced>>
-* +unfencing:+
- The cluster can only start this resource if a majority
- of the configured nodes are active _and_ any failed or unknown nodes
- have been fenced _and_ only on nodes that have been
- <<s-unfencing,unfenced>>
-
-indexterm:[requires,Resource Option]
-indexterm:[Resource,Option,requires]
-
-|migration-threshold
-|INFINITY
-|How many failures may occur for this resource on a node, before this
- node is marked ineligible to host this resource. A value of 0 indicates that
- this feature is disabled (the node will never be marked ineligible); by
- constrast, the cluster treats INFINITY (the default) as a very large but
- finite number. This option has an effect only if the failed operation
- specifies +on-fail+ as +restart+ (the default), and additionally for
- failed +start+ operations, if the cluster property +start-failure-is-fatal+
- is +false+.
- indexterm:[migration-threshold,Resource Option]
- indexterm:[Resource,Option,migration-threshold]
-
-|failure-timeout
-|0
-|How many seconds to wait before acting as if the failure had not
- occurred, and potentially allowing the resource back to the node on
- which it failed. A value of 0 indicates that this feature is disabled.
- indexterm:[failure-timeout,Resource Option]
- indexterm:[Resource,Option,failure-timeout]
-
-|multiple-active
-|stop_start
-a|What should the cluster do if it ever finds the resource active on
- more than one node? Allowed values:
-
-* +block:+ mark the resource as unmanaged
-* +stop_only:+ stop all active instances and leave them that way
-* +stop_start:+ stop all active instances and start the resource in
- one location only
-
-indexterm:[multiple-active,Resource Option]
-indexterm:[Resource,Option,multiple-active]
-
-|allow-migrate
-|TRUE for ocf:pacemaker:remote resources, FALSE otherwise
-|Whether the cluster should try to "live migrate" this resource when it needs
-to be moved (see <<s-migrating-resources>>)
-
-|container-attribute-target
-|
-|Specific to bundle resources; see <<s-bundle-attributes>>
-
-|remote-node
-|
-|The name of the Pacemaker Remote guest node this resource is associated with,
- if any. If specified, this both enables the resource as a guest node and
- defines the unique name used to identify the guest node. The guest must be
- configured to run the Pacemaker Remote daemon when it is started. +WARNING:+
- This value cannot overlap with any resource or node IDs.
-
-|remote-port
-|3121
-|If +remote-node+ is specified, the port on the guest used for its
- Pacemaker Remote connection. The Pacemaker Remote daemon on the guest must be
- configured to listen on this port.
-
-|remote-addr
-|value of +remote-node+
-|If +remote-node+ is specified, the IP address or hostname used to connect to
- the guest via Pacemaker Remote. The Pacemaker Remote daemon on the guest
- must be configured to accept connections on this address.
-
-|remote-connect-timeout
-|60s
-|If +remote-node+ is specified, how long before a pending guest connection will
- time out.
-
-|=========================================================
-
-As an example of setting resource options, if you performed the following
-commands on an LSB Email resource:
-
--------
-# crm_resource --meta --resource Email --set-parameter priority --parameter-value 100
-# crm_resource -m -r Email -p multiple-active -v block
--------
-
-the resulting resource definition might be:
-
-.An LSB resource with cluster options
-=====
-[source,XML]
--------
-<primitive id="Email" class="lsb" type="exim">
- <meta_attributes id="Email-meta_attributes">
- <nvpair id="Email-meta_attributes-priority" name="priority" value="100"/>
- <nvpair id="Email-meta_attributes-multiple-active" name="multiple-active" value="block"/>
- </meta_attributes>
-</primitive>
--------
-=====
-
-In addition to the cluster-defined meta-attributes described above, you may
-also configure arbitrary meta-attributes of your own choosing. Most commonly,
-this would be done for use in <<ch-rules,rules>>. For example, an IT department
-might define a custom meta-attribute to indicate which company department each
-resource is intended for. To reduce the chance of name collisions with
-cluster-defined meta-attributes added in the future, it is recommended to use
-a unique, organization-specific prefix for such attributes.
-
-[[s-resource-defaults]]
-=== Setting Global Defaults for Resource Meta-Attributes ===
-
-To set a default value for a resource option, add it to the
-+rsc_defaults+ section with `crm_attribute`. For example,
-
-----
-# crm_attribute --type rsc_defaults --name is-managed --update false
-----
-
-would prevent the cluster from starting or stopping any of the
-resources in the configuration (unless of course the individual
-resources were specifically enabled by having their +is-managed+ set to
-+true+).
-
-=== Resource Instance Attributes ===
-
-The resource agents of some resource classes (lsb, systemd and upstart 'not' among them)
-can be given parameters which determine how they behave and which instance
-of a service they control.
-
-If your resource agent supports parameters, you can add them with the
-`crm_resource` command. For example,
-
-----
-# crm_resource --resource Public-IP --set-parameter ip --parameter-value 192.0.2.2
-----
-
-would create an entry in the resource like this:
-
-.An example OCF resource with instance attributes
-=====
-[source,XML]
--------
-<primitive id="Public-IP" class="ocf" type="IPaddr" provider="heartbeat">
- <instance_attributes id="params-public-ip">
- <nvpair id="public-ip-addr" name="ip" value="192.0.2.2"/>
- </instance_attributes>
-</primitive>
--------
-=====
-
-For an OCF resource, the result would be an environment variable
-called +OCF_RESKEY_ip+ with a value of +192.0.2.2+.
-
-The list of instance attributes supported by an OCF resource agent can be
-found by calling the resource agent with the `meta-data` command.
-The output contains an XML description of all the supported
-attributes, their purpose and default values.
-
-.Displaying the metadata for the Dummy resource agent template
-=====
-----
-# export OCF_ROOT=/usr/lib/ocf
-# $OCF_ROOT/resource.d/pacemaker/Dummy meta-data
-----
-[source,XML]
--------
-<?xml version="1.0"?>
-<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
-<resource-agent name="Dummy" version="1.0">
-<version>1.0</version>
-
-<longdesc lang="en">
-This is a Dummy Resource Agent. It does absolutely nothing except
-keep track of whether its running or not.
-Its purpose in life is for testing and to serve as a template for RA writers.
-
-NB: Please pay attention to the timeouts specified in the actions
-section below. They should be meaningful for the kind of resource
-the agent manages. They should be the minimum advised timeouts,
-but they shouldn't/cannot cover _all_ possible resource
-instances. So, try to be neither overly generous nor too stingy,
-but moderate. The minimum timeouts should never be below 10 seconds.
-</longdesc>
-<shortdesc lang="en">Example stateless resource agent</shortdesc>
-
-<parameters>
-<parameter name="state" unique="1">
-<longdesc lang="en">
-Location to store the resource state in.
-</longdesc>
-<shortdesc lang="en">State file</shortdesc>
-<content type="string" default="/var/run/Dummy-default.state" />
-</parameter>
-
-<parameter name="fake" unique="0">
-<longdesc lang="en">
-Fake attribute that can be changed to cause a reload
-</longdesc>
-<shortdesc lang="en">Fake attribute that can be changed to cause a reload</shortdesc>
-<content type="string" default="dummy" />
-</parameter>
-
-<parameter name="op_sleep" unique="1">
-<longdesc lang="en">
-Number of seconds to sleep during operations. This can be used to test how
-the cluster reacts to operation timeouts.
-</longdesc>
-<shortdesc lang="en">Operation sleep duration in seconds.</shortdesc>
-<content type="string" default="0" />
-</parameter>
-
-</parameters>
-
-<actions>
-<action name="start" timeout="20" />
-<action name="stop" timeout="20" />
-<action name="monitor" timeout="20" interval="10" depth="0"/>
-<action name="reload" timeout="20" />
-<action name="migrate_to" timeout="20" />
-<action name="migrate_from" timeout="20" />
-<action name="validate-all" timeout="20" />
-<action name="meta-data" timeout="5" />
-</actions>
-</resource-agent>
--------
-=====
-
-== Resource Operations ==
-
-indexterm:[Resource,Action]
-
-'Operations' are actions the cluster can perform on a resource by calling the
-resource agent. Resource agents must support certain common operations such as
-start, stop, and monitor, and may implement any others.
-
-Operations may be explicitly configured for two purposes: to override defaults
-for options (such as timeout) that the cluster will use whenever it initiates
-the operation, and to run an operation on a recurring basis (for example, to
-monitor the resource for failure).
-
-.An OCF resource with a non-default start timeout
-=====
-[source,XML]
--------
-<primitive id="Public-IP" class="ocf" type="IPaddr" provider="heartbeat">
- <operations>
- <op id="Public-IP-start" name="start" timeout="60s"/>
- </operations>
- <instance_attributes id="params-public-ip">
- <nvpair id="public-ip-addr" name="ip" value="192.0.2.2"/>
- </instance_attributes>
-</primitive>
--------
-=====
-
-Pacemaker identifies operations by a combination of name and interval, so this
-combination must be unique for each resource. That is, you should not configure
-two operations for the same resource with the same name and interval.
-
-[[s-operation-properties]]
-=== Operation Properties ===
-
-Operation properties may be specified directly in the +op+ element as
-XML attributes, or in a separate +meta_attributes+ block as +nvpair+ elements.
-XML attributes take precedence over +nvpair+ elements if both are specified.
-
-.Properties of an Operation
-[width="95%",cols="2m,3,<6",options="header",align="center"]
-|=========================================================
-
-|Field
-|Default
-|Description
-
-|id
-|
-|A unique name for the operation.
- indexterm:[id,Action Property]
- indexterm:[Action,Property,id]
-
-|name
-|
-|The action to perform. This can be any action supported by the agent; common
- values include +monitor+, +start+, and +stop+.
- indexterm:[name,Action Property]
- indexterm:[Action,Property,name]
-
-|interval
-|0
-|How frequently (in seconds) to perform the operation. A value of 0 means "when
- needed". A positive value defines a 'recurring action', which is typically
- used with <<s-resource-monitoring,monitor>>.
- indexterm:[interval,Action Property]
- indexterm:[Action,Property,interval]
-
-|timeout
-|
-|How long to wait before declaring the action has failed
- indexterm:[timeout,Action Property]
- indexterm:[Action,Property,timeout]
-
-|on-fail
-a|Varies by action:
-
-* +stop+: +fence+ if +stonith-enabled+ is true or +block+ otherwise
-* +demote+: +on-fail+ of the +monitor+ action with +role+ set to +Master+, if
- present, enabled, and configured to a value other than +demote+, or +restart+
- otherwise
-* all other actions: +restart+
-a|The action to take if this action ever fails. Allowed values:
-
-* +ignore:+ Pretend the resource did not fail.
-* +block:+ Don't perform any further operations on the resource.
-* +stop:+ Stop the resource and do not start it elsewhere.
-* +demote:+ Demote the resource, without a full restart. This is valid only for
- +promote+ actions, and for +monitor+ actions with both a nonzero +interval+
- and +role+ set to +Master+; for any other action, a configuration error will
- be logged, and the default behavior will be used.
-* +restart:+ Stop the resource and start it again (possibly on a different node).
-* +fence:+ STONITH the node on which the resource failed.
-* +standby:+ Move _all_ resources away from the node on which the resource failed.
-
-indexterm:[on-fail,Action Property]
-indexterm:[Action,Property,on-fail]
-
-|enabled
-|TRUE
-|If +false+, ignore this operation definition. This is typically used to pause
- a particular recurring +monitor+ operation; for instance, it can complement
- the respective resource being unmanaged (+is-managed=false+), as this alone
- will <<s-monitoring-unmanaged,not block any configured monitoring>>.
- Disabling the operation does not suppress all actions of the given type.
- Allowed values: +true+, +false+.
- indexterm:[enabled,Action Property]
- indexterm:[Action,Property,enabled]
-
-|record-pending
-|TRUE
-|If +true+, the intention to perform the operation is recorded so that
- GUIs and CLI tools can indicate that an operation is in progress.
- This is best set as an _operation default_ (see <<s-operation-defaults>>).
- Allowed values: +true+, +false+.
- indexterm:[enabled,Action Property]
- indexterm:[Action,Property,enabled]
-
-|role
-|
-|Run the operation only on node(s) that the cluster thinks should be in
- the specified role. This only makes sense for recurring +monitor+ operations.
- Allowed (case-sensitive) values: +Stopped+, +Started+, and in the
- case of <<s-resource-promotable,promotable clone resources>>, +Slave+ and +Master+.
- indexterm:[role,Action Property]
- indexterm:[Action,Property,role]
-
-|=========================================================
-
-[NOTE]
-====
-When +on-fail+ is set to +demote+, recovery from failure by a successful demote
-causes the cluster to recalculate whether and where a new instance should be
-promoted. The node with the failure is eligible, so if master scores have not
-changed, it will be promoted again.
-
-There is no direct equivalent of +migration-threshold+ for the master role, but
-the same effect can be achieved with a location constraint using a
-<<ch-rules,rule>> with a node attribute expression for the resource's fail
-count.
-
-For example, to immediately ban the master role from a node with any failed
-promote or master monitor:
-[source,XML]
-----
-<rsc_location id="loc1" rsc="my_primitive">
- <rule id="rule1" score="-INFINITY" role="Master" boolean-op="or">
- <expression id="expr1" attribute="fail-count-my_primitive#promote_0"
- operation="gte" value="1"/>
- <expression id="expr2" attribute="fail-count-my_primitive#monitor_10000"
- operation="gte" value="1"/>
- </rule>
-</rsc_location>
-----
-
-This example assumes that there is a promotable clone of the +my_primitive+
-resource (note that the primitive name, not the clone name, is used in the
-rule), and that there is a recurring 10-second-interval monitor configured for
-the master role (fail count attributes specify the interval in milliseconds).
-====
-
-[[s-resource-monitoring]]
-=== Monitoring Resources for Failure ===
-
-When Pacemaker first starts a resource, it runs one-time +monitor+ operations
-(referred to as 'probes') to ensure the resource is running where it's
-supposed to be, and not running where it's not supposed to be. (This behavior
-can be affected by the +resource-discovery+ location constraint property.)
-
-Other than those initial probes, Pacemaker will 'not' (by default) check that
-the resource continues to stay healthy.
-footnote:[Currently, anyway. Automatic monitoring operations may be
-added in a future version of Pacemaker.]
-You must configure +monitor+ operations explicitly to perform these checks.
-
-.An OCF resource with a recurring health check
-=====
-[source,XML]
--------
-<primitive id="Public-IP" class="ocf" type="IPaddr" provider="heartbeat">
- <operations>
- <op id="Public-IP-start" name="start" timeout="60s"/>
- <op id="Public-IP-monitor" name="monitor" interval="60s"/>
- </operations>
- <instance_attributes id="params-public-ip">
- <nvpair id="public-ip-addr" name="ip" value="192.0.2.2"/>
- </instance_attributes>
-</primitive>
--------
-=====
-
-By default, a +monitor+ operation will ensure that the resource is running
-where it is supposed to. The +target-role+ property can be used for further
-checking.
-
-For example, if a resource has one +monitor+ operation with
-+interval=10 role=Started+ and a second +monitor+ operation with
-+interval=11 role=Stopped+, the cluster will run the first monitor on any nodes
-it thinks 'should' be running the resource, and the second monitor on any nodes
-that it thinks 'should not' be running the resource (for the truly paranoid,
-who want to know when an administrator manually starts a service by mistake).
-
-[NOTE]
-====
-Currently, monitors with +role=Stopped+ are not implemented for
-<<s-resource-clone,clone>> resources.
-====
-
-[[s-monitoring-unmanaged]]
-=== Monitoring Resources When Administration is Disabled ===
-
-Recurring +monitor+ operations behave differently under various administrative
-settings:
-
-* When a resource is unmanaged (by setting +is-managed=false+): No monitors
- will be stopped.
-+
-If the unmanaged resource is stopped on a node where the cluster thinks it
-should be running, the cluster will detect and report that it is not, but it
-will not consider the monitor failed, and will not try to start the resource
-until it is managed again.
-+
-Starting the unmanaged resource on a different node is strongly discouraged
-and will at least cause the cluster to consider the resource failed, and
-may require the resource's +target-role+ to be set to +Stopped+ then +Started+
-to be recovered.
-
-* When a node is put into standby: All resources will be moved away from the
- node, and all +monitor+ operations will be stopped on the node, except those
- specifying +role+ as +Stopped+ (which will be newly initiated if
- appropriate).
-
-* When the cluster is put into maintenance mode: All resources will be marked
- as unmanaged. All monitor operations will be stopped, except those
- specifying +role+ as +Stopped+ (which will be newly initiated if
- appropriate). As with single unmanaged resources, starting
- a resource on a node other than where the cluster expects it to be will
- cause problems.
-
-[[s-operation-defaults]]
-=== Setting Global Defaults for Operations ===
-
-You can change the global default values for operation properties
-in a given cluster. These are defined in an +op_defaults+ section
-of the CIB's +configuration+ section, and can be set with `crm_attribute`.
-For example,
-
-----
-# crm_attribute --type op_defaults --name timeout --update 20s
-----
-
-would default each operation's +timeout+ to 20 seconds. If an
-operation's definition also includes a value for +timeout+, then that
-value would be used for that operation instead.
-
-=== When Implicit Operations Take a Long Time ===
-
-The cluster will always perform a number of implicit operations: +start+,
-+stop+ and a non-recurring +monitor+ operation used at startup to check
-whether the resource is already active. If one of these is taking too long,
-then you can create an entry for them and specify a longer timeout.
-
-.An OCF resource with custom timeouts for its implicit actions
-=====
-[source,XML]
--------
-<primitive id="Public-IP" class="ocf" type="IPaddr" provider="heartbeat">
- <operations>
- <op id="public-ip-startup" name="monitor" interval="0" timeout="90s"/>
- <op id="public-ip-start" name="start" interval="0" timeout="180s"/>
- <op id="public-ip-stop" name="stop" interval="0" timeout="15min"/>
- </operations>
- <instance_attributes id="params-public-ip">
- <nvpair id="public-ip-addr" name="ip" value="192.0.2.2"/>
- </instance_attributes>
-</primitive>
--------
-=====
-
-=== Multiple Monitor Operations ===
-
-Provided no two operations (for a single resource) have the same name
-and interval, you can have as many +monitor+ operations as you like.
-In this way, you can do a superficial health check every minute and
-progressively more intense ones at higher intervals.
-
-To tell the resource agent what kind of check to perform, you need to
-provide each monitor with a different value for a common parameter.
-The OCF standard creates a special parameter called +OCF_CHECK_LEVEL+
-for this purpose and dictates that it is "made available to the
-resource agent without the normal +OCF_RESKEY+ prefix".
-
-Whatever name you choose, you can specify it by adding an
-+instance_attributes+ block to the +op+ tag. It is up to each
-resource agent to look for the parameter and decide how to use it.
-
-.An OCF resource with two recurring health checks, performing different levels of checks specified via +OCF_CHECK_LEVEL+.
-=====
-[source,XML]
--------
-<primitive id="Public-IP" class="ocf" type="IPaddr" provider="heartbeat">
- <operations>
- <op id="public-ip-health-60" name="monitor" interval="60">
- <instance_attributes id="params-public-ip-depth-60">
- <nvpair id="public-ip-depth-60" name="OCF_CHECK_LEVEL" value="10"/>
- </instance_attributes>
- </op>
- <op id="public-ip-health-300" name="monitor" interval="300">
- <instance_attributes id="params-public-ip-depth-300">
- <nvpair id="public-ip-depth-300" name="OCF_CHECK_LEVEL" value="20"/>
- </instance_attributes>
- </op>
- </operations>
- <instance_attributes id="params-public-ip">
- <nvpair id="public-ip-level" name="ip" value="192.0.2.2"/>
- </instance_attributes>
-</primitive>
--------
-=====
-
-=== Disabling a Monitor Operation ===
-
-The easiest way to stop a recurring monitor is to just delete it.
-However, there can be times when you only want to disable it
-temporarily. In such cases, simply add +enabled=false+ to the
-operation's definition.
-
-.Example of an OCF resource with a disabled health check
-=====
-[source,XML]
--------
-<primitive id="Public-IP" class="ocf" type="IPaddr" provider="heartbeat">
- <operations>
- <op id="public-ip-check" name="monitor" interval="60s" enabled="false"/>
- </operations>
- <instance_attributes id="params-public-ip">
- <nvpair id="public-ip-addr" name="ip" value="192.0.2.2"/>
- </instance_attributes>
-</primitive>
--------
-=====
-
-This can be achieved from the command line by executing:
-
-----
-# cibadmin --modify --xml-text '<op id="public-ip-check" enabled="false"/>'
-----
-
-Once you've done whatever you needed to do, you can then re-enable it with
-----
-# cibadmin --modify --xml-text '<op id="public-ip-check" enabled="true"/>'
-----
diff --git a/doc/Pacemaker_Explained/en-US/Ch-Reusing-Configuration.txt b/doc/Pacemaker_Explained/en-US/Ch-Reusing-Configuration.txt
deleted file mode 100644
index a7569d1412..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ch-Reusing-Configuration.txt
+++ /dev/null
@@ -1,376 +0,0 @@
-:compat-mode: legacy
-= Reusing Parts of the Configuration =
-
-Pacemaker provides multiple ways to simplify the configuration XML by reusing
-parts of it in multiple places.
-
-Besides simplifying the XML, this also allows you to manipulate multiple
-configuration elements with a single reference.
-
-== Reusing Resource Definitions ==
-
-If you want to create lots of resources with similar configurations, defining a
-'resource template' simplifies the task. Once defined, it can be referenced in
-primitives or in certain types of constraints.
-
-=== Configuring Resources with Templates ===
-
-The primitives referencing the template will inherit all meta-attributes,
-instance attributes, utilization attributes and operations defined
-in the template. And you can define specific attributes and operations for any
-of the primitives. If any of these are defined in both the template and the
-primitive, the values defined in the primitive will take precedence over the
-ones defined in the template.
-
-Hence, resource templates help to reduce the amount of configuration work.
-If any changes are needed, they can be done to the template definition and
-will take effect globally in all resource definitions referencing that
-template.
-
-Resource templates have a syntax similar to that of primitives.
-
-.Resource template for a migratable Xen virtual machine
-====
-[source,XML]
-----
-<template id="vm-template" class="ocf" provider="heartbeat" type="Xen">
- <meta_attributes id="vm-template-meta_attributes">
- <nvpair id="vm-template-meta_attributes-allow-migrate" name="allow-migrate" value="true"/>
- </meta_attributes>
- <utilization id="vm-template-utilization">
- <nvpair id="vm-template-utilization-memory" name="memory" value="512"/>
- </utilization>
- <operations>
- <op id="vm-template-monitor-15s" interval="15s" name="monitor" timeout="60s"/>
- <op id="vm-template-start-0" interval="0" name="start" timeout="60s"/>
- </operations>
-</template>
-----
-====
-
-Once you define a resource template, you can use it in primitives by specifying the
-+template+ property.
-
-.Xen primitive resource using a resource template
-====
-[source,XML]
-----
-<primitive id="vm1" template="vm-template">
- <instance_attributes id="vm1-instance_attributes">
- <nvpair id="vm1-instance_attributes-name" name="name" value="vm1"/>
- <nvpair id="vm1-instance_attributes-xmfile" name="xmfile" value="/etc/xen/shared-vm/vm1"/>
- </instance_attributes>
-</primitive>
-----
-====
-
-In the example above, the new primitive +vm1+ will inherit everything from +vm-template+. For
-example, the equivalent of the above two examples would be:
-
-.Equivalent Xen primitive resource not using a resource template
-====
-[source,XML]
-----
-<primitive id="vm1" class="ocf" provider="heartbeat" type="Xen">
- <meta_attributes id="vm-template-meta_attributes">
- <nvpair id="vm-template-meta_attributes-allow-migrate" name="allow-migrate" value="true"/>
- </meta_attributes>
- <utilization id="vm-template-utilization">
- <nvpair id="vm-template-utilization-memory" name="memory" value="512"/>
- </utilization>
- <operations>
- <op id="vm-template-monitor-15s" interval="15s" name="monitor" timeout="60s"/>
- <op id="vm-template-start-0" interval="0" name="start" timeout="60s"/>
- </operations>
- <instance_attributes id="vm1-instance_attributes">
- <nvpair id="vm1-instance_attributes-name" name="name" value="vm1"/>
- <nvpair id="vm1-instance_attributes-xmfile" name="xmfile" value="/etc/xen/shared-vm/vm1"/>
- </instance_attributes>
-</primitive>
-----
-====
-
-If you want to overwrite some attributes or operations, add them to the
-particular primitive's definition.
-
-.Xen resource overriding template values
-====
-[source,XML]
-----
-<primitive id="vm2" template="vm-template">
- <meta_attributes id="vm2-meta_attributes">
- <nvpair id="vm2-meta_attributes-allow-migrate" name="allow-migrate" value="false"/>
- </meta_attributes>
- <utilization id="vm2-utilization">
- <nvpair id="vm2-utilization-memory" name="memory" value="1024"/>
- </utilization>
- <instance_attributes id="vm2-instance_attributes">
- <nvpair id="vm2-instance_attributes-name" name="name" value="vm2"/>
- <nvpair id="vm2-instance_attributes-xmfile" name="xmfile" value="/etc/xen/shared-vm/vm2"/>
- </instance_attributes>
- <operations>
- <op id="vm2-monitor-30s" interval="30s" name="monitor" timeout="120s"/>
- <op id="vm2-stop-0" interval="0" name="stop" timeout="60s"/>
- </operations>
-</primitive>
-----
-====
-
-In the example above, the new primitive +vm2+ has special
-attribute values. Its +monitor+ operation has a longer +timeout+ and +interval+, and
-the primitive has an additional +stop+ operation.
-
-To see the resulting definition of a resource, run:
-
-----
-# crm_resource --query-xml --resource vm2
-----
-
-To see the raw definition of a resource in the CIB, run:
-
-----
-# crm_resource --query-xml-raw --resource vm2
-----
-
-=== Using Templates in Constraints ===
-
-A resource template can be referenced in the following types of constraints:
-
-- +order+ constraints (see <<s-resource-ordering>>)
-- +colocation+ constraints (see <<s-resource-colocation>>)
-- +rsc_ticket+ constraints (for multi-site clusters as described in <<s-ticket-constraints>>)
-
-Resource templates referenced in constraints stand for all primitives which are
-derived from that template. This means, the constraint applies to all primitive
-resources referencing the resource template. Referencing resource templates in
-constraints is an alternative to resource sets and can simplify the cluster
-configuration considerably.
-
-For example, given the example templates earlier in this chapter:
-
-[source,XML]
-<rsc_colocation id="vm-template-colo-base-rsc" rsc="vm-template" rsc-role="Started" with-rsc="base-rsc" score="INFINITY"/>
-
-would colocate all VMs with +base-rsc+ and is the equivalent of the following constraint configuration:
-
-[source,XML]
-----
-<rsc_colocation id="vm-colo-base-rsc" score="INFINITY">
- <resource_set id="vm-colo-base-rsc-0" sequential="false" role="Started">
- <resource_ref id="vm1"/>
- <resource_ref id="vm2"/>
- </resource_set>
- <resource_set id="vm-colo-base-rsc-1">
- <resource_ref id="base-rsc"/>
- </resource_set>
-</rsc_colocation>
-----
-
-[NOTE]
-======
-In a colocation constraint, only one template may be referenced from either
-`rsc` or `with-rsc`; the other reference must be a regular resource.
-======
-
-=== Using Templates in Resource Sets ===
-
-Resource templates can also be referenced in resource sets.
-
-For example, given the example templates earlier in this section, then:
-
-[source,XML]
-----
-<rsc_order id="order1" score="INFINITY">
- <resource_set id="order1-0">
- <resource_ref id="base-rsc"/>
- <resource_ref id="vm-template"/>
- <resource_ref id="top-rsc"/>
- </resource_set>
-</rsc_order>
-----
-
-is the equivalent of the following constraint using a sequential resource set:
-
-[source,XML]
-----
-<rsc_order id="order1" score="INFINITY">
- <resource_set id="order1-0">
- <resource_ref id="base-rsc"/>
- <resource_ref id="vm1"/>
- <resource_ref id="vm2"/>
- <resource_ref id="top-rsc"/>
- </resource_set>
-</rsc_order>
-----
-
-Or, if the resources referencing the template can run in parallel, then:
-
-[source,XML]
-----
-<rsc_order id="order2" score="INFINITY">
- <resource_set id="order2-0">
- <resource_ref id="base-rsc"/>
- </resource_set>
- <resource_set id="order2-1" sequential="false">
- <resource_ref id="vm-template"/>
- </resource_set>
- <resource_set id="order2-2">
- <resource_ref id="top-rsc"/>
- </resource_set>
-</rsc_order>
-----
-
-is the equivalent of the following constraint configuration:
-
-[source,XML]
-----
-<rsc_order id="order2" score="INFINITY">
- <resource_set id="order2-0">
- <resource_ref id="base-rsc"/>
- </resource_set>
- <resource_set id="order2-1" sequential="false">
- <resource_ref id="vm1"/>
- <resource_ref id="vm2"/>
- </resource_set>
- <resource_set id="order2-2">
- <resource_ref id="top-rsc"/>
- </resource_set>
-</rsc_order>
-----
-
-[[s-reusing-config-elements]]
-== Reusing Rules, Options and Sets of Operations ==
-
-Sometimes a number of constraints need to use the same set of rules,
-and resources need to set the same options and parameters. To
-simplify this situation, you can refer to an existing object using an
-+id-ref+ instead of an +id+.
-
-So if for one resource you have
-
-[source,XML]
-------
-<rsc_location id="WebServer-connectivity" rsc="Webserver">
- <rule id="ping-prefer-rule" score-attribute="pingd" >
- <expression id="ping-prefer" attribute="pingd" operation="defined"/>
- </rule>
-</rsc_location>
-------
-
-Then instead of duplicating the rule for all your other resources, you can instead specify:
-
-.Referencing rules from other constraints
-=====
-[source,XML]
--------
-<rsc_location id="WebDB-connectivity" rsc="WebDB">
- <rule id-ref="ping-prefer-rule"/>
-</rsc_location>
--------
-=====
-
-[IMPORTANT]
-===========
-The cluster will insist that the +rule+ exists somewhere. Attempting
-to add a reference to a non-existing rule will cause a validation
-failure, as will attempting to remove a +rule+ that is referenced
-elsewhere.
-===========
-
-The same principle applies for +meta_attributes+ and
-+instance_attributes+ as illustrated in the example below:
-
-.Referencing attributes, options, and operations from other resources
-=====
-[source,XML]
--------
-<primitive id="mySpecialRsc" class="ocf" type="Special" provider="me">
- <instance_attributes id="mySpecialRsc-attrs" score="1" >
- <nvpair id="default-interface" name="interface" value="eth0"/>
- <nvpair id="default-port" name="port" value="9999"/>
- </instance_attributes>
- <meta_attributes id="mySpecialRsc-options">
- <nvpair id="failure-timeout" name="failure-timeout" value="5m"/>
- <nvpair id="migration-threshold" name="migration-threshold" value="1"/>
- <nvpair id="stickiness" name="resource-stickiness" value="0"/>
- </meta_attributes>
- <operations id="health-checks">
- <op id="health-check" name="monitor" interval="60s"/>
- <op id="health-check" name="monitor" interval="30min"/>
- </operations>
-</primitive>
-<primitive id="myOtherlRsc" class="ocf" type="Other" provider="me">
- <instance_attributes id-ref="mySpecialRsc-attrs"/>
- <meta_attributes id-ref="mySpecialRsc-options"/>
- <operations id-ref="health-checks"/>
-</primitive>
--------
-=====
-
-+id-ref+ can similarly be used with +resource_set+ (in any constraint type),
-+nvpair+, and +operations+.
-
-== Tagging Configuration Elements ==
-
-Pacemaker allows you to 'tag' any configuration element that has an XML ID.
-
-The main purpose of tagging is to support higher-level user interface tools;
-Pacemaker itself only uses tags within constraints. Therefore, what you can
-do with tags mostly depends on the tools you use.
-
-=== Configuring Tags ===
-
-A tag is simply a named list of XML IDs.
-
-.Tag referencing three resources
-====
-[source,XML]
-----
-<tags>
- <tag id="all-vms">
- <obj_ref id="vm1"/>
- <obj_ref id="vm2"/>
- <obj_ref id="vm3"/>
- </tag>
-</tags>
-----
-====
-
-What you can do with this new tag depends on what your higher-level tools
-support. For example, a tool might allow you to enable or disable all of
-the tagged resources at once, or show the status of just the tagged
-resources.
-
-A single configuration element can be listed in any number of tags.
-
-=== Using Tags in Constraints and Resource Sets ===
-
-Pacemaker itself only uses tags in constraints. If you supply a tag name
-instead of a resource name in any constraint, the constraint will apply to
-all resources listed in that tag.
-
-.Constraint using a tag
-====
-[source,XML]
-----
-<rsc_order id="order1" first="storage" then="all-vms" kind="Mandatory" />
-----
-====
-
-In the example above, assuming the +all-vms+ tag is defined as in the previous
-example, the constraint will behave the same as:
-
-.Equivalent constraints without tags
-====
-[source,XML]
-----
-<rsc_order id="order1-1" first="storage" then="vm1" kind="Mandatory" />
-<rsc_order id="order1-2" first="storage" then="vm2" kind="Mandatory" />
-<rsc_order id="order1-3" first="storage" then="vm2" kind="Mandatory" />
-----
-====
-
-A tag may be used directly in the constraint, or indirectly by being
-listed in a <<s-resource-sets,resource set>> used in the constraint.
-When used in a resource set, an expanded tag will honor the set's
-+sequential+ property.
diff --git a/doc/Pacemaker_Explained/en-US/Ch-Rules.txt b/doc/Pacemaker_Explained/en-US/Ch-Rules.txt
deleted file mode 100644
index 921cb1f490..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ch-Rules.txt
+++ /dev/null
@@ -1,934 +0,0 @@
-:compat-mode: legacy
-= Rules =
-
-////
-We prefer [[ch-rules]], but older versions of asciidoc don't deal well
-with that construct for chapter headings
-////
-
-anchor:ch-rules[Chapter 8, Rules]
-indexterm:[Constraint,Rule]
-
-Rules can be used to make your configuration more dynamic, allowing values to
-change depending on the time or the value of a node attribute. Examples of
-things rules are useful for:
-
-* Set a higher value for <<s-resource-options,+resource-stickiness+>> during
- working hours, to minimize downtime, and a lower value on weekends, to allow
- resources to move to their most preferred locations when people aren't around
- to notice.
-
-* Automatically place the cluster into maintenance mode during a scheduled
- maintenance window.
-
-* Assign certain nodes and resources to a particular department via custom
- node attributes and meta-attributes, and add a single location constraint
- that restricts the department's resources to run only on those nodes.
-
-Each constraint type or property set that supports rules may contain one or more
-+rule+ elements specifying conditions under which the constraint or properties
-take effect. Examples later in this chapter will make this clearer.
-
-== Rule Properties ==
-
-indexterm:[XML element,rule element]
-
-.Attributes of a rule Element
-[width="95%",cols="2m,1,<5",options="header",align="center"]
-|=========================================================
-
-|Attribute
-|Default
-|Description
-
-|id
-|
-|A unique name for the rule (required)
- indexterm:[XML attribute,id attribute,rule element]
- indexterm:[XML element,rule element,id attribute]
-
-|role
-|+Started+
-|The rule is in effect only when the resource is in the specified
- role. Allowed values are +Started+, +Slave+, and +Master+. A rule
- with +role="Master"+ cannot determine the initial location of a
- clone instance and will only affect which of the active instances
- will be promoted.
- indexterm:[XML attribute,role attribute,rule element]
- indexterm:[XML element,rule element,role attribute]
-
-|score
-|
-|If this rule is used in a location constraint and evaluates to true, apply
- this score to the constraint. Only one of +score+ and +score-attribute+ may be
- used.
- indexterm:[XML attribute,score attribute,rule element]
- indexterm:[XML element,rule element,score attribute]
-
-|score-attribute
-|
-|If this rule is used in a location constraint and evaluates to true, use the
- value of this node attribute as the score to apply to the constraint. Only one
- of +score+ and +score-attribute+ may be used.
- indexterm:[XML attribute,score-attribute attribute,rule element]
- indexterm:[XML element,rule element,score-attribute attribute]
-
-|boolean-op
-|+and+
-|If this rule contains more than one condition, a value of +and+ specifies that
- the rule evaluates to true only if all conditions are true, and a value of
- +or+ specifies that the rule evaluates to true if any condition is true.
- indexterm:[XML attribute,boolean-op attribute,rule element]
- indexterm:[XML element,rule element,boolean-op attribute]
-
-|=========================================================
-
-A +rule+ element must contain one or more conditions. A condition may be an
-+expression+ element, a +date_expression+ element, or another +rule+ element.
-
-== Node Attribute Expressions ==
-
-[[node-attribute-expressions]]
-indexterm:[Rule,Node Attribute Expression]
-indexterm:[XML element,expression element]
-
-Expressions are rule conditions based on the values of node attributes.
-
-.Attributes of an expression Element
-[width="95%",cols="2m,1,<5",options="header",align="center"]
-|=========================================================
-
-|Field
-|Default
-|Description
-
-|id
-|
-|A unique name for the expression (required)
- indexterm:[XML attribute,id attribute,expression element]
- indexterm:[XML element,expression element,id attribute]
-
-|attribute
-|
-|The node attribute to test (required)
- indexterm:[XML attribute,attribute attribute,expression element]
- indexterm:[XML element,expression element,attribute attribute]
-
-|type
-|The default type for +lt+, +gt+, +lte+, and +gte+ operations is
- +number+ if either value contains a decimal point character, or
- +integer+ otherwise. The default type for all other operations is
- +string+. If a numeric parse fails for either value, then the values
- compared as type +string+.
-|How the node attributes should be compared. Allowed values are
- +string+, +integer+, +number+, and +version+. +integer+ truncates
- floating-point values if necessary before performing an integer
- comparison. +number+ performs a floating-point comparison.
- indexterm:[XML attribute,type attribute,expression element]
- indexterm:[XML element,expression element,type attribute]
-
-|operation
-|
-a|The comparison to perform (required). Allowed values:
-
-* +lt:+ True if the node attribute value is less than the comparison value
-* +gt:+ True if the node attribute value is greater than the comparison value
-* +lte:+ True if the node attribute value is less than or equal to the comparison value
-* +gte:+ True if the node attribute value is greater than or equal to the comparison value
-* +eq:+ True if the node attribute value is equal to the comparison value
-* +ne:+ True if the node attribute value is not equal to the comparison value
-* +defined:+ True if the node has the named attribute
-* +not_defined:+ True if the node does not have the named attribute
- indexterm:[XML attribute,operation attribute,expression element]
- indexterm:[XML element,expression element,operation attribute]
-
-|value
-|
-|User-supplied value for comparison (required for operations other than
- +defined+ and +not_defined+)
- indexterm:[XML attribute,value attribute,expression element]
- indexterm:[XML element,expression element,value attribute]
-
-|value-source
-|+literal+
-a|How the +value+ is derived. Allowed values:
-
-* +literal+: +value+ is a literal string to compare against
-* +param+: +value+ is the name of a resource parameter to compare against (only
- valid in location constraints)
-* +meta+: +value+ is the name of a resource meta-attribute to compare against
- (only valid in location constraints)
- indexterm:[XML attribute,value-source attribute,expression element]
- indexterm:[XML element,expression element,value-source attribute]
-
-|=========================================================
-
-[[node-attribute-expressions-special]]
-In addition to custom node attributes defined by the administrator, the cluster
-defines special, built-in node attributes for each node that can also be used
-in rule expressions.
-
-.Built-in Node Attributes
-[width="95%",cols="1m,<5",options="header",align="center"]
-|=========================================================
-
-|Name
-|Value
-
-|#uname
-|Node <<s-node-name,name>>
-
-|#id
-|Node ID
-
-|#kind
-|Node type. Possible values are +cluster+, +remote+, and +container+. Kind is
- +remote+ for Pacemaker Remote nodes created with the +ocf:pacemaker:remote+
- resource, and +container+ for Pacemaker Remote guest nodes and bundle nodes
-
-|#is_dc
-|"true" if this node is a Designated Controller (DC), "false" otherwise
-
-|#cluster-name
-|The value of the +cluster-name+ cluster property, if set
-
-|#site-name
-|The value of the +site-name+ node attribute, if set, otherwise identical to
- +#cluster-name+
-
-|#role
-a|The role the relevant promotable clone resource has on this node. Valid only within
- a rule for a location constraint for a promotable clone resource.
-
-////
-// if uncommenting, put a pipe in front of first two lines
-#ra-version
-The installed version of the resource agent on the node, as defined
- by the +version+ attribute of the +resource-agent+ tag in the agent's
- metadata. Valid only within rules controlling resource options. This can be
- useful during rolling upgrades of a backward-incompatible resource agent.
- '(coming in x.x.x)'
-////
-
-|=========================================================
-
-== Date/Time Expressions ==
-
-indexterm:[Rule,Date/Time Expression]
-indexterm:[XML element,date_expression element]
-
-Date/time expressions are rule conditions based (as the name suggests) on the
-current date and time.
-
-A +date_expression+ element may optionally contain a +date_spec+ or +duration+
-element depending on the context.
-
-.Attributes of a date_expression Element
-[width="95%",cols="2m,<5",options="header",align="center"]
-|=========================================================
-|Field
-|Description
-
-|id
-|A unique name for the expression (required)
- indexterm:[XML attribute,id attribute,date_expression element]
- indexterm:[XML element,date_expression element,id attribute]
-
-|start
-|A date/time conforming to the http://en.wikipedia.org/wiki/ISO_8601[ISO8601]
- specification. May be used when +operation+ is +in_range+ (in which case at
- least one of +start+ or +end+ must be specified) or +gt+ (in which case
- +start+ is required).
- indexterm:[XML attribute,start attribute,date_expression element]
- indexterm:[XML element,date_expression element,start attribute]
-
-|end
-|A date/time conforming to the http://en.wikipedia.org/wiki/ISO_8601[ISO8601]
- specification. May be used when +operation+ is +in_range+ (in which case at
- least one of +start+ or +end+ must be specified) or +lt+ (in which case
- +end+ is required).
- indexterm:[XML attribute,end attribute,date_expression element]
- indexterm:[XML element,date_expression element,end attribute]
-
-|operation
-a|Compares the current date/time with the start and/or end date,
- depending on the context. Allowed values:
-
-* +gt:+ True if the current date/time is after +start+
-* +lt:+ True if the current date/time is before +end+
-* +in_range:+ True if the current date/time is after +start+ (if specified)
- and before either +end+ (if specified) or +start+ plus the value of the
- +duration+ element (if one is contained in the +date_expression+)
-* +date_spec:+ True if the current date/time matches the specification
- given in the contained +date_spec+ element (described below)
- indexterm:[XML attribute,operation attribute,date_expression element]
- indexterm:[XML element,date_expression element,operation attribute]
-
-|=========================================================
-
-[NOTE]
-======
-There is no +eq+, +neq+, +gte+, or +lte+ operation, since they would be valid
-only for a single second.
-======
-
-=== Date Specifications ===
-indexterm:[Rule,Date/Time Expression,Date Specification]
-indexterm:[XML element,date_spec element]
-
-A +date_spec+ element is used to create a cron-like expression relating
-to time. Each field can contain a single number or range. Any field not
-supplied is ignored.
-
-.Attributes of a date_spec Element
-[width="95%",cols="2m,<5",options="header",align="center"]
-|=========================================================
-
-|Field
-|Description
-
-|id
-|A unique name for the object (required)
- indexterm:[XML attribute,id attribute,date_spec element]
- indexterm:[XML element,date_spec element,id attribute]
-
-|hours
-|Allowed values: 0-23 (where 0 is midnight and 23 is 11 p.m.)
- indexterm:[XML attribute,hours attribute,date_spec element]
- indexterm:[XML element,date_spec element,hours attribute]
-
-|monthdays
-|Allowed values: 1-31 (depending on month and year)
- indexterm:[XML attribute,monthdays attribute,date_spec element]
- indexterm:[XML element,date_spec element,monthdays attribute]
-
-|weekdays
-|Allowed values: 1-7 (where 1 is Monday and 7 is Sunday)
- indexterm:[XML attribute,weekdays attribute,date_spec element]
- indexterm:[XML element,date_spec element,weekdays attribute]
-
-|yeardays
-|Allowed values: 1-366 (depending on the year)
- indexterm:[XML attribute,yeardays attribute,date_spec element]
- indexterm:[XML element,date_spec element,yeardays attribute]
-
-|months
-|Allowed values: 1-12
- indexterm:[XML attribute,months attribute,date_spec element]
- indexterm:[XML element,date_spec element,months attribute]
-
-|weeks
-|Allowed values: 1-53 (depending on weekyear)
- indexterm:[XML attribute,weeks attribute,date_spec element]
- indexterm:[XML element,date_spec element,weeks attribute]
-
-|years
-|Year according to the Gregorian calendar
- indexterm:[XML attribute,years attribute,date_spec element]
- indexterm:[XML element,date_spec element,years attribute]
-
-|weekyears
-|Year in which the week started; for example, 1 January 2005 can be specified
- in ISO 8601 as '2005-001 Ordinal', '2005-01-01 Gregorian' or
- '2004-W53-6 Weekly' and thus would match +years="2005"+ or +weekyears="2004"+
- indexterm:[XML attribute,weekyears attribute,date_spec element]
- indexterm:[XML element,date_spec element,weekyears attribute]
-
-|moon
-|Allowed values are 0-7 (where 0 is the new moon and 4 is full moon).
- Seriously, you can use this. This was implemented to demonstrate the ease with
- which new comparisons could be added.
- indexterm:[XML attribute,moon attribute,date_spec element]
- indexterm:[XML element,date_spec element,moon attribute]
-
-|=========================================================
-
-For example, +monthdays="1"+ matches the first day of every month, and
-+hours="09-17"+ matches the hours between 9 a.m. and 5 p.m. (inclusive).
-
-At this time, multiple ranges (e.g. +weekdays="1,2"+ or +weekdays="1-2,5-6"+)
-are not supported.
-
-[NOTE]
-====
-Pacemaker can calculate when evaluation of a +date_expression+ with an
-+operation+ of +gt+, +lt+, or +in_range+ will next change, and schedule a
-cluster re-check for that time. However, it does not do this for +date_spec+.
-Instead, it evaluates the +date_spec+ whenever a cluster re-check naturally
-happens via a cluster event or the +cluster-recheck-interval+ cluster option.
-For example, if you have a +date_spec+ enabling a resource from 9 a.m. to 5 p.m.,
-and +cluster-recheck-interval+ has been set to 5 minutes, then sometime between
-9 a.m. and 9:05 a.m. the cluster would notice that it needs to start the
-resource, and sometime between 5 p.m. and 5:05 p.m. it would realize that it
-needs to stop the resource. The timing of the actual start and stop actions
-will further depend on factors such as any other actions the cluster may need
-to perform first, and the load of the machine.
-====
-
-=== Durations ===
-indexterm:[Rule,Date/Time Expression,Duration]
-indexterm:[XML element,duration element]
-
-A +duration+ is used to calculate a value for +end+ when one is not supplied to
-+in_range+ operations. It contains one or more attributes each containing a
-single number. Any attribute not supplied is ignored.
-
-.Attributes of a duration Element
-[width="95%",cols="2m,<5",options="header",align="center"]
-|=========================================================
-
-|Field
-|Description
-
-|id
-|A unique name for this duration element (required)
- indexterm:[XML attribute,id attribute,duration element]
- indexterm:[XML element,duration element,id attribute]
-
-|seconds
-|This many seconds will be added to the total duration
- indexterm:[XML attribute,seconds attribute,duration element]
- indexterm:[XML element,duration element,seconds attribute]
-
-|minutes
-|This many minutes will be added to the total duration
- indexterm:[XML attribute,minutes attribute,duration element]
- indexterm:[XML element,duration element,minutes attribute]
-
-|hours
-|This many hours will be added to the total duration
- indexterm:[XML attribute,hours attribute,duration element]
- indexterm:[XML element,duration element,hours attribute]
-
-|weeks
-|This many weeks will be added to the total duration
- indexterm:[XML attribute,weeks attribute,duration element]
- indexterm:[XML element,duration element,weeks attribute]
-
-|months
-|This many months will be added to the total duration
- indexterm:[XML attribute,months attribute,duration element]
- indexterm:[XML element,duration element,months attribute]
-
-|years
-|This many years will be added to the total duration
- indexterm:[XML attribute,years attribute,duration element]
- indexterm:[XML element,duration element,years attribute]
-
-|=========================================================
-
-=== Example Time-Based Expressions ===
-
-A small sample of how time-based expressions can be used:
-
-.True if now is any time in the year 2005
-====
-[source,XML]
-----
-<rule id="rule1" score="INFINITY">
- <date_expression id="date_expr1" start="2005-001" operation="in_range">
- <duration id="duration1" years="1"/>
- </date_expression>
-</rule>
-----
-====
-
-.Equivalent expression
-====
-[source,XML]
-----
-<rule id="rule2" score="INFINITY">
- <date_expression id="date_expr2" operation="date_spec">
- <date_spec id="date_spec2" years="2005"/>
- </date_expression>
-</rule>
-----
-====
-
-.9am-5pm Monday-Friday
-====
-[source,XML]
--------
-<rule id="rule3" score="INFINITY">
- <date_expression id="date_expr3" operation="date_spec">
- <date_spec id="date_spec3" hours="9-16" weekdays="1-5"/>
- </date_expression>
-</rule>
--------
-====
-
-Please note that the +16+ matches up to +16:59:59+, as the numeric
-value (hour) still matches!
-
-.9am-6pm Monday through Friday or anytime Saturday
-====
-[source,XML]
--------
-<rule id="rule4" score="INFINITY" boolean-op="or">
- <date_expression id="date_expr4-1" operation="date_spec">
- <date_spec id="date_spec4-1" hours="9-16" weekdays="1-5"/>
- </date_expression>
- <date_expression id="date_expr4-2" operation="date_spec">
- <date_spec id="date_spec4-2" weekdays="6"/>
- </date_expression>
-</rule>
--------
-====
-
-.9am-5pm or 9pm-12am Monday through Friday
-====
-[source,XML]
--------
-<rule id="rule5" score="INFINITY" boolean-op="and">
- <rule id="rule5-nested1" score="INFINITY" boolean-op="or">
- <date_expression id="date_expr5-1" operation="date_spec">
- <date_spec id="date_spec5-1" hours="9-16"/>
- </date_expression>
- <date_expression id="date_expr5-2" operation="date_spec">
- <date_spec id="date_spec5-2" hours="21-23"/>
- </date_expression>
- </rule>
- <date_expression id="date_expr5-3" operation="date_spec">
- <date_spec id="date_spec5-3" weekdays="1-5"/>
- </date_expression>
-</rule>
--------
-====
-
-.Mondays in March 2005
-====
-[source,XML]
--------
-<rule id="rule6" score="INFINITY" boolean-op="and">
- <date_expression id="date_expr6-1" operation="date_spec">
- <date_spec id="date_spec6" weekdays="1"/>
- </date_expression>
- <date_expression id="date_expr6-2" operation="in_range"
- start="2005-03-01" end="2005-04-01"/>
-</rule>
--------
-====
-
-[NOTE]
-======
-Because no time is specified with the above dates, 00:00:00 is implied. This
-means that the range includes all of 2005-03-01 but none of 2005-04-01.
-You may wish to write +end="2005-03-31T23:59:59"+ to avoid confusion.
-======
-
-.A full moon on Friday the 13th
-=====
-[source,XML]
--------
-<rule id="rule7" score="INFINITY" boolean-op="and">
- <date_expression id="date_expr7" operation="date_spec">
- <date_spec id="date_spec7" weekdays="5" monthdays="13" moon="4"/>
- </date_expression>
-</rule>
--------
-=====
-
-== Resource Expressions ==
-
-An +rsc_expression+ is a rule condition based on a resource agent's properties.
-This rule is only valid within an +rsc_defaults+ or +op_defaults+ context. None
-of the matching attributes of +class+, +provider+, and +type+ are required. If
-one is omitted, all values of that attribute will match. For instance, omitting
-+type+ means every type will match.
-
-.Attributes of an rsc_expression Element
-[width="95%",cols="2m,<5",options="header",align="center"]
-|=========================================================
-
-|Field
-|Description
-
-|id
-|A unique name for the expression (required)
- indexterm:[XML attribute,id attribute,rsc_expression element]
- indexterm:[XML element,rsc_expression element,id attribute]
-
-|class
-|The standard name to be matched against resource agents
- indexterm:[XML attribute,class attribute,rsc_expression element]
- indexterm:[XML element,rsc_expression element,class attribute]
-
-|provider
-|If given, the vendor to be matched against resource agents. This
- only makes sense for agents using the OCF spec.
- indexterm:[XML attribute,provider attribute,rsc_expression element]
- indexterm:[XML element,rsc_expression element,provider attribute]
-
-|type
-|The name of the resource agent to be matched
- indexterm:[XML attribute,type attribute,rsc_expression element]
- indexterm:[XML element,rsc_expression element,type attribute]
-
-|=========================================================
-
-=== Example Resource-Based Expressions ===
-
-A small sample of how resource-based expressions can be used:
-
-.True for all ocf:heartbeat:IPaddr2 resources
-====
-[source,XML]
-----
-<rule id="rule1" score="INFINITY">
- <rsc_expression id="rule_expr1" class="ocf" provider="heartbeat" type="IPaddr2"/>
-</rule>
-----
-====
-
-.Provider doesn't apply to non-OCF resources
-====
-[source,XML]
-----
-<rule id="rule2" score="INFINITY">
- <rsc_expression id="rule_expr2" class="stonith" type="fence_xvm"/>
-</rule>
-----
-====
-
-== Operation Expressions ==
-
-An +op_expression+ is a rule condition based on an action of some resource
-agent. This rule is only valid within an +op_defaults+ context.
-
-.Attributes of an op_expression Element
-[width="95%",cols="2m,<5",options="header",align="center"]
-|=========================================================
-
-|Field
-|Description
-
-|id
-|A unique name for the expression (required)
- indexterm:[XML attribute,id attribute,op_expression element]
- indexterm:[XML element,op_expression element,id attribute]
-
-|name
-|The action name to match against. This can be any action supported by
- the resource agent; common values include +monitor+, +start+, and +stop+
- (required).
- indexterm:[XML attribute,name attribute,op_expression element]
- indexterm:[XML element,op_expression element,name attribute]
-
-|interval
-|The interval of the action to match against. If not given, only
- the name attribute will be used to match.
- indexterm:[XML attribute,interval attribute,op_expression element]
- indexterm:[XML element,op_expression element,interval attribute]
-
-|=========================================================
-
-=== Example Operation-Based Expressions ===
-
-A small sample of how operation-based expressions can be used:
-
-.True for all monitor actions
-====
-[source,XML]
-----
-<rule id="rule1" score="INFINITY">
- <op_expression id="rule_expr1" name="monitor"/>
-</rule>
-----
-====
-
-.True for all monitor actions with a 10 second interval
-====
-[source,XML]
-----
-<rule id="rule2" score="INFINITY">
- <op_expression id="rule_expr2" name="monitor" interval="10s"/>
-</rule>
-----
-====
-
-== Using Rules to Determine Resource Location ==
-indexterm:[Rule,Determine Resource Location]
-indexterm:[Resource,Location,Determine by Rules]
-
-A location constraint may contain one or more top-level rules. The cluster
-will act as if there is a separate location constraint for each rule that
-evaluates as true.
-
-Consider the following simple location constraint:
-
-.Prevent resource "webserver" from running on node3
-=====
-[source,XML]
--------
-<rsc_location id="ban-apache-on-node3" rsc="webserver"
- score="-INFINITY" node="node3"/>
--------
-=====
-
-The constraint can be more verbosely written using a rule:
-
-.Prevent resource "webserver" from running on node3 using rule
-=====
-[source,XML]
--------
-<rsc_location id="ban-apache-on-node3" rsc="webserver">
- <rule id="ban-apache-rule" score="-INFINITY">
- <expression id="ban-apache-expr" attribute="#uname"
- operation="eq" value="node3"/>
- </rule>
-</rsc_location>
--------
-=====
-
-The advantage of using the expanded form is that one could add more expressions
-(for example, limiting the constraint to certain days of the week), or activate
-the constraint by some node attribute other than node name.
-
-=== Location Rules Based on Other Node Properties ===
-
-The expanded form allows us to match on node properties other than its name.
-If we rated each machine's CPU power such that the cluster had the
-following nodes section:
-
-.A sample nodes section for use with score-attribute
-=====
-[source,XML]
--------
-<nodes>
- <node id="uuid1" uname="c001n01" type="normal">
- <instance_attributes id="uuid1-custom_attrs">
- <nvpair id="uuid1-cpu_mips" name="cpu_mips" value="1234"/>
- </instance_attributes>
- </node>
- <node id="uuid2" uname="c001n02" type="normal">
- <instance_attributes id="uuid2-custom_attrs">
- <nvpair id="uuid2-cpu_mips" name="cpu_mips" value="5678"/>
- </instance_attributes>
- </node>
-</nodes>
--------
-=====
-
-then we could prevent resources from running on underpowered machines with this rule:
-
-[source,XML]
--------
-<rule id="need-more-power-rule" score="-INFINITY">
- <expression id="need-more-power-expr" attribute="cpu_mips"
- operation="lt" value="3000"/>
-</rule>
--------
-
-=== Using +score-attribute+ Instead of +score+ ===
-
-When using +score-attribute+ instead of +score+, each node matched by
-the rule has its score adjusted differently, according to its value
-for the named node attribute. Thus, in the previous example, if a
-rule used +score-attribute="cpu_mips"+, +c001n01+ would have its
-preference to run the resource increased by +1234+ whereas +c001n02+
-would have its preference increased by +5678+.
-
-== Using Rules to Define Options ==
-
-Rules may be used to control a variety of options:
-
-* <<s-cluster-options,Cluster options>> (+cluster_property_set+ elements)
-* <<s-node-attributes,Node attributes>> (as +instance_attributes+ or
- +utilization+ elements inside a +node+ element)
-* <<s-resource-options,Resource options>> (as +utilization+, +meta_attributes+,
- or +instance_attributes+ elements inside a resource definition element or
- +op+ , +rsc_defaults+, +op_defaults+, or +template+ element)
-* <<s-operation-properties,Operation properties>> (+meta_attributes+
- inside an +op+ or +op_defaults+ element)
-
-=== Using Rules to Control Resource Options ===
-
-Often some cluster nodes will be different from their peers. Sometimes,
-these differences -- e.g. the location of a binary or the names of network
-interfaces -- require resources to be configured differently depending
-on the machine they're hosted on.
-
-By defining multiple +instance_attributes+ objects for the resource
-and adding a rule to each, we can easily handle these special cases.
-
-In the example below, +mySpecialRsc+ will use eth1 and port 9999 when
-run on +node1+, eth2 and port 8888 on +node2+ and default to eth0 and
-port 9999 for all other nodes.
-
-.Defining different resource options based on the node name
-=====
-[source,XML]
--------
-<primitive id="mySpecialRsc" class="ocf" type="Special" provider="me">
- <instance_attributes id="special-node1" score="3">
- <rule id="node1-special-case" score="INFINITY" >
- <expression id="node1-special-case-expr" attribute="#uname"
- operation="eq" value="node1"/>
- </rule>
- <nvpair id="node1-interface" name="interface" value="eth1"/>
- </instance_attributes>
- <instance_attributes id="special-node2" score="2" >
- <rule id="node2-special-case" score="INFINITY">
- <expression id="node2-special-case-expr" attribute="#uname"
- operation="eq" value="node2"/>
- </rule>
- <nvpair id="node2-interface" name="interface" value="eth2"/>
- <nvpair id="node2-port" name="port" value="8888"/>
- </instance_attributes>
- <instance_attributes id="defaults" score="1" >
- <nvpair id="default-interface" name="interface" value="eth0"/>
- <nvpair id="default-port" name="port" value="9999"/>
- </instance_attributes>
-</primitive>
--------
-=====
-
-The order in which +instance_attributes+ objects are evaluated is
-determined by their score (highest to lowest). If not supplied, score
-defaults to zero, and objects with an equal score are processed in
-listed order. If the +instance_attributes+ object has no rule
-or a +rule+ that evaluates to +true+, then for any parameter the resource does
-not yet have a value for, the resource will use the parameter values defined by
-the +instance_attributes+.
-
-For example, given the configuration above, if the resource is placed on node1:
-
-. +special-node1+ has the highest score (3) and so is evaluated first;
- its rule evaluates to +true+, so +interface+ is set to +eth1+.
-. +special-node2+ is evaluated next with score 2, but its rule evaluates to +false+,
- so it is ignored.
-. +defaults+ is evaluated last with score 1, and has no rule, so its values
- are examined; +interface+ is already defined, so the value here is not used,
- but +port+ is not yet defined, so +port+ is set to +9999+.
-
-=== Using Rules to Control Resource Defaults ===
-
-Rules can be used for resource and operation defaults. The following example
-illustrates how to set a different +resource-stickiness+ value during and
-outside work hours. This allows resources to automatically move back to their
-most preferred hosts, but at a time that (in theory) does not interfere with
-business activities.
-
-.Change +resource-stickiness+ during working hours
-=====
-[source,XML]
--------
-<rsc_defaults>
- <meta_attributes id="core-hours" score="2">
- <rule id="core-hour-rule" score="0">
- <date_expression id="nine-to-five-Mon-to-Fri" operation="date_spec">
- <date_spec id="nine-to-five-Mon-to-Fri-spec" hours="9-16" weekdays="1-5"/>
- </date_expression>
- </rule>
- <nvpair id="core-stickiness" name="resource-stickiness" value="INFINITY"/>
- </meta_attributes>
- <meta_attributes id="after-hours" score="1" >
- <nvpair id="after-stickiness" name="resource-stickiness" value="0"/>
- </meta_attributes>
-</rsc_defaults>
--------
-=====
-
-Rules may be used similarly in +instance_attributes+ or +utilization+ blocks.
-
-Any single block may directly contain only a single rule, but that rule may
-itself contain any number of rules.
-
-+rsc_expression+ and +op_expression+ blocks may additionally be used to set defaults
-on either a single resource or across an entire class of resources with a single
-rule. +rsc_expression+ may be used to select resource agents within both +rsc_defaults+
-and +op_defaults+, while +op_expression+ may only be used within +op_defaults+. If
-multiple rules succeed for a given resource agent, the last one specified will be
-the one that takes effect. As with any other rule, boolean operations may be used
-to make more complicated expressions.
-
-.Set all IPaddr2 resources to stopped
-=====
-[source,XML]
--------
-<rsc_defaults>
- <meta_attributes id="op-target-role">
- <rule id="op-target-role-rule" score="INFINITY">
- <rsc_expression id="op-target-role-expr" class="ocf" provider="heartbeat"
- type="IPaddr2"/>
- </rule>
- <nvpair id="op-target-role-nvpair" name="target-role" value="Stopped"/>
- </meta_attributes>
-</rsc_defaults>
--------
-=====
-
-.Set all monitor action timeouts to 7 seconds
-=====
-[source,XML]
--------
-<op_defaults>
- <meta_attributes id="op-monitor-defaults">
- <rule id="op-monitor-default-rule" score="INFINITY">
- <op_expression id="op-monitor-default-expr" name="monitor"/>
- </rule>
- <nvpair id="op-monitor-timeout" name="timeout" value="7s"/>
- </meta_attributes>
-</op_defaults>
--------
-=====
-
-.Set the monitor action timeout on all IPaddr2 resources with a given monitor interval to 8 seconds
-=====
-[source,XML]
--------
-<op_defaults>
- <meta_attributes id="op-monitor-and">
- <rule id="op-monitor-and-rule" score="INFINITY">
- <rsc_expression id="op-monitor-and-rsc-expr" class="ocf" provider="heartbeat"
- type="IPaddr2"/>
- <op_expression id="op-monitor-and-op-expr" name="monitor" interval="10s"/>
- </rule>
- <nvpair id="op-monitor-and-timeout" name="timeout" value="8s"/>
- </meta_attributes>
-</op_defaults>
--------
-=====
-
-=== Using Rules to Control Cluster Options ===
-indexterm:[Rule,Controlling Cluster Options]
-indexterm:[Cluster,Setting Options with Rules]
-
-Controlling cluster options is achieved in much the same manner as
-specifying different resource options on different nodes.
-
-The difference is that because they are cluster options, one cannot (or should
-not, because they won't work) use attribute-based expressions. The following
-example illustrates how to set +maintenance_mode+ during a scheduled
-maintenance window. This will keep the cluster running but not monitor, start,
-or stop resources during this time.
-
-.Schedule a maintenance window for 9 to 11 p.m. CDT Sept. 20, 2019
-=====
-[source,XML]
--------
-<crm_config>
- <cluster_property_set id="cib-bootstrap-options">
- <nvpair id="bootstrap-stonith-enabled" name="stonith-enabled" value="1"/>
- </cluster_property_set>
- <cluster_property_set id="normal-set" score="10">
- <nvpair id="normal-maintenance-mode" name="maintenance-mode" value="false"/>
- </cluster_property_set>
- <cluster_property_set id="maintenance-window-set" score="1000">
- <nvpair id="maintenance-nvpair1" name="maintenance-mode" value="true"/>
- <rule id="maintenance-rule1" score="INFINITY">
- <date_expression id="maintenance-date1" operation="in_range"
- start="2019-09-20 21:00:00 -05:00" end="2019-09-20 23:00:00 -05:00"/>
- </rule>
- </cluster_property_set>
-</crm_config>
--------
-=====
-
-[IMPORTANT]
-====
-The +cluster_property_set+ with an +id+ set to "cib-bootstrap-options" will
-'always' have the highest priority, regardless of any scores. Therefore,
-rules in another +cluster_property_set+ can never take effect for any
-properties listed in the bootstrap set.
-====
diff --git a/doc/Pacemaker_Explained/en-US/Ch-Status.txt b/doc/Pacemaker_Explained/en-US/Ch-Status.txt
deleted file mode 100644
index abd8d83c24..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ch-Status.txt
+++ /dev/null
@@ -1,373 +0,0 @@
-:compat-mode: legacy
-= Status -- Here be dragons =
-
-Most users never need to understand the contents of the status section
-and can be happy with the output from `crm_mon`.
-
-However for those with a curious inclination, this section attempts to
-provide an overview of its contents.
-
-== Node Status ==
-
-indexterm:[Node,Status]
-indexterm:[Status of a Node]
-
-In addition to the cluster's configuration, the CIB holds an
-up-to-date representation of each cluster node in the +status+ section.
-
-.A bare-bones status entry for a healthy node *cl-virt-1*
-======
-[source,XML]
------
- <node_state id="1" uname="cl-virt-1" in_ccm="true" crmd="online" crm-debug-origin="do_update_resource" join="member" expected="member">
- <transient_attributes id="1"/>
- <lrm id="1"/>
- </node_state>
------
-======
-
-Users are highly recommended _not_ to modify any part of a node's
-state _directly_. The cluster will periodically regenerate the entire
-section from authoritative sources, so any changes should be done
-with the tools appropriate to those sources.
-
-.Authoritative Sources for State Information
-[width="95%",cols="1m,<1",options="header",align="center"]
-|=========================================================
-
-| CIB Object | Authoritative Source
-
-|node_state|pacemaker-controld
-
-|transient_attributes|pacemaker-attrd
-
-|lrm|pacemaker-execd
-
-|=========================================================
-
-The fields used in the +node_state+ objects are named as they are
-largely for historical reasons and are rooted in Pacemaker's origins
-as the resource manager for the older Heartbeat project. They have remained
-unchanged to preserve compatibility with older versions.
-
-.Node Status Fields
-[width="95%",cols="1m,<4",options="header",align="center"]
-|=========================================================
-
-|Field |Description
-
-
-| id |
-indexterm:[id,Node Status]
-indexterm:[Node,Status,id]
-Unique identifier for the node. Corosync-based clusters use a numeric counter.
-
-| uname |
-indexterm:[uname,Node Status]
-indexterm:[Node,Status,uname]
-The node's name as known by the cluster
-
-| in_ccm |
-indexterm:[in_ccm,Node Status]
-indexterm:[Node,Status,in_ccm]
-Is the node a member at the cluster communication layer? Allowed values:
-+true+, +false+.
-
-| crmd |
-indexterm:[crmd,Node Status]
-indexterm:[Node,Status,crmd]
-Is the node a member at the pacemaker layer? Allowed values: +online+,
-+offline+.
-
-| crm-debug-origin |
-indexterm:[crm-debug-origin,Node Status]
-indexterm:[Node,Status,crm-debug-origin]
-The name of the source function that made the most recent change (for debugging
-purposes).
-
-| join |
-indexterm:[join,Node Status]
-indexterm:[Node,Status,join]
-Does the node participate in hosting resources? Allowed values: +down+,
-+pending+, +member+, +banned+.
-
-| expected |
-indexterm:[expected,Node Status]
-indexterm:[Node,Status,expected]
-Expected value for +join+.
-
-|=========================================================
-
-The cluster uses these fields to determine whether, at the node level, the
-node is healthy or is in a failed state and needs to be fenced.
-
-== Transient Node Attributes ==
-
-Like regular <<s-node-attributes,node attributes>>, the name/value
-pairs listed in the +transient_attributes+ section help to describe the
-node. However they are forgotten by the cluster when the node goes offline.
-This can be useful, for instance, when you want a node to be in standby mode
-(not able to run resources) just until the next reboot.
-
-In addition to any values the administrator sets, the cluster will
-also store information about failed resources here.
-
-.A set of transient node attributes for node *cl-virt-1*
-======
-[source,XML]
------
-<transient_attributes id="cl-virt-1">
- <instance_attributes id="status-cl-virt-1">
- <nvpair id="status-cl-virt-1-pingd" name="pingd" value="3"/>
- <nvpair id="status-cl-virt-1-probe_complete" name="probe_complete" value="true"/>
- <nvpair id="status-cl-virt-1-fail-count-pingd:0.monitor_30000" name="fail-count-pingd:0#monitor_30000" value="1"/>
- <nvpair id="status-cl-virt-1-last-failure-pingd:0" name="last-failure-pingd:0" value="1239009742"/>
- </instance_attributes>
-</transient_attributes>
------
-======
-
-In the above example, we can see that a monitor on the +pingd:0+ resource has
-failed once, at 09:22:22 UTC 6 April 2009.
-footnote:[
-You can use the standard `date` command to print a human-readable version of
-any seconds-since-epoch value, for example `date -d @1239009742`.
-]
-We also see that the node is connected to three *pingd* peers and that
-all known resources have been checked for on this machine (+probe_complete+).
-
-== Operation History ==
-indexterm:[Operation History]
-
-A node's resource history is held in the +lrm_resources+ tag (a child
-of the +lrm+ tag). The information stored here includes enough
-information for the cluster to stop the resource safely if it is
-removed from the +configuration+ section. Specifically, the resource's
-+id+, +class+, +type+ and +provider+ are stored.
-
-.A record of the +apcstonith+ resource
-======
-[source,XML]
-<lrm_resource id="apcstonith" type="apcmastersnmp" class="stonith"/>
-======
-
-Additionally, we store the last job for every combination of
-+resource+, +action+ and +interval+. The concatenation of the values in
-this tuple are used to create the id of the +lrm_rsc_op+ object.
-
-.Contents of an +lrm_rsc_op+ job
-[width="95%",cols="2m,<5",options="header",align="center"]
-|=========================================================
-
-|Field
-|Description
-
-| id |
-indexterm:[id,Action Status]
-indexterm:[Action,Status,id]
-
-Identifier for the job constructed from the resource's +id+,
-+operation+ and +interval+.
-
-| call-id |
-indexterm:[call-id,Action Status]
-indexterm:[Action,Status,call-id]
-
-The job's ticket number. Used as a sort key to determine the order in
-which the jobs were executed.
-
-| operation |
-indexterm:[operation,Action Status]
-indexterm:[Action,Status,operation]
-
-The action the resource agent was invoked with.
-
-| interval |
-indexterm:[interval,Action Status]
-indexterm:[Action,Status,interval]
-
-The frequency, in milliseconds, at which the operation will be
-repeated. A one-off job is indicated by 0.
-
-| op-status |
-indexterm:[op-status,Action Status]
-indexterm:[Action,Status,op-status]
-
-The job's status. Generally this will be either 0 (done) or -1
-(pending). Rarely used in favor of +rc-code+.
-
-| rc-code |
-indexterm:[rc-code,Action Status]
-indexterm:[Action,Status,rc-code]
-
-The job's result. Refer to the 'Resource Agents' chapter of 'Pacemaker
-Administration' for details on what the values here mean and how they are
-interpreted.
-
-| last-run |
-indexterm:[last-run,Action Status]
-indexterm:[Action,Status,last-run]
-
-Machine-local date/time, in seconds since epoch,
-at which the job was executed. For diagnostic purposes.
-
-| last-rc-change |
-indexterm:[last-rc-change,Action Status]
-indexterm:[Action,Status,last-rc-change]
-
-Machine-local date/time, in seconds since epoch,
-at which the job first returned the current value of +rc-code+.
-For diagnostic purposes.
-
-| exec-time |
-indexterm:[exec-time,Action Status]
-indexterm:[Action,Status,exec-time]
-
-Time, in milliseconds, that the job was running for.
-For diagnostic purposes.
-
-| queue-time |
-indexterm:[queue-time,Action Status]
-indexterm:[Action,Status,queue-time]
-
-Time, in seconds, that the job was queued for in the LRMd.
-For diagnostic purposes.
-
-| crm_feature_set |
-indexterm:[crm_feature_set,Action Status]
-indexterm:[Action,Status,crm_feature_set]
-
-The version which this job description conforms to. Used when
-processing +op-digest+.
-
-| transition-key |
-indexterm:[transition-key,Action Status]
-indexterm:[Action,Status,transition-key]
-
-A concatenation of the job's graph action number, the graph number,
-the expected result and the UUID of the controller instance that scheduled
-it. This is used to construct +transition-magic+ (below).
-
-| transition-magic |
-indexterm:[transition-magic,Action Status]
-indexterm:[Action,Status,transition-magic]
-
-A concatenation of the job's +op-status+, +rc-code+ and
-+transition-key+. Guaranteed to be unique for the life of the cluster
-(which ensures it is part of CIB update notifications) and contains
-all the information needed for the controller to correctly analyze and
-process the completed job. Most importantly, the decomposed elements
-tell the controller if the job entry was expected and whether it failed.
-
-| op-digest |
-indexterm:[op-digest,Action Status]
-indexterm:[Action,Status,op-digest]
-
-An MD5 sum representing the parameters passed to the job. Used to
-detect changes to the configuration, to restart resources if
-necessary.
-
-| crm-debug-origin |
-indexterm:[crm-debug-origin,Action Status]
-indexterm:[Action,Status,crm-debug-origin]
-
-The origin of the current values.
-For diagnostic purposes.
-
-|=========================================================
-
-=== Simple Operation History Example ===
-
-.A monitor operation (determines current state of the +apcstonith+ resource)
-======
-[source,XML]
------
-<lrm_resource id="apcstonith" type="apcmastersnmp" class="stonith">
- <lrm_rsc_op id="apcstonith_monitor_0" operation="monitor" call-id="2"
- rc-code="7" op-status="0" interval="0"
- crm-debug-origin="do_update_resource" crm_feature_set="3.0.1"
- op-digest="2e3da9274d3550dc6526fb24bfcbcba0"
- transition-key="22:2:7:2668bbeb-06d5-40f9-936d-24cb7f87006a"
- transition-magic="0:7;22:2:7:2668bbeb-06d5-40f9-936d-24cb7f87006a"
- last-run="1239008085" last-rc-change="1239008085" exec-time="10" queue-time="0"/>
-</lrm_resource>
------
-======
-
-In the above example, the job is a non-recurring monitor operation
-often referred to as a "probe" for the +apcstonith+ resource.
-
-The cluster schedules probes for every configured resource on a node when
-the node first starts, in order to determine the resource's current state
-before it takes any further action.
-
-From the +transition-key+, we can see that this was the 22nd action of
-the 2nd graph produced by this instance of the controller
-(2668bbeb-06d5-40f9-936d-24cb7f87006a).
-
-The third field of the +transition-key+ contains a 7, which indicates
-that the job expects to find the resource inactive. By looking at the +rc-code+
-property, we see that this was the case.
-
-As that is the only job recorded for this node, we can conclude that
-the cluster started the resource elsewhere.
-
-=== Complex Operation History Example ===
-
-.Resource history of a +pingd+ clone with multiple jobs
-======
-[source,XML]
------
-<lrm_resource id="pingd:0" type="pingd" class="ocf" provider="pacemaker">
- <lrm_rsc_op id="pingd:0_monitor_30000" operation="monitor" call-id="34"
- rc-code="0" op-status="0" interval="30000"
- crm-debug-origin="do_update_resource" crm_feature_set="3.0.1"
- transition-key="10:11:0:2668bbeb-06d5-40f9-936d-24cb7f87006a"
- ...
- last-run="1239009741" last-rc-change="1239009741" exec-time="10" queue-time="0"/>
- <lrm_rsc_op id="pingd:0_stop_0" operation="stop"
- crm-debug-origin="do_update_resource" crm_feature_set="3.0.1" call-id="32"
- rc-code="0" op-status="0" interval="0"
- transition-key="11:11:0:2668bbeb-06d5-40f9-936d-24cb7f87006a"
- ...
- last-run="1239009741" last-rc-change="1239009741" exec-time="10" queue-time="0"/>
- <lrm_rsc_op id="pingd:0_start_0" operation="start" call-id="33"
- rc-code="0" op-status="0" interval="0"
- crm-debug-origin="do_update_resource" crm_feature_set="3.0.1"
- transition-key="31:11:0:2668bbeb-06d5-40f9-936d-24cb7f87006a"
- ...
- last-run="1239009741" last-rc-change="1239009741" exec-time="10" queue-time="0" />
- <lrm_rsc_op id="pingd:0_monitor_0" operation="monitor" call-id="3"
- rc-code="0" op-status="0" interval="0"
- crm-debug-origin="do_update_resource" crm_feature_set="3.0.1"
- transition-key="23:2:7:2668bbeb-06d5-40f9-936d-24cb7f87006a"
- ...
- last-run="1239008085" last-rc-change="1239008085" exec-time="20" queue-time="0"/>
- </lrm_resource>
------
-======
-
-When more than one job record exists, it is important to first sort
-them by +call-id+ before interpreting them.
-
-Once sorted, the above example can be summarized as:
-
-. A non-recurring monitor operation returning 7 (not running), with a +call-id+ of 3
-. A stop operation returning 0 (success), with a +call-id+ of 32
-. A start operation returning 0 (success), with a +call-id+ of 33
-. A recurring monitor returning 0 (success), with a +call-id+ of 34
-
-
-The cluster processes each job record to build up a picture of the
-resource's state. After the first and second entries, it is
-considered stopped, and after the third it considered active.
-
-Based on the last operation, we can tell that the resource is
-currently active.
-
-Additionally, from the presence of a +stop+ operation with a lower
-+call-id+ than that of the +start+ operation, we can conclude that the
-resource has been restarted. Specifically this occurred as part of
-actions 11 and 31 of transition 11 from the controller instance with the key
-+2668bbeb...+. This information can be helpful for locating the
-relevant section of the logs when looking for the source of a failure.
diff --git a/doc/Pacemaker_Explained/en-US/Ch-Utilization.txt b/doc/Pacemaker_Explained/en-US/Ch-Utilization.txt
deleted file mode 100644
index 4a938ad272..0000000000
--- a/doc/Pacemaker_Explained/en-US/Ch-Utilization.txt
+++ /dev/null
@@ -1,230 +0,0 @@
-:compat-mode: legacy
-= Utilization and Placement Strategy =
-
-[[s-utilization]]
-
-Pacemaker decides where to place a resource according to the resource
-allocation scores on every node. The resource will be allocated to the
-node where the resource has the highest score.
-
-If the resource allocation scores on all the nodes are equal, by the default
-placement strategy, Pacemaker will choose a node with the least number of
-allocated resources for balancing the load. If the number of resources on each
-node is equal, the first eligible node listed in the CIB will be chosen to run
-the resource.
-
-Often, in real-world situations, different resources use significantly
-different proportions of a node's capacities (memory, I/O, etc.).
-We cannot balance the load ideally just according to the number of resources
-allocated to a node. Besides, if resources are placed such that their combined
-requirements exceed the provided capacity, they may fail to start completely or
-run with degraded performance.
-
-To take these factors into account, Pacemaker allows you to configure:
-
-. The capacity a certain node provides.
-. The capacity a certain resource requires.
-. An overall strategy for placement of resources.
-
-== Utilization attributes ==
-
-To configure the capacity that a node provides or a resource requires,
-you can use 'utilization attributes' in +node+ and +resource+ objects.
-You can name utilization attributes according to your preferences and define as
-many name/value pairs as your configuration needs. However, the attributes'
-values must be integers.
-
-.Specifying CPU and RAM capacities of two nodes
-====
-[source,XML]
-----
-<node id="node1" type="normal" uname="node1">
- <utilization id="node1-utilization">
- <nvpair id="node1-utilization-cpu" name="cpu" value="2"/>
- <nvpair id="node1-utilization-memory" name="memory" value="2048"/>
- </utilization>
-</node>
-<node id="node2" type="normal" uname="node2">
- <utilization id="node2-utilization">
- <nvpair id="node2-utilization-cpu" name="cpu" value="4"/>
- <nvpair id="node2-utilization-memory" name="memory" value="4096"/>
- </utilization>
-</node>
-----
-====
-
-.Specifying CPU and RAM consumed by several resources
-====
-[source,XML]
-----
-<primitive id="rsc-small" class="ocf" provider="pacemaker" type="Dummy">
- <utilization id="rsc-small-utilization">
- <nvpair id="rsc-small-utilization-cpu" name="cpu" value="1"/>
- <nvpair id="rsc-small-utilization-memory" name="memory" value="1024"/>
- </utilization>
-</primitive>
-<primitive id="rsc-medium" class="ocf" provider="pacemaker" type="Dummy">
- <utilization id="rsc-medium-utilization">
- <nvpair id="rsc-medium-utilization-cpu" name="cpu" value="2"/>
- <nvpair id="rsc-medium-utilization-memory" name="memory" value="2048"/>
- </utilization>
-</primitive>
-<primitive id="rsc-large" class="ocf" provider="pacemaker" type="Dummy">
- <utilization id="rsc-large-utilization">
- <nvpair id="rsc-large-utilization-cpu" name="cpu" value="3"/>
- <nvpair id="rsc-large-utilization-memory" name="memory" value="3072"/>
- </utilization>
-</primitive>
-----
-====
-
-A node is considered eligible for a resource if it has sufficient free
-capacity to satisfy the resource's requirements. The nature of the required
-or provided capacities is completely irrelevant to Pacemaker -- it just makes
-sure that all capacity requirements of a resource are satisfied before placing
-a resource to a node.
-
-== Placement Strategy ==
-
-After you have configured the capacities your nodes provide and the
-capacities your resources require, you need to set the +placement-strategy+
-in the global cluster options, otherwise the capacity configurations have
-'no effect'.
-
-Four values are available for the +placement-strategy+:
-
-+default+::
-
-Utilization values are not taken into account at all.
-Resources are allocated according to allocation scores. If scores are equal,
-resources are evenly distributed across nodes.
-
-+utilization+::
-
-Utilization values are taken into account 'only' when deciding whether a node
-is considered eligible (i.e. whether it has sufficient free capacity to satisfy
-the resource's requirements). Load-balancing is still done based on the
-number of resources allocated to a node.
-
-+balanced+::
-
-Utilization values are taken into account when deciding whether a node
-is eligible to serve a resource 'and' when load-balancing, so an attempt is
-made to spread the resources in a way that optimizes resource performance.
-
-+minimal+::
-
-Utilization values are taken into account 'only' when deciding whether a node
-is eligible to serve a resource. For load-balancing, an attempt is made to
-concentrate the resources on as few nodes as possible, thereby enabling
-possible power savings on the remaining nodes.
-
-
-Set +placement-strategy+ with `crm_attribute`:
-----
-# crm_attribute --name placement-strategy --update balanced
-----
-
-Now Pacemaker will ensure the load from your resources will be distributed
-evenly throughout the cluster, without the need for convoluted sets of
-colocation constraints.
-
-== Allocation Details ==
-
-=== Which node is preferred to get consumed first when allocating resources? ===
-
-- The node with the highest node weight gets consumed first. Node weight
- is a score maintained by the cluster to represent node health.
-
-- If multiple nodes have the same node weight:
- * If +placement-strategy+ is +default+ or +utilization+,
- the node that has the least number of allocated resources gets consumed first.
- ** If their numbers of allocated resources are equal,
- the first eligible node listed in the CIB gets consumed first.
-
- * If +placement-strategy+ is +balanced+,
- the node that has the most free capacity gets consumed first.
- ** If the free capacities of the nodes are equal,
- the node that has the least number of allocated resources gets consumed first.
- *** If their numbers of allocated resources are equal,
- the first eligible node listed in the CIB gets consumed first.
-
- * If +placement-strategy+ is +minimal+,
- the first eligible node listed in the CIB gets consumed first.
-
-=== Which node has more free capacity? ===
-
-If only one type of utilization attribute has been defined, free capacity
-is a simple numeric comparison.
-
-If multiple types of utilization attributes have been defined, then
-the node that is numerically highest in the the most attribute types
-has the most free capacity. For example:
-
-- If +nodeA+ has more free +cpus+, and +nodeB+ has more free +memory+,
- then their free capacities are equal.
-
-- If +nodeA+ has more free +cpus+, while +nodeB+ has more free +memory+ and +storage+,
- then +nodeB+ has more free capacity.
-
-=== Which resource is preferred to be assigned first? ===
-
-- The resource that has the highest +priority+ (see <<s-resource-options>>) gets allocated first.
-
-- If their priorities are equal, check whether they are already running. The
- resource that has the highest score on the node where it's running gets allocated
- first, to prevent resource shuffling.
-
-- If the scores above are equal or the resources are not running, the resource has
- the highest score on the preferred node gets allocated first.
-
-- If the scores above are equal, the first runnable resource listed in the CIB
- gets allocated first.
-
-
-== Limitations and Workarounds ==
-
-The type of problem Pacemaker is dealing with here is known as the
-http://en.wikipedia.org/wiki/Knapsack_problem[knapsack problem] and falls into
-the http://en.wikipedia.org/wiki/NP-complete[NP-complete] category of computer
-science problems -- a fancy way of saying "it takes a really long time
-to solve".
-
-Clearly in a HA cluster, it's not acceptable to spend minutes, let alone hours
-or days, finding an optimal solution while services remain unavailable.
-
-So instead of trying to solve the problem completely, Pacemaker uses a
-'best effort' algorithm for determining which node should host a particular
-service. This means it arrives at a solution much faster than traditional
-linear programming algorithms, but by doing so at the price of leaving some
-services stopped.
-
-In the contrived example at the start of this chapter:
-
-- +rsc-small+ would be allocated to +node1+
-- +rsc-medium+ would be allocated to +node2+
-- +rsc-large+ would remain inactive
-
-Which is not ideal.
-
-There are various approaches to dealing with the limitations of
-pacemaker's placement strategy:
-
-Ensure you have sufficient physical capacity.::
-
-It might sound obvious, but if the physical capacity of your nodes is (close to)
-maxed out by the cluster under normal conditions, then failover isn't going to
-go well. Even without the utilization feature, you'll start hitting timeouts and
-getting secondary failures.
-
-Build some buffer into the capabilities advertised by the nodes.::
-
-Advertise slightly more resources than we physically have, on the (usually valid)
-assumption that a resource will not use 100% of the configured amount of
-CPU, memory and so forth 'all' the time. This practice is sometimes called 'overcommit'.
-
-Specify resource priorities.::
-
-If the cluster is going to sacrifice services, it should be the ones you care
-about (comparatively) the least. Ensure that resource priorities are properly set
-so that your most important resources are scheduled first.
diff --git a/doc/Pacemaker_Explained/en-US/Pacemaker_Explained.ent b/doc/Pacemaker_Explained/en-US/Pacemaker_Explained.ent
deleted file mode 100644
index 3cf0609843..0000000000
--- a/doc/Pacemaker_Explained/en-US/Pacemaker_Explained.ent
+++ /dev/null
@@ -1,4 +0,0 @@
-<!ENTITY PRODUCT "Pacemaker">
-<!ENTITY BOOKID "Pacemaker_Explained">
-<!ENTITY YEAR "2009-2020">
-<!ENTITY HOLDER "The Pacemaker project contributors">
diff --git a/doc/Pacemaker_Explained/en-US/Pacemaker_Explained.xml b/doc/Pacemaker_Explained/en-US/Pacemaker_Explained.xml
deleted file mode 100644
index e56c8e946d..0000000000
--- a/doc/Pacemaker_Explained/en-US/Pacemaker_Explained.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE Book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<book>
- <xi:include href="Book_Info.xml" xmlns:xi="http://www.w3.org/2001/XInclude"></xi:include>
- <xi:include href="Preface.xml" xmlns:xi="http://www.w3.org/2001/XInclude"></xi:include>
-
- <xi:include href="Ch-Intro.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Options.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Nodes.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Resources.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Constraints.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Fencing.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Alerts.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Rules.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Advanced-Options.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Advanced-Resources.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Reusing-Configuration.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Utilization.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-ACLs.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Status.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Ch-Multi-site-Clusters.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
-
- <xi:include href="Ap-Samples.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Revision_History.xml" xmlns:xi="http://www.w3.org/2001/XInclude"></xi:include>
- <index></index>
-</book>
diff --git a/doc/Pacemaker_Explained/en-US/Preface.xml b/doc/Pacemaker_Explained/en-US/Preface.xml
deleted file mode 100644
index e63c4be5b2..0000000000
--- a/doc/Pacemaker_Explained/en-US/Preface.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<preface><title>Preface</title>
- <xi:include href="Common_Content/Conventions.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- <xi:include href="Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude">
- <xi:fallback xmlns:xi="http://www.w3.org/2001/XInclude">
- <xi:include href="Common_Content/Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- </xi:fallback>
- </xi:include>
-</preface>
diff --git a/doc/Pacemaker_Explained/en-US/Revision_History.xml b/doc/Pacemaker_Explained/en-US/Revision_History.xml
deleted file mode 100644
index 31edf194f8..0000000000
--- a/doc/Pacemaker_Explained/en-US/Revision_History.xml
+++ /dev/null
@@ -1,263 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<appendix>
- <!-- see comment in Book_Info.xml for revision numbering -->
- <title>Revision History</title>
- <simpara>
- <revhistory>
- <revision>
- <revnumber>1-0</revnumber>
- <date>19 Oct 2009</date>
- <author><firstname>Andrew</firstname><surname>Beekhof</surname><email>andrew@beekhof.net</email></author>
- <revdescription><simplelist><member>Import from Pages.app</member></simplelist></revdescription>
- </revision>
- <revision>
- <revnumber>2-0</revnumber>
- <date>26 Oct 2009</date>
- <author><firstname>Andrew</firstname><surname>Beekhof</surname><email>andrew@beekhof.net</email></author>
- <revdescription><simplelist><member>Cleanup and reformatting of docbook xml complete</member></simplelist></revdescription>
- </revision>
- <revision>
- <revnumber>3-0</revnumber>
- <date>Tue Nov 12 2009</date>
- <author><firstname>Andrew</firstname><surname>Beekhof</surname><email>andrew@beekhof.net</email></author>
- <revdescription>
- <simplelist>
- <member>Split book into chapters and pass validation</member>
- <member>Re-organize book for use with <ulink url="https://fedorahosted.org/publican/">Publican</ulink></member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>3-1</revnumber>
- <date>Tue Nov 12 2009</date>
- <author>
- <firstname>Tanja</firstname><surname>Roth</surname>
- <affiliation><orgname>SUSE</orgname></affiliation>
- <email>taroth@suse.com</email>
- </author>
- <author>
- <firstname>Lars</firstname><surname>Marowsky-Bree</surname>
- <affiliation><orgname>SUSE</orgname></affiliation>
- <email>lmb@suse.com</email>
- </author>
- <author>
- <firstname>Yan</firstname><surname>Gao</surname>
- <affiliation><orgname>SUSE</orgname></affiliation>
- <email>ygao@suse.com</email>
- </author>
- <author>
- <firstname>Thomas</firstname><surname>Schraitle</surname>
- <affiliation><orgname>SUSE</orgname></affiliation>
- <email>toms@suse.com</email>
- </author>
- <author>
- <firstname>Dejan</firstname><surname>Muhamedagic</surname>
- <affiliation><orgname>SUSE</orgname></affiliation>
- <email>dmuhamedagic@suse.com</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Utilization chapter</member>
- <member>Resource Templates chapter</member>
- <member>Multi-Site Clusters chapter</member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>3-2</revnumber>
- <date>Fri Nov 4 2011</date>
- <author>
- <firstname>Philipp</firstname><surname>Marek</surname>
- <affiliation><orgname>LINBit</orgname></affiliation>
- <email>philipp.marek@linbit.com</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Extensive style, formatting, and indexing updates</member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>4-0</revnumber>
- <date>Mon Oct 8 2012</date>
- <author><firstname>Andrew</firstname><surname>Beekhof</surname><email>andrew@beekhof.net</email></author>
- <revdescription>
- <simplelist>
- <member>
- Converted to <ulink url="http://www.methods.co.nz/asciidoc">asciidoc</ulink>
- (which is converted to docbook for use with
- <ulink url="https://fedorahosted.org/publican/">Publican</ulink>)
- </member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>5-0</revnumber>
- <date>Mon Feb 23 2015</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <revdescription>
- <simplelist>
- <member>
- Update for clarity, stylistic consistency and current command-line syntax
- </member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>6-0</revnumber>
- <date>Tue Dec 8 2015</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <revdescription>
- <simplelist>
- <member>
- Update for Pacemaker 1.1.14
- </member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>7-0</revnumber>
- <date>Tue May 3 2016</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <revdescription>
- <simplelist>
- <member>
- Update for Pacemaker 1.1.15
- </member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>7-1</revnumber>
- <date>Fri Oct 28 2016</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <revdescription>
- <simplelist>
- <member>
- Overhaul upgrade documentation, and document node health strategies
- </member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>8-0</revnumber>
- <date>Tue Oct 25 2016</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <revdescription>
- <simplelist>
- <member>
- Update for Pacemaker 1.1.16
- </member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>9-0</revnumber>
- <date>Tue Jul 11 2017</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <revdescription>
- <simplelist>
- <member>
- Update for Pacemaker 1.1.17
- </member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>10-0</revnumber>
- <date>Fri Oct 6 2017</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <revdescription>
- <simplelist>
- <member>
- Update for Pacemaker 1.1.18
- </member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>11-0</revnumber>
- <date>Fri Jan 12 2018</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <revdescription>
- <simplelist>
- <member>
- Update for Pacemaker 2.0.0
- </member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>12-0</revnumber>
- <date>Mon Jan 28 2019</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <author><firstname>Reid</firstname><surname>Wahl</surname><email>nwahl@redhat.com</email></author>
- <author><firstname>Jan</firstname><surname>Pokorný</surname><email>jpokorny@redhat.com</email></author>
- <revdescription>
- <simplelist>
- <member>
- Update for Pacemaker 2.0.1, remove "Further Reading" and "FAQ" sections,
- and add minor clarifications and reformatting
- </member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>12-1</revnumber>
- <date>Mon May 13 2019</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <author><firstname>Maciej</firstname><surname>Sobkowiak</surname><email>msobkowiak@egnyte.com</email></author>
- <revdescription>
- <simplelist>
- <member>
- Document podman support, cluster-name cluster option, and new
- HealthIOWait agent, with other minor clarifications and
- corrections
- </member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>12-2</revnumber>
- <date>Wed Jun 19 2019</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <revdescription>
- <simplelist>
- <member>
- Add chapter for ACLs
- </member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>13-0</revnumber>
- <date>Tue Oct 15 2019</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email></author>
- <revdescription>
- <simplelist>
- <member>Overhaul fencing, rules, and constraints chapters,
- elaborate on various options, and update for Pacemaker 2.0.3
- </member>
- </simplelist>
- </revdescription>
- </revision>
- <revision>
- <revnumber>13-1</revnumber>
- <date>Wed Apr 1 2020</date>
- <author>
- <firstname>Yan</firstname><surname>Gao</surname>
- <affiliation><orgname>SUSE</orgname></affiliation>
- <email>ygao@suse.com</email>
- </author>
- <revdescription>
- <simplelist>
- <member>Document new feature priority-fencing-delay</member>
- </simplelist>
- </revdescription>
- </revision>
- </revhistory>
- </simpara>
-</appendix>
diff --git a/doc/Pacemaker_Explained/en-US/images b/doc/Pacemaker_Explained/en-US/images
deleted file mode 120000
index 963300dd95..0000000000
--- a/doc/Pacemaker_Explained/en-US/images
+++ /dev/null
@@ -1 +0,0 @@
-../../shared/en-US/images
\ No newline at end of file
diff --git a/doc/Pacemaker_Explained/publican.cfg.in b/doc/Pacemaker_Explained/publican.cfg.in
deleted file mode 100644
index 071f29ac30..0000000000
--- a/doc/Pacemaker_Explained/publican.cfg.in
+++ /dev/null
@@ -1,14 +0,0 @@
-# Config::Simple 4.59
-# Tue Nov 10 22:28:47 2009
-
-docname: Pacemaker_Explained
-version: @PACKAGE_SERIES@
-xml_lang: en-US
-#edition: 1
-type: Book
-brand: @PUBLICAN_BRAND@
-product: Pacemaker
-
-chunk_first: 0
-chunk_section_depth: 3
-generate_section_toc_level: 4
diff --git a/doc/Pacemaker_Remote/en-US/Author_Group.xml b/doc/Pacemaker_Remote/en-US/Author_Group.xml
deleted file mode 100644
index ff907feee5..0000000000
--- a/doc/Pacemaker_Remote/en-US/Author_Group.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<authorgroup>
- <author>
- <affiliation>
- <orgname>Written by the Pacemaker project contributors</orgname>
- </affiliation>
- </author>
-</authorgroup>
diff --git a/doc/Pacemaker_Remote/en-US/Book_Info.xml b/doc/Pacemaker_Remote/en-US/Book_Info.xml
deleted file mode 100644
index 253639cd25..0000000000
--- a/doc/Pacemaker_Remote/en-US/Book_Info.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE bookinfo PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-<!ENTITY % BOOK_ENTITIES SYSTEM "Pacemaker_Remote.ent">
-%BOOK_ENTITIES;
-]>
-<bookinfo id="book-Pacemaker_Remote-Pacemaker_Remote">
- <title>Pacemaker Remote</title>
- <subtitle>Scaling High Availablity Clusters</subtitle>
- <!--
- EDITION-PUBSNUMBER should match REVNUMBER in Revision_History.xml.
- Increment EDITION when the syntax of the documented software
- changes (OS, pacemaker, corosync, pcs), and PUBSNUMBER for
- simple textual changes (corrections, translations, etc.).
- -->
- <edition>7</edition>
- <pubsnumber>3</pubsnumber>
- <abstract>
- <para>
- The document exists as both a reference and deployment guide for the Pacemaker Remote service.
- </para>
- <para>
- The example commands in this document will use:
- <orderedlist>
- <listitem>
- <para>
- &DISTRO; &DISTRO_VERSION; as the host operating system
- </para>
- </listitem>
- <listitem>
- <para>
- Pacemaker Remote to perform resource management within guest nodes and remote nodes
- </para>
- </listitem>
- <listitem>
- <para>
- KVM for virtualization
- </para>
- </listitem>
- <listitem>
- <para>
- libvirt to manage guest nodes
- </para>
- </listitem>
- <listitem>
- <para>
- Corosync to provide messaging and membership services on cluster nodes
- </para>
- </listitem>
- <listitem>
- <para>
- Pacemaker 1.1.16
- <footnote><para>While this guide is part of the document set for
- Pacemaker 2.0, it demonstrates the version available in
- the standard &DISTRO; repositories</para></footnote>
- to perform resource management on cluster nodes
- </para>
- </listitem>
- <listitem>
- <para>
- pcs as the cluster configuration toolset
- </para>
- </listitem>
- </orderedlist>
- The concepts are the same for other distributions,
- virtualization platforms, toolsets, and messaging
- layers, and should be easily adaptable.
- </para>
- </abstract>
- <corpauthor>
- <inlinemediaobject>
- <imageobject>
- <imagedata fileref="Common_Content/images/title_logo.svg" format="SVG" />
- </imageobject>
- </inlinemediaobject>
- </corpauthor>
- <xi:include href="Common_Content/Legal_Notice.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Author_Group.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-</bookinfo>
diff --git a/doc/Pacemaker_Remote/en-US/Ch-Alternatives.txt b/doc/Pacemaker_Remote/en-US/Ch-Alternatives.txt
deleted file mode 100644
index 5765f0846e..0000000000
--- a/doc/Pacemaker_Remote/en-US/Ch-Alternatives.txt
+++ /dev/null
@@ -1,77 +0,0 @@
-:compat-mode: legacy
-= Alternative Configurations =
-
-These alternative configurations may be appropriate in limited cases, such as a
-test cluster, but are not the best method in most situations. They are
-presented here for completeness and as an example of Pacemaker's flexibility
-to suit your needs.
-
-== Virtual Machines as Cluster Nodes ==
-
-The preferred use of virtual machines in a Pacemaker cluster is as a
-cluster resource, whether opaque or as a guest node. However, it is
-possible to run the full cluster stack on a virtual node instead.
-
-This is commonly used to set up test environments; a single physical host
-(that does not participate in the cluster) runs two or more virtual machines,
-all running the full cluster stack. This can be used to simulate a
-larger cluster for testing purposes.
-
-In a production environment, fencing becomes more complicated, especially
-if the underlying hosts run any services besides the clustered VMs.
-If the VMs are not guaranteed a minimum amount of host resources,
-CPU and I/O contention can cause timing issues for cluster components.
-
-Another situation where this approach is sometimes used is when
-the cluster owner leases the VMs from a provider and does not have
-direct access to the underlying host. The main concerns in this case
-are proper fencing (usually via a custom resource agent that communicates
-with the provider's APIs) and maintaining a static IP address between reboots,
-as well as resource contention issues.
-
-== Virtual Machines as Remote Nodes ==
-
-Virtual machines may be configured following the process for remote nodes
-rather than guest nodes (i.e., using an *ocf:pacemaker:remote* resource
-rather than letting the cluster manage the VM directly).
-
-This is mainly useful in testing, to use a single physical host to simulate a
-larger cluster involving remote nodes. Pacemaker's Cluster Test Suite (CTS)
-uses this approach to test remote node functionality.
-
-== Containers as Guest Nodes ==
-
-Containers,footnote:[https://en.wikipedia.org/wiki/Operating-system-level_virtualization]
-and in particular Linux containers (LXC) and Docker, have become a popular
-method of isolating services in a resource-efficient manner.
-
-The preferred means of integrating containers into Pacemaker is as a
-cluster resource, whether opaque or using Pacemaker's 'bundle' resource type.
-
-However, it is possible to run `pacemaker_remote` inside a container,
-following the process for guest nodes. This is not recommended but can
-be useful, for example, in testing scenarios, to simulate a large number of
-guest nodes.
-
-The configuration process is very similar to that described for guest nodes
-using virtual machines. Key differences:
-
-* The underlying host must install the libvirt driver for the desired container
- technology -- for example, the +libvirt-daemon-lxc+ package to get the
- http://libvirt.org/drvlxc.html[libvirt-lxc] driver for LXC containers.
-
-* Libvirt XML definitions must be generated for the containers. The
- +pacemaker-cts+ package includes a script for this purpose,
- +/usr/share/pacemaker/tests/cts/lxc_autogen.sh+. Run it with the
- `--help` option for details on how to use it. It is intended for testing
- purposes only, and hardcodes various parameters that would need to be set
- appropriately in real usage. Of course, you can create XML definitions
- manually, following the appropriate libvirt driver documentation.
-
-* To share the authentication key, either share the host's +/etc/pacemaker+
- directory with the container, or copy the key into the container's
- filesystem.
-
-* The *VirtualDomain* resource for a container will need
- *force_stop="true"* and an appropriate hypervisor option,
- for example *hypervisor="lxc:///"* for LXC containers.
diff --git a/doc/Pacemaker_Remote/en-US/Ch-Baremetal-Tutorial.txt b/doc/Pacemaker_Remote/en-US/Ch-Baremetal-Tutorial.txt
deleted file mode 100644
index 71b17cdabb..0000000000
--- a/doc/Pacemaker_Remote/en-US/Ch-Baremetal-Tutorial.txt
+++ /dev/null
@@ -1,306 +0,0 @@
-:compat-mode: legacy
-= Remote Node Walk-through =
-
-*What this tutorial is:* An in-depth walk-through of how to get Pacemaker to
-integrate a remote node into the cluster as a node capable of running cluster
-resources.
-
-*What this tutorial is not:* A realistic deployment scenario. The steps shown
-here are meant to get users familiar with the concept of remote nodes as
-quickly as possible.
-
-This tutorial requires three machines: two to act as cluster nodes, and
-a third to act as the remote node.
-
-== Configure Remote Node ==
-
-=== Configure Firewall on Remote Node ===
-
-Allow cluster-related services through the local firewall:
-----
-# firewall-cmd --permanent --add-service=high-availability
-success
-# firewall-cmd --reload
-success
-----
-
-[NOTE]
-======
-If you are using iptables directly, or some other firewall solution besides
-firewalld, simply open the following ports, which can be used by various
-clustering components: TCP ports 2224, 3121, and 21064, and UDP port 5405.
-
-If you run into any problems during testing, you might want to disable
-the firewall and SELinux entirely until you have everything working.
-This may create significant security issues and should not be performed on
-machines that will be exposed to the outside world, but may be appropriate
-during development and testing on a protected host.
-
-To disable security measures:
-----
-# setenforce 0
-# sed -i.bak "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/selinux/config
-# systemctl mask firewalld.service
-# systemctl stop firewalld.service
-# iptables --flush
-----
-======
-
-=== Configure pacemaker_remote on Remote Node ===
-
-Install the pacemaker_remote daemon on the remote node.
-----
-# yum install -y pacemaker-remote resource-agents pcs
-----
-
-Create a location for the shared authentication key:
-----
-# mkdir -p --mode=0750 /etc/pacemaker
-# chgrp haclient /etc/pacemaker
-----
-
-All nodes (both cluster nodes and remote nodes) must have the same
-authentication key installed for the communication to work correctly.
-If you already have a key on an existing node, copy it to the new
-remote node. Otherwise, create a new key, for example:
-----
-# dd if=/dev/urandom of=/etc/pacemaker/authkey bs=4096 count=1
-----
-
-Now start and enable the pacemaker_remote daemon on the remote node.
-----
-# systemctl enable pacemaker_remote.service
-# systemctl start pacemaker_remote.service
-----
-
-Verify the start is successful.
-
-----
-# systemctl status pacemaker_remote
-pacemaker_remote.service - Pacemaker Remote Service
- Loaded: loaded (/usr/lib/systemd/system/pacemaker_remote.service; enabled)
- Active: active (running) since Fri 2018-01-12 15:21:20 CDT; 20s ago
- Main PID: 21273 (pacemaker_remot)
- CGroup: /system.slice/pacemaker_remote.service
- └─21273 /usr/sbin/pacemaker-remoted
-
-Jan 12 15:21:20 remote1 systemd[1]: Starting Pacemaker Remote Service...
-Jan 12 15:21:20 remote1 systemd[1]: Started Pacemaker Remote Service.
-Jan 12 15:21:20 remote1 pacemaker-remoted[21273]: notice: crm_add_logfile: Additional logging available in /var/log/pacemaker.log
-Jan 12 15:21:20 remote1 pacemaker-remoted[21273]: notice: lrmd_init_remote_tls_server: Starting a tls listener on port 3121.
-Jan 12 15:21:20 remote1 pacemaker-remoted[21273]: notice: bind_and_listen: Listening on address ::
-----
-
-== Verify Connection to Remote Node ==
-
-Before moving forward, it's worth verifying that the cluster nodes
-can contact the remote node on port 3121. Here's a trick you can use.
-Connect using ssh from each of the cluster nodes. The connection will get
-destroyed, but how it is destroyed tells you whether it worked or not.
-
-First, add the remote node's hostname (we're using *remote1* in this tutorial)
-to the cluster nodes' +/etc/hosts+ files if you haven't already. This
-is required unless you have DNS set up in a way where remote1's address can be
-discovered.
-
-Execute the following on each cluster node, replacing the IP address with the
-actual IP address of the remote node.
-----
-# cat << END >> /etc/hosts
-192.168.122.10 remote1
-END
-----
-
-If running the ssh command on one of the cluster nodes results in this
-output before disconnecting, the connection works:
-----
-# ssh -p 3121 remote1
-ssh_exchange_identification: read: Connection reset by peer
-----
-
-If you see one of these, the connection is not working:
-----
-# ssh -p 3121 remote1
-ssh: connect to host remote1 port 3121: No route to host
-----
-----
-# ssh -p 3121 remote1
-ssh: connect to host remote1 port 3121: Connection refused
-----
-
-Once you can successfully connect to the remote node from the both
-cluster nodes, move on to setting up Pacemaker on the cluster nodes.
-
-== Configure Cluster Nodes ==
-
-=== Configure Firewall on Cluster Nodes ===
-
-On each cluster node, allow cluster-related services through the local
-firewall, following the same procedure as in <<_configure_firewall_on_remote_node>>.
-
-=== Install Pacemaker on Cluster Nodes ===
-
-On the two cluster nodes, install the following packages.
-
-----
-# yum install -y pacemaker corosync pcs resource-agents
-----
-
-=== Copy Authentication Key to Cluster Nodes ===
-
-Create a location for the shared authentication key,
-and copy it from any existing node:
-----
-# mkdir -p --mode=0750 /etc/pacemaker
-# chgrp haclient /etc/pacemaker
-# scp remote1:/etc/pacemaker/authkey /etc/pacemaker/authkey
-----
-
-=== Configure Corosync on Cluster Nodes ===
-
-Corosync handles Pacemaker's cluster membership and messaging. The corosync
-config file is located in +/etc/corosync/corosync.conf+. That config file must be
-initialized with information about the two cluster nodes before pacemaker can
-start.
-
-To initialize the corosync config file, execute the following pcs command on
-both nodes, filling in the information in <> with your nodes' information.
-----
-# pcs cluster setup --force --local --name mycluster <node1 ip or hostname> <node2 ip or hostname>
-----
-
-=== Start Pacemaker on Cluster Nodes ===
-
-Start the cluster stack on both cluster nodes using the following command.
-
-----
-# pcs cluster start
-----
-
-Verify corosync membership
-
-....
-# pcs status corosync
-Membership information
-----------------------
- Nodeid Votes Name
- 1 1 node1 (local)
-....
-
-Verify Pacemaker status. At first, the `pcs cluster status` output will look
-like this.
-
-----
-# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: NONE
-Last updated: Fri Jan 12 16:14:05 2018
-Last change: Fri Jan 12 14:02:14 2018
-
-1 node configured
-0 resources configured
-----
-
-After about a minute, you should see your two cluster nodes come online.
-
-----
-# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: node1 (version 1.1.16-12.el7_4.5-94ff4df) - partition with quorum
-Last updated: Fri Jan 12 16:16:32 2018
-Last change: Fri Jan 12 14:02:14 2018
-
-2 nodes configured
-0 resources configured
-
-Online: [ node1 node2 ]
-----
-
-For the sake of this tutorial, we are going to disable stonith to avoid having to cover fencing device configuration.
-
-----
-# pcs property set stonith-enabled=false
-----
-
-== Integrate Remote Node into Cluster ==
-
-Integrating a remote node into the cluster is achieved through the
-creation of a remote node connection resource. The remote node connection
-resource both establishes the connection to the remote node and defines that
-the remote node exists. Note that this resource is actually internal to
-Pacemaker's controller. A metadata file for this resource can be found in
-the +/usr/lib/ocf/resource.d/pacemaker/remote+ file that describes what options
-are available, but there is no actual *ocf:pacemaker:remote* resource agent
-script that performs any work.
-
-Define the remote node connection resource to our remote node,
-*remote1*, using the following command on any cluster node.
-
-----
-# pcs resource create remote1 ocf:pacemaker:remote
-----
-
-That's it. After a moment you should see the remote node come online.
-
-----
-Cluster name: mycluster
-Stack: corosync
-Current DC: node1 (version 1.1.16-12.el7_4.5-94ff4df) - partition with quorum
-Last updated: Fri Jan 12 17:13:09 2018
-Last change: Fri Jan 12 17:02:02 2018
-
-3 nodes configured
-1 resources configured
-
-Online: [ node1 node2 ]
-RemoteOnline: [ remote1 ]
-
-Full list of resources:
-
- remote1 (ocf::pacemaker:remote): Started node1
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-== Starting Resources on Remote Node ==
-
-Once the remote node is integrated into the cluster, starting resources on a
-remote node is the exact same as on cluster nodes. Refer to the
-http://clusterlabs.org/doc/['Clusters from Scratch'] document for examples of
-resource creation.
-
-[WARNING]
-=========
-Never involve a remote node connection resource in a resource group,
-colocation constraint, or order constraint.
-=========
-
-== Fencing Remote Nodes ==
-
-Remote nodes are fenced the same way as cluster nodes. No special
-considerations are required. Configure fencing resources for use with
-remote nodes the same as you would with cluster nodes.
-
-Note, however, that remote nodes can never 'initiate' a fencing action. Only
-cluster nodes are capable of actually executing a fencing operation against
-another node.
-
-== Accessing Cluster Tools from a Remote Node ==
-
-Besides allowing the cluster to manage resources on a remote node,
-pacemaker_remote has one other trick. The pacemaker_remote daemon allows
-nearly all the pacemaker tools (`crm_resource`, `crm_mon`, `crm_attribute`,
-`crm_master`, etc.) to work on remote nodes natively.
-
-Try it: Run `crm_mon` on the remote node after pacemaker has
-integrated it into the cluster. These tools just work. These means resource
-agents such as promotable resources (which need access to tools like
-`crm_master`) work seamlessly on the remote nodes.
-
-Higher-level command shells such as `pcs` may have partial support
-on remote nodes, but it is recommended to run them from a cluster node.
diff --git a/doc/Pacemaker_Remote/en-US/Ch-Example.txt b/doc/Pacemaker_Remote/en-US/Ch-Example.txt
deleted file mode 100644
index 16faff8073..0000000000
--- a/doc/Pacemaker_Remote/en-US/Ch-Example.txt
+++ /dev/null
@@ -1,131 +0,0 @@
-:compat-mode: legacy
-= Guest Node Quick Example =
-
-If you already know how to use Pacemaker, you'll likely be able to grasp this
-new concept of guest nodes by reading through this quick example without
-having to sort through all the detailed walk-through steps. Here are the key
-configuration ingredients that make this possible using libvirt and KVM virtual
-guests. These steps strip everything down to the very basics.
-(((guest node)))
-(((node,guest node)))
-
-== Mile-High View of Configuration Steps ==
-
-* Give each virtual machine that will be used as a guest node a static network
- address and unique hostname.
-
-* Put the same authentication key with the path +/etc/pacemaker/authkey+ on
- every cluster node and virtual machine. This secures remote communication.
-+
-Run this command if you want to make a somewhat random key:
-+
-----
-dd if=/dev/urandom of=/etc/pacemaker/authkey bs=4096 count=1
-----
-
-* Install pacemaker_remote on every virtual machine, enabling it to start at
- boot, and if a local firewall is used, allow the node to accept connections
- on TCP port 3121.
-+
-----
-yum install pacemaker-remote resource-agents
-systemctl enable pacemaker_remote
-firewall-cmd --add-port 3121/tcp --permanent
-----
-+
-[NOTE]
-======
-If you just want to see this work, you may want to simply disable the local
-firewall and put SELinux in permissive mode while testing. This creates
-security risks and should not be done on a production machine exposed to the
-Internet, but can be appropriate for a protected test machine.
-======
-
-* Create a Pacemaker resource to launch each virtual machine, using the
- *remote-node* meta-attribute to let Pacemaker know this will be a
- guest node capable of running resources.
-+
-----
-# pcs resource create vm-guest1 VirtualDomain hypervisor="qemu:///system" config="vm-guest1.xml" meta remote-node="guest1"
-----
-+
-The above command will create CIB XML similar to the following:
-+
-[source,XML]
-----
- <primitive class="ocf" id="vm-guest1" provider="heartbeat" type="VirtualDomain">
- <instance_attributes id="vm-guest-instance_attributes">
- <nvpair id="vm-guest1-instance_attributes-hypervisor" name="hypervisor" value="qemu:///system"/>
- <nvpair id="vm-guest1-instance_attributes-config" name="config" value="guest1.xml"/>
- </instance_attributes>
- <operations>
- <op id="vm-guest1-interval-30s" interval="30s" name="monitor"/>
- </operations>
- <meta_attributes id="vm-guest1-meta_attributes">
- <nvpair id="vm-guest1-meta_attributes-remote-node" name="remote-node" value="guest1"/>
- </meta_attributes>
- </primitive>
-----
-
-In the example above, the meta-attribute *remote-node="guest1"* tells Pacemaker
-that this resource is a guest node with the hostname *guest1*. The cluster will
-attempt to contact the virtual machine's pacemaker_remote service at the
-hostname *guest1* after it launches.
-
-[NOTE]
-======
-The ID of the resource creating the virtual machine (*vm-guest1* in the above
-example) 'must' be different from the virtual machine's uname (*guest1* in the
-above example). Pacemaker will create an implicit internal resource for the
-pacemaker_remote connection to the guest, named with the value of *remote-node*,
-so that value cannot be used as the name of any other resource.
-======
-
-== Using a Guest Node ==
-
-Guest nodes will show up in `crm_mon` output as normal:
-
-.Example `crm_mon` output after *guest1* is integrated into cluster
-----
-Stack: corosync
-Current DC: node1 (version 1.1.16-12.el7_4.5-94ff4df) - partition with quorum
-Last updated: Fri Jan 12 13:52:39 2018
-Last change: Fri Jan 12 13:25:17 2018 via pacemaker-controld on node1
-
-2 nodes configured
-2 resources configured
-
-Online: [ node1 guest1]
-
-vm-guest1 (ocf::heartbeat:VirtualDomain): Started node1
-----
-
-Now, you could place a resource, such as a webserver, on *guest1*:
-----
-# pcs resource create webserver apache params configfile=/etc/httpd/conf/httpd.conf op monitor interval=30s
-# pcs constraint location webserver prefers guest1
-----
-
-Now, the crm_mon output would show:
-----
-Stack: corosync
-Current DC: node1 (version 1.1.16-12.el7_4.5-94ff4df) - partition with quorum
-Last updated: Fri Jan 12 13:52:39 2018
-Last change: Fri Jan 12 13:25:17 2018 via pacemaker-controld on node1
-
-2 nodes configured
-2 resources configured
-
-Online: [ node1 guest1]
-
-vm-guest1 (ocf::heartbeat:VirtualDomain): Started node1
-webserver (ocf::heartbeat::apache): Started guest1
-----
-
-It is worth noting that after *guest1* is integrated into the cluster, nearly all the
-Pacemaker command-line tools immediately become available to the guest node.
-This means things like `crm_mon`, `crm_resource`, and `crm_attribute` will work
-natively on the guest node, as long as the connection between the guest node
-and a cluster node exists. This is particularly important for any promotable
-clone resources executing on the guest node that need access to `crm_master` to
-set transient attributes.
diff --git a/doc/Pacemaker_Remote/en-US/Ch-Intro.txt b/doc/Pacemaker_Remote/en-US/Ch-Intro.txt
deleted file mode 100644
index e280f05c43..0000000000
--- a/doc/Pacemaker_Remote/en-US/Ch-Intro.txt
+++ /dev/null
@@ -1,160 +0,0 @@
-:compat-mode: legacy
-= Scaling a Pacemaker Cluster =
-
-== Overview ==
-
-In a basic Pacemaker high-availability
-cluster,footnote:[See the http://www.clusterlabs.org/doc/[Pacemaker
-documentation], especially 'Clusters From Scratch' and 'Pacemaker Explained',
-for basic information about high-availability using Pacemaker]
-each node runs the full cluster stack of corosync and all Pacemaker components.
-This allows great flexibility but limits scalability to around 16 nodes.
-
-To allow for scalability to dozens or even hundreds of nodes, Pacemaker
-allows nodes not running the full cluster stack to integrate into the cluster
-and have the cluster manage their resources as if they were a cluster node.
-
-== Terms ==
-
-cluster node::
- A node running the full high-availability stack of corosync and all
- Pacemaker components. Cluster nodes may run cluster resources, run
- all Pacemaker command-line tools (`crm_mon`, `crm_resource` and so on),
- execute fencing actions, count toward cluster quorum, and serve as the
- cluster's Designated Controller (DC).
-(((cluster node)))
-(((node,cluster node)))
-
-pacemaker_remote::
- A small service daemon that allows a host to be used as a Pacemaker node
- without running the full cluster stack. Nodes running pacemaker_remote
- may run cluster resources and most command-line tools, but cannot perform
- other functions of full cluster nodes such as fencing execution, quorum
- voting or DC eligibility. The pacemaker_remote daemon is an enhanced
- version of Pacemaker's local resource management daemon (LRMD).
-(((pacemaker_remote)))
-
-remote node::
- A physical host running pacemaker_remote. Remote nodes have a special
- resource that manages communication with the cluster. This is sometimes
- referred to as the 'baremetal' case.
-(((remote node)))
-(((node,remote node)))
-
-guest node::
- A virtual host running pacemaker_remote. Guest nodes differ from remote
- nodes mainly in that the guest node is itself a resource that the cluster
- manages.
-(((guest node)))
-(((node,guest node)))
-
-[NOTE]
-======
-'Remote' in this document refers to the node not being a part of the underlying
-corosync cluster. It has nothing to do with physical proximity. Remote nodes
-and guest nodes are subject to the same latency requirements as cluster nodes,
-which means they are typically in the same data center.
-======
-
-[NOTE]
-======
-It is important to distinguish the various roles a virtual machine can serve
-in Pacemaker clusters:
-
-* A virtual machine can run the full cluster stack, in which case it is a
- cluster node and is not itself managed by the cluster.
-* A virtual machine can be managed by the cluster as a resource, without the
- cluster having any awareness of the services running inside the virtual
- machine. The virtual machine is 'opaque' to the cluster.
-* A virtual machine can be a cluster resource, and run pacemaker_remote
- to make it a guest node, allowing the cluster to manage services
- inside it. The virtual machine is 'transparent' to the cluster.
-======
-
-== Guest Nodes ==
-(((guest node)))
-(((node,guest node)))
-
-*"I want a Pacemaker cluster to manage virtual machine resources, but I also
-want Pacemaker to be able to manage the resources that live within those
-virtual machines."*
-
-Without pacemaker_remote, the possibilities for implementing the above use case
-have significant limitations:
-
-* The cluster stack could be run on the physical hosts only, which loses the
- ability to monitor resources within the guests.
-* A separate cluster could be on the virtual guests, which quickly hits
- scalability issues.
-* The cluster stack could be run on the guests using the same cluster as the
- physical hosts, which also hits scalability issues and complicates fencing.
-
-With pacemaker_remote:
-
-* The physical hosts are cluster nodes (running the full cluster stack).
-* The virtual machines are guest nodes (running the pacemaker_remote service).
- Nearly zero configuration is required on the virtual machine.
-* The cluster stack on the cluster nodes launches the virtual machines and
- immediately connects to the pacemaker_remote service on them, allowing the
- virtual machines to integrate into the cluster.
-
-The key difference here between the guest nodes and the cluster nodes is that
-the guest nodes do not run the cluster stack. This means they will never become
-the DC, initiate fencing actions or participate in quorum voting.
-
-On the other hand, this also means that they are not bound to the scalability
-limits associated with the cluster stack (no 16-node corosync member limits to
-deal with). That isn't to say that guest nodes can scale indefinitely, but it
-is known that guest nodes scale horizontally much further than cluster nodes.
-
-Other than the quorum limitation, these guest nodes behave just like cluster
-nodes with respect to resource management. The cluster is fully capable of
-managing and monitoring resources on each guest node. You can build constraints
-against guest nodes, put them in standby, or do whatever else you'd expect to
-be able to do with cluster nodes. They even show up in `crm_mon` output as
-nodes.
-
-To solidify the concept, below is an example that is very similar to an actual
-deployment we test in our developer environment to verify guest node scalability:
-
-* 16 cluster nodes running the full corosync + pacemaker stack
-* 64 Pacemaker-managed virtual machine resources running pacemaker_remote configured as guest nodes
-* 64 Pacemaker-managed webserver and database resources configured to run on the 64 guest nodes
-
-With this deployment, you would have 64 webservers and databases running on 64
-virtual machines on 16 hardware nodes, all of which are managed and monitored by
-the same Pacemaker deployment. It is known that pacemaker_remote can scale to
-these lengths and possibly much further depending on the specific scenario.
-
-
-== Remote Nodes ==
-(((remote node)))
-(((node,remote node)))
-
-*"I want my traditional high-availability cluster to scale beyond the limits
-imposed by the corosync messaging layer."*
-
-Ultimately, the primary advantage of remote nodes over cluster nodes is
-scalability. There are likely some other use cases related to geographically
-distributed HA clusters that remote nodes may serve a purpose in, but those use
-cases are not well understood at this point.
-
-Like guest nodes, remote nodes will never become the DC, initiate
-fencing actions or participate in quorum voting.
-
-That is not to say, however, that fencing of a remote node works any
-differently than that of a cluster node. The Pacemaker scheduler
-understands how to fence remote nodes. As long as a fencing device exists, the
-cluster is capable of ensuring remote nodes are fenced in the exact same way as
-cluster nodes.
-
-== Expanding the Cluster Stack ==
-
-With pacemaker_remote, the traditional view of the high-availability stack can
-be expanded to include a new layer:
-
-.Traditional HA Stack
-image::images/pcmk-ha-cluster-stack.png["Traditional Pacemaker+Corosync Stack",width="17cm",height="9cm",align="center"]
-
-.HA Stack With Guest Nodes
-image::images/pcmk-ha-remote-stack.png["Pacemaker+Corosync Stack With pacemaker_remote",width="20cm",height="10cm",align="center"]
diff --git a/doc/Pacemaker_Remote/en-US/Ch-KVM-Tutorial.txt b/doc/Pacemaker_Remote/en-US/Ch-KVM-Tutorial.txt
deleted file mode 100644
index bd2c4889b2..0000000000
--- a/doc/Pacemaker_Remote/en-US/Ch-KVM-Tutorial.txt
+++ /dev/null
@@ -1,579 +0,0 @@
-:compat-mode: legacy
-= Guest Node Walk-through =
-
-*What this tutorial is:* An in-depth walk-through of how to get Pacemaker to
-manage a KVM guest instance and integrate that guest into the cluster as a
-guest node.
-
-*What this tutorial is not:* A realistic deployment scenario. The steps shown
-here are meant to get users familiar with the concept of guest nodes as quickly
-as possible.
-
-== Configure the Physical Host ==
-
-[NOTE]
-======
-For this example, we will use a single physical host named *example-host*.
-A production cluster would likely have multiple physical hosts, in which case
-you would run the commands here on each one, unless noted otherwise.
-======
-
-=== Configure Firewall on Host ===
-
-On the physical host, allow cluster-related services through the local firewall:
-----
-# firewall-cmd --permanent --add-service=high-availability
-success
-# firewall-cmd --reload
-success
-----
-
-[NOTE]
-======
-If you are using iptables directly, or some other firewall solution besides
-firewalld, simply open the following ports, which can be used by various
-clustering components: TCP ports 2224, 3121, and 21064, and UDP port 5405.
-
-If you run into any problems during testing, you might want to disable
-the firewall and SELinux entirely until you have everything working.
-This may create significant security issues and should not be performed on
-machines that will be exposed to the outside world, but may be appropriate
-during development and testing on a protected host.
-
-To disable security measures:
-----
-[root@pcmk-1 ~]# setenforce 0
-[root@pcmk-1 ~]# sed -i.bak "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/selinux/config
-[root@pcmk-1 ~]# systemctl mask firewalld.service
-[root@pcmk-1 ~]# systemctl stop firewalld.service
-[root@pcmk-1 ~]# iptables --flush
-----
-======
-
-=== Install Cluster Software ===
-
-----
-# yum install -y pacemaker corosync pcs resource-agents
-----
-
-=== Configure Corosync ===
-
-Corosync handles pacemaker's cluster membership and messaging. The corosync
-config file is located in +/etc/corosync/corosync.conf+. That config file must
-be initialized with information about the cluster nodes before pacemaker can
-start.
-
-To initialize the corosync config file, execute the following `pcs` command,
-replacing the cluster name and hostname as desired:
-----
-# pcs cluster setup --force --local --name mycluster example-host
-----
-
-[NOTE]
-======
-If you have multiple physical hosts, you would execute the setup command on
-only one host, but list all of them at the end of the command.
-======
-
-=== Configure Pacemaker for Remote Node Communication ===
-
-Create a place to hold an authentication key for use with pacemaker_remote:
-----
-# mkdir -p --mode=0750 /etc/pacemaker
-# chgrp haclient /etc/pacemaker
-----
-
-Generate a key:
-----
-# dd if=/dev/urandom of=/etc/pacemaker/authkey bs=4096 count=1
-----
-
-[NOTE]
-======
-If you have multiple physical hosts, you would generate the key on only one
-host, and copy it to the same location on all hosts.
-======
-
-=== Verify Cluster Software ===
-
-Start the cluster
-----
-# pcs cluster start
-----
-
-Verify corosync membership
-....
-# pcs status corosync
-
-Membership information
-----------------------
- Nodeid Votes Name
- 1 1 example-host (local)
-....
-
-Verify pacemaker status. At first, the output will look like this:
-----
-# pcs status
-Cluster name: mycluster
-WARNING: no stonith devices and stonith-enabled is not false
-Stack: corosync
-Current DC: NONE
-Last updated: Fri Jan 12 15:18:32 2018
-Last change: Fri Jan 12 12:42:21 2018 by root via cibadmin on example-host
-
-1 node configured
-0 resources configured
-
-Node example-host: UNCLEAN (offline)
-
-No active resources
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-After a short amount of time, you should see your host as a single node in the
-cluster:
-----
-# pcs status
-Cluster name: mycluster
-WARNING: no stonith devices and stonith-enabled is not false
-Stack: corosync
-Current DC: example-host (version 1.1.16-12.el7_4.5-94ff4df) - partition WITHOUT quorum
-Last updated: Fri Jan 12 15:20:05 2018
-Last change: Fri Jan 12 12:42:21 2018 by root via cibadmin on example-host
-
-1 node configured
-0 resources configured
-
-Online: [ example-host ]
-
-No active resources
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-=== Disable STONITH and Quorum ===
-
-Now, enable the cluster to work without quorum or stonith. This is required
-for the sake of getting this tutorial to work with a single cluster node.
-
-----
-# pcs property set stonith-enabled=false
-# pcs property set no-quorum-policy=ignore
-----
-
-[WARNING]
-=========
-The use of `stonith-enabled=false` is completely inappropriate for a production
-cluster. It tells the cluster to simply pretend that failed nodes are safely
-powered off. Some vendors will refuse to support clusters that have STONITH
-disabled. We disable STONITH here only to focus the discussion on
-pacemaker_remote, and to be able to use a single physical host in the example.
-=========
-
-Now, the status output should look similar to this:
-----
-# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: example-host (version 1.1.16-12.el7_4.5-94ff4df) - partition with quorum
-Last updated: Fri Jan 12 15:22:49 2018
-Last change: Fri Jan 12 15:22:46 2018 by root via cibadmin on example-host
-
-1 node configured
-0 resources configured
-
-Online: [ example-host ]
-
-No active resources
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-Go ahead and stop the cluster for now after verifying everything is in order.
-----
-# pcs cluster stop --force
-----
-
-=== Install Virtualization Software ===
-
-----
-# yum install -y kvm libvirt qemu-system qemu-kvm bridge-utils virt-manager
-# systemctl enable libvirtd.service
-----
-
-Reboot the host.
-
-[NOTE]
-======
-While KVM is used in this example, any virtualization platform with a Pacemaker
-resource agent can be used to create a guest node. The resource agent needs
-only to support usual commands (start, stop, etc.); Pacemaker implements the
-*remote-node* meta-attribute, independent of the agent.
-======
-
-== Configure the KVM guest ==
-
-=== Create Guest ===
-
-We will not outline here the installation steps required to create a KVM
-guest. There are plenty of tutorials available elsewhere that do that.
-Just be sure to configure the guest with a hostname and a static IP address
-(as an example here, we will use guest1 and 192.168.122.10).
-
-=== Configure Firewall on Guest ===
-
-On each guest, allow cluster-related services through the local firewall,
-following the same procedure as in <<_configure_firewall_on_host>>.
-
-=== Verify Connectivity ===
-
-At this point, you should be able to ping and ssh into guests from hosts, and
-vice versa.
-
-=== Configure pacemaker_remote ===
-
-Install pacemaker_remote, and enable it to run at start-up. Here, we also
-install the pacemaker package; it is not required, but it contains the dummy
-resource agent that we will use later for testing.
-----
-# yum install -y pacemaker pacemaker-remote resource-agents
-# systemctl enable pacemaker_remote.service
-----
-
-Copy the authentication key from a host:
-----
-# mkdir -p --mode=0750 /etc/pacemaker
-# chgrp haclient /etc/pacemaker
-# scp root@example-host:/etc/pacemaker/authkey /etc/pacemaker
-----
-
-Start pacemaker_remote, and verify the start was successful:
-----
-# systemctl start pacemaker_remote
-# systemctl status pacemaker_remote
-
- pacemaker_remote.service - Pacemaker Remote Service
- Loaded: loaded (/usr/lib/systemd/system/pacemaker_remote.service; enabled)
- Active: active (running) since Thu 2013-03-14 18:24:04 EDT; 2min 8s ago
- Main PID: 1233 (pacemaker_remot)
- CGroup: name=systemd:/system/pacemaker_remote.service
- └─1233 /usr/sbin/pacemaker-remoted
-
- Mar 14 18:24:04 guest1 systemd[1]: Starting Pacemaker Remote Service...
- Mar 14 18:24:04 guest1 systemd[1]: Started Pacemaker Remote Service.
- Mar 14 18:24:04 guest1 pacemaker-remoted[1233]: notice: lrmd_init_remote_tls_server: Starting a tls listener on port 3121.
-----
-
-=== Verify Host Connection to Guest ===
-
-Before moving forward, it's worth verifying that the host can contact the guest
-on port 3121. Here's a trick you can use. Connect using ssh from the host. The
-connection will get destroyed, but how it is destroyed tells you whether it
-worked or not.
-
-First add guest1 to the host machine's +/etc/hosts+ file if you haven't
-already. This is required unless you have DNS setup in a way where guest1's
-address can be discovered.
-
-----
-# cat << END >> /etc/hosts
-192.168.122.10 guest1
-END
-----
-
-If running the ssh command on one of the cluster nodes results in this
-output before disconnecting, the connection works:
-----
-# ssh -p 3121 guest1
-ssh_exchange_identification: read: Connection reset by peer
-----
-
-If you see one of these, the connection is not working:
-----
-# ssh -p 3121 guest1
-ssh: connect to host guest1 port 3121: No route to host
-----
-----
-# ssh -p 3121 guest1
-ssh: connect to host guest1 port 3121: Connection refused
-----
-
-Once you can successfully connect to the guest from the host, shutdown the guest. Pacemaker will be managing the virtual machine from this point forward.
-
-== Integrate Guest into Cluster ==
-
-Now the fun part, integrating the virtual machine you've just created into the cluster. It is incredibly simple.
-
-=== Start the Cluster ===
-On the host, start pacemaker.
-
-----
-# pcs cluster start
-----
-
-Wait for the host to become the DC. The output of `pcs status` should look
-as it did in <<_disable_stonith_and_quorum>>.
-
-=== Integrate as Guest Node ===
-
-If you didn't already do this earlier in the verify host to guest connection
-section, add the KVM guest's IP address to the host's +/etc/hosts+ file so we
-can connect by hostname. For this example:
-----
-# cat << END >> /etc/hosts
-192.168.122.10 guest1
-END
-----
-
-We will use the *VirtualDomain* resource agent for the management of the
-virtual machine. This agent requires the virtual machine's XML config to be
-dumped to a file on disk. To do this, pick out the name of the virtual machine
-you just created from the output of this list.
-
-....
-# virsh list --all
- Id Name State
-----------------------------------------------------
- - guest1 shut off
-....
-
-In my case I named it guest1. Dump the xml to a file somewhere on the host using the following command.
-
-----
-# virsh dumpxml guest1 > /etc/pacemaker/guest1.xml
-----
-
-Now just register the resource with pacemaker and you're set!
-
-----
-# pcs resource create vm-guest1 VirtualDomain hypervisor="qemu:///system" \
- config="/etc/pacemaker/guest1.xml" meta remote-node=guest1
-----
-
-[NOTE]
-======
-This example puts the guest XML under /etc/pacemaker because the
-permissions and SELinux labeling should not need any changes.
-If you run into trouble with this or any step, try disabling SELinux
-with `setenforce 0`. If it works after that, see SELinux documentation
-for how to troubleshoot, if you wish to reenable SELinux.
-======
-
-[NOTE]
-======
-Pacemaker will automatically monitor pacemaker_remote connections for failure,
-so it is not necessary to create a recurring monitor on the VirtualDomain
-resource.
-======
-
-Once the *vm-guest1* resource is started you will see *guest1* appear in the
-`pcs status` output as a node. The final `pcs status` output should look
-something like this.
-
-----
-# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: example-host (version 1.1.16-12.el7_4.5-94ff4df) - partition with quorum
-Last updated: Fri Jan 12 18:00:45 2018
-Last change: Fri Jan 12 17:53:44 2018 by root via crm_resource on example-host
-
-2 nodes configured
-2 resources configured
-
-Online: [ example-host ]
-GuestOnline: [ guest1@example-host ]
-
-Full list of resources:
-
- vm-guest1 (ocf::heartbeat:VirtualDomain): Started example-host
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-=== Starting Resources on KVM Guest ===
-
-The commands below demonstrate how resources can be executed on both the
-guest node and the cluster node.
-
-Create a few Dummy resources. Dummy resources are real resource agents used just for testing purposes. They actually execute on the host they are assigned to just like an apache server or database would, except their execution just means a file was created. When the resource is stopped, that the file it created is removed.
-
-----
-# pcs resource create FAKE1 ocf:pacemaker:Dummy
-# pcs resource create FAKE2 ocf:pacemaker:Dummy
-# pcs resource create FAKE3 ocf:pacemaker:Dummy
-# pcs resource create FAKE4 ocf:pacemaker:Dummy
-# pcs resource create FAKE5 ocf:pacemaker:Dummy
-----
-
-Now check your `pcs status` output. In the resource section, you should see
-something like the following, where some of the resources started on the
-cluster node, and some started on the guest node.
-
-----
-Full list of resources:
-
- vm-guest1 (ocf::heartbeat:VirtualDomain): Started example-host
- FAKE1 (ocf::pacemaker:Dummy): Started guest1
- FAKE2 (ocf::pacemaker:Dummy): Started guest1
- FAKE3 (ocf::pacemaker:Dummy): Started example-host
- FAKE4 (ocf::pacemaker:Dummy): Started guest1
- FAKE5 (ocf::pacemaker:Dummy): Started example-host
-----
-
-
-The guest node, *guest1*, reacts just like any other node in the cluster. For
-example, pick out a resource that is running on your cluster node. For my
-purposes, I am picking FAKE3 from the output above. We can force FAKE3 to run
-on *guest1* in the exact same way we would any other node.
-
-----
-# pcs constraint location FAKE3 prefers guest1
-----
-
-Now, looking at the bottom of the `pcs status` output you'll see FAKE3 is on
-*guest1*.
-
-----
-Full list of resources:
-
- vm-guest1 (ocf::heartbeat:VirtualDomain): Started example-host
- FAKE1 (ocf::pacemaker:Dummy): Started guest1
- FAKE2 (ocf::pacemaker:Dummy): Started guest1
- FAKE3 (ocf::pacemaker:Dummy): Started guest1
- FAKE4 (ocf::pacemaker:Dummy): Started example-host
- FAKE5 (ocf::pacemaker:Dummy): Started example-host
-----
-
-=== Testing Recovery and Fencing ===
-
-Pacemaker's scheduler is smart enough to know fencing guest nodes
-associated with a virtual machine means shutting off/rebooting the virtual
-machine. No special configuration is necessary to make this happen. If you
-are interested in testing this functionality out, trying stopping the guest's
-pacemaker_remote daemon. This would be equivalent of abruptly terminating a
-cluster node's corosync membership without properly shutting it down.
-
-ssh into the guest and run this command.
-
-----
-# kill -9 $(pidof pacemaker-remoted)
-----
-
-Within a few seconds, your `pcs status` output will show a monitor failure,
-and the *guest1* node will not be shown while it is being recovered.
-----
-# pcs status
-Cluster name: mycluster
-Stack: corosync
-Current DC: example-host (version 1.1.16-12.el7_4.5-94ff4df) - partition with quorum
-Last updated: Fri Jan 12 18:08:35 2018
-Last change: Fri Jan 12 18:07:00 2018 by root via cibadmin on example-host
-
-2 nodes configured
-7 resources configured
-
-Online: [ example-host ]
-
-Full list of resources:
-
- vm-guest1 (ocf::heartbeat:VirtualDomain): Started example-host
- FAKE1 (ocf::pacemaker:Dummy): Stopped
- FAKE2 (ocf::pacemaker:Dummy): Stopped
- FAKE3 (ocf::pacemaker:Dummy): Stopped
- FAKE4 (ocf::pacemaker:Dummy): Started example-host
- FAKE5 (ocf::pacemaker:Dummy): Started example-host
-
-Failed Actions:
-* guest1_monitor_30000 on example-host 'unknown error' (1): call=8, status=Error, exitreason='none',
- last-rc-change='Fri Jan 12 18:08:29 2018', queued=0ms, exec=0ms
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-[NOTE]
-======
-A guest node involves two resources: the one you explicitly configured creates the guest,
-and Pacemaker creates an implicit resource for the pacemaker_remote connection, which
-will be named the same as the value of the *remote-node* attribute of the explicit resource.
-When we killed pacemaker_remote, it is the implicit resource that failed, which is why
-the failed action starts with *guest1* and not *vm-guest1*.
-======
-
-Once recovery of the guest is complete, you'll see it automatically get
-re-integrated into the cluster. The final `pcs status` output should look
-something like this.
-
-----
-Cluster name: mycluster
-Stack: corosync
-Current DC: example-host (version 1.1.16-12.el7_4.5-94ff4df) - partition with quorum
-Last updated: Fri Jan 12 18:18:30 2018
-Last change: Fri Jan 12 18:07:00 2018 by root via cibadmin on example-host
-
-2 nodes configured
-7 resources configured
-
-Online: [ example-host ]
-GuestOnline: [ guest1@example-host ]
-
-Full list of resources:
-
- vm-guest1 (ocf::heartbeat:VirtualDomain): Started example-host
- FAKE1 (ocf::pacemaker:Dummy): Started guest1
- FAKE2 (ocf::pacemaker:Dummy): Started guest1
- FAKE3 (ocf::pacemaker:Dummy): Started guest1
- FAKE4 (ocf::pacemaker:Dummy): Started example-host
- FAKE5 (ocf::pacemaker:Dummy): Started example-host
-
-Failed Actions:
-* guest1_monitor_30000 on example-host 'unknown error' (1): call=8, status=Error, exitreason='none',
- last-rc-change='Fri Jan 12 18:08:29 2018', queued=0ms, exec=0ms
-
-Daemon Status:
- corosync: active/disabled
- pacemaker: active/disabled
- pcsd: active/enabled
-----
-
-Normally, once you've investigated and addressed a failed action, you can clear the
-failure. However Pacemaker does not yet support cleanup for the implicitly
-created connection resource while the explicit resource is active. If you want
-to clear the failed action from the status output, stop the guest resource before
-clearing it. For example:
-----
-# pcs resource disable vm-guest1 --wait
-# pcs resource cleanup guest1
-# pcs resource enable vm-guest1
-----
-
-=== Accessing Cluster Tools from Guest Node ===
-
-Besides allowing the cluster to manage resources on a guest node,
-pacemaker_remote has one other trick. The pacemaker_remote daemon allows
-nearly all the pacemaker tools (`crm_resource`, `crm_mon`, `crm_attribute`,
-`crm_master`, etc.) to work on guest nodes natively.
-
-Try it: Run `crm_mon` on the guest after pacemaker has
-integrated the guest node into the cluster. These tools just work. This
-means resource agents such as promotable resources (which need access to tools
-like `crm_master`) work seamlessly on the guest nodes.
-
-Higher-level command shells such as `pcs` may have partial support
-on guest nodes, but it is recommended to run them from a cluster node.
diff --git a/doc/Pacemaker_Remote/en-US/Ch-Options.txt b/doc/Pacemaker_Remote/en-US/Ch-Options.txt
deleted file mode 100644
index 288bc9f27d..0000000000
--- a/doc/Pacemaker_Remote/en-US/Ch-Options.txt
+++ /dev/null
@@ -1,134 +0,0 @@
-:compat-mode: legacy
-= Configuration Explained =
-
-The walk-through examples use some of these options, but don't explain exactly
-what they mean or do. This section is meant to be the go-to resource for all
-the options available for configuring pacemaker_remote-based nodes.
-(((configuration)))
-
-== Resource Meta-Attributes for Guest Nodes ==
-
-When configuring a virtual machine as a guest node, the virtual machine is
-created using one of the usual resource agents for that purpose (for example,
-ocf:heartbeat:VirtualDomain or ocf:heartbeat:Xen), with additional metadata
-parameters.
-
-No restrictions are enforced on what agents may be used to create a guest node,
-but obviously the agent must create a distinct environment capable of running
-the pacemaker_remote daemon and cluster resources. An additional requirement is
-that fencing the host running the guest node resource must be sufficient for
-ensuring the guest node is stopped. This means, for example, that not all
-hypervisors supported by VirtualDomain may be used to create guest nodes; if
-the guest can survive the hypervisor being fenced, it may not be used as a
-guest node.
-
-Below are the metadata options available to enable a resource as a guest node
-and define its connection parameters.
-
-.Meta-attributes for configuring VM resources as guest nodes
-[width="95%",cols="2m,1,<4",options="header",align="center"]
-|=========================================================
-
-|Option
-|Default
-|Description
-
-|remote-node
-|'none'
-|The node name of the guest node this resource defines. This both enables the
-resource as a guest node and defines the unique name used to identify the
-guest node. If no other parameters are set, this value will also be assumed as
-the hostname to use when connecting to pacemaker_remote on the VM. This value
-*must not* overlap with any resource or node IDs.
-
-|remote-port
-|3121
-|The port on the virtual machine that the cluster will use to connect to
-pacemaker_remote.
-
-|remote-addr
-|'value of' +remote-node+
-|The IP address or hostname to use when connecting to pacemaker_remote on the VM.
-
-|remote-connect-timeout
-|60s
-|How long before a pending guest connection will time out.
-
-|=========================================================
-
-== Connection Resources for Remote Nodes ==
-
-A remote node is defined by a connection resource. That connection resource
-has instance attributes that define where the remote node is located on the
-network and how to communicate with it.
-
-Descriptions of these instance attributes can be retrieved using the following
-`pcs` command:
-----
-# pcs resource describe remote
-ocf:pacemaker:remote - remote resource agent
-
-Resource options:
- server: Server location to connect to. This can be an ip address or hostname.
- port: tcp port to connect to.
- reconnect_interval: Interval in seconds at which Pacemaker will attempt to
- reconnect to a remote node after an active connection to
- the remote node has been severed. When this value is
- nonzero, Pacemaker will retry the connection
- indefinitely, at the specified interval.
-----
-
-When defining a remote node's connection resource, it is common and recommended
-to name the connection resource the same as the remote node's hostname. By
-default, if no *server* option is provided, the cluster will attempt to contact
-the remote node using the resource name as the hostname.
-
-Example defining a remote node with the hostname *remote1*:
-----
-# pcs resource create remote1 remote
-----
-
-Example defining a remote node to connect to a specific IP address and port:
-----
-# pcs resource create remote1 remote server=192.168.122.200 port=8938
-----
-
-== Environment Variables for Daemon Start-up ==
-
-Authentication and encryption of the connection between cluster nodes
-and nodes running pacemaker_remote is achieved using
-with https://en.wikipedia.org/wiki/TLS-PSK[TLS-PSK] encryption/authentication
-over TCP (port 3121 by default). This means that both the cluster node and
-remote node must share the same private key. By default, this
-key is placed at +/etc/pacemaker/authkey+ on each node.
-
-You can change the default port and/or key location for Pacemaker and
-pacemaker_remote via environment variables. How these variables are set varies
-by OS, but usually they are set in the +/etc/sysconfig/pacemaker+ or
-+/etc/default/pacemaker+ file.
-
-----
-#==#==# Pacemaker Remote
-# Use a custom directory for finding the authkey.
-PCMK_authkey_location=/etc/pacemaker/authkey
-#
-# Specify a custom port for Pacemaker Remote connections
-PCMK_remote_port=3121
-----
-
-== Removing Remote Nodes and Guest Nodes ==
-
-If the resource creating a guest node, or the *ocf:pacemaker:remote* resource
-creating a connection to a remote node, is removed from the configuration, the
-affected node will continue to show up in output as an offline node.
-
-If you want to get rid of that output, run (replacing $NODE_NAME appropriately):
-----
-# crm_node --force --remove $NODE_NAME
-----
-
-[WARNING]
-=========
-Be absolutely sure that there are no references to the node's resource in the
-configuration before running the above command.
-=========
diff --git a/doc/Pacemaker_Remote/en-US/Pacemaker_Remote.ent b/doc/Pacemaker_Remote/en-US/Pacemaker_Remote.ent
deleted file mode 100644
index 6ac0ff4982..0000000000
--- a/doc/Pacemaker_Remote/en-US/Pacemaker_Remote.ent
+++ /dev/null
@@ -1,6 +0,0 @@
-<!ENTITY PRODUCT "Pacemaker Remote">
-<!ENTITY BOOKID "Pacemaker_Remote">
-<!ENTITY YEAR "2013-2019">
-<!ENTITY HOLDER "The Pacemaker project contributors">
-<!ENTITY DISTRO "CentOS">
-<!ENTITY DISTRO_VERSION "7.4">
diff --git a/doc/Pacemaker_Remote/en-US/Pacemaker_Remote.xml b/doc/Pacemaker_Remote/en-US/Pacemaker_Remote.xml
deleted file mode 100644
index 3867314a33..0000000000
--- a/doc/Pacemaker_Remote/en-US/Pacemaker_Remote.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-<!ENTITY % BOOK_ENTITIES SYSTEM "Pacemaker_Remote.ent">
-%BOOK_ENTITIES;
-]>
-<book>
- <xi:include href="Book_Info.xml" xmlns:xi="http://www.w3.org/2001/XInclude"></xi:include>
-
- <xi:include href="Ch-Intro.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Example.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Options.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-KVM-Tutorial.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Baremetal-Tutorial.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Ch-Alternatives.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
- <xi:include href="Revision_History.xml" xmlns:xi="http://www.w3.org/2001/XInclude"></xi:include>
- <index></index>
-</book>
diff --git a/doc/Pacemaker_Remote/en-US/Revision_History.xml b/doc/Pacemaker_Remote/en-US/Revision_History.xml
deleted file mode 100644
index 433966be33..0000000000
--- a/doc/Pacemaker_Remote/en-US/Revision_History.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-<!ENTITY % BOOK_ENTITIES SYSTEM "Pacemaker_Remote.ent">
-%BOOK_ENTITIES;
-]>
-<appendix id="appe-Pacemaker_Remote-Revision_History">
- <!-- see comment in Book_Info.xml for revision numbering -->
- <title>Revision History</title>
- <simpara>
- <revhistory>
- <revision>
- <revnumber>1-0</revnumber>
- <date>Tue Mar 19 2013</date>
- <author><firstname>David</firstname><surname>Vossel</surname><email>davidvossel@gmail.com</email></author>
- <revdescription><simplelist><member>Import from Pages.app</member></simplelist></revdescription>
- </revision>
- <revision>
- <revnumber>2-0</revnumber>
- <date>Tue May 13 2013</date>
- <author><firstname>David</firstname><surname>Vossel</surname><email>davidvossel@gmail.com</email></author>
- <revdescription><simplelist><member>Added Future Features Section</member></simplelist></revdescription>
- </revision>
- <revision>
- <revnumber>3-0</revnumber>
- <date>Fri Oct 18 2013</date>
- <author><firstname>David</firstname><surname>Vossel</surname><email>davidvossel@gmail.com</email></author>
- <revdescription><simplelist><member>Added Baremetal remote-node feature documentation</member></simplelist></revdescription>
- </revision>
- <revision>
- <revnumber>4-0</revnumber>
- <date>Tue Aug 25 2015</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <revdescription><simplelist><member>Targeted CentOS 7.1 and Pacemaker 1.1.12+, updated for current terminology and practice</member></simplelist></revdescription>
- </revision>
- <revision>
- <revnumber>5-0</revnumber>
- <date>Tue Dec 8 2015</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <revdescription><simplelist><member>Updated for Pacemaker 1.1.14</member></simplelist></revdescription>
- </revision>
- <revision>
- <revnumber>6-0</revnumber>
- <date>Tue May 3 2016</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <revdescription><simplelist><member>Updated for Pacemaker 1.1.15</member></simplelist></revdescription>
- </revision>
- <revision>
- <revnumber>7-0</revnumber>
- <date>Mon Oct 31 2016</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <revdescription><simplelist><member>Updated for Pacemaker 1.1.16</member></simplelist></revdescription>
- </revision>
- <revision>
- <revnumber>7-1</revnumber>
- <date>Fri Jan 12 2018</date>
- <author><firstname>Ken</firstname><surname>Gaillot</surname><email>kgaillot@redhat.com</email></author>
- <revdescription><simplelist><member>Update banner for Pacemaker 2.0 and content for CentOS 7.4 with Pacemaker 1.1.16</member></simplelist></revdescription>
- </revision>
-
- <revision>
- <revnumber>7-2</revnumber>
- <date>Mon Jan 29 2019</date>
- <author>
- <firstname>Jan</firstname><surname>Pokorný</surname>
- <email>jpokorny@redhat.com</email>
- </author>
- <revdescription><simplelist><member>Minor reformatting</member></simplelist></revdescription>
- </revision>
-
- <revision>
- <revnumber>7-3</revnumber>
- <date>Tue Oct 15 2019</date>
- <author>
- <firstname>Ken</firstname><surname>Gaillot</surname>
- <email>kgaillot@redhat.com</email>
- </author>
- <revdescription><simplelist><member>Minor update for dynamic recheck interval</member></simplelist></revdescription>
- </revision>
-
- </revhistory>
- </simpara>
-</appendix>
diff --git a/doc/Pacemaker_Remote/en-US/images/pcmk-ha-cluster-stack.png b/doc/Pacemaker_Remote/en-US/images/pcmk-ha-cluster-stack.png
deleted file mode 100644
index 163ba4589f..0000000000
Binary files a/doc/Pacemaker_Remote/en-US/images/pcmk-ha-cluster-stack.png and /dev/null differ
diff --git a/doc/Pacemaker_Remote/en-US/images/pcmk-ha-remote-stack.png b/doc/Pacemaker_Remote/en-US/images/pcmk-ha-remote-stack.png
deleted file mode 100644
index 11985a70bc..0000000000
Binary files a/doc/Pacemaker_Remote/en-US/images/pcmk-ha-remote-stack.png and /dev/null differ
diff --git a/doc/Pacemaker_Remote/publican.cfg.in b/doc/Pacemaker_Remote/publican.cfg.in
deleted file mode 100644
index 314bb3d3a6..0000000000
--- a/doc/Pacemaker_Remote/publican.cfg.in
+++ /dev/null
@@ -1,14 +0,0 @@
-# Config::Simple 4.59
-# Fri Apr 23 15:33:52 2010
-
-docname: Pacemaker_Remote
-xml_lang: en-US
-#edition: 1
-type: Book
-version: @PACKAGE_SERIES@
-brand: @PUBLICAN_BRAND@
-product: Pacemaker
-
-chunk_first: 0
-chunk_section_depth: 3
-generate_section_toc_level: 4
diff --git a/doc/README.md b/doc/README.md
index 313c2f62cf..e7fed8694f 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -1,100 +1,70 @@
# Pacemaker Documentation
Pacemaker has multiple forms of documentation:
* The primary end-user documentation is a series of "books":
* Clusters From Scratch: Simplified walk-through of setting up a
cluster for the first time
* Pacemaker Administration: Tips for managing a cluster
* Pacemaker Development: How to work on the Pacemaker code base
* Pacemaker Explained: Configuration reference guide
* Pacemaker Remote: Configuration and walk-throughs for extended
clusters
- The source for these is kept beneath this directory. Generated versions
- are available online in epub, PDF, and HTML format at:
+ The source for these is kept in this directory's sphinx subdirectory.
+ Generated versions are available online in epub, PDF, and HTML format at:
https://clusterlabs.org/pacemaker/doc/
* Annotated source code in HTML format can be generated by running
"make global" in this directory, which requires the gtags and htags tools.
This is generated for releases and can be viewed online at:
https://clusterlabs.org/pacemaker/global/
* Pacemaker manual pages are generated and installed automatically when
building the software. HTML versions can be generated by running
"make manhtml" in this directory, which requires the groff tool.
This is generated for releases and can be viewed online at:
https://clusterlabs.org/pacemaker/man/
* For developers, documentation for Pacemaker's public C API is generated
by running "make doxygen" in this directory, which requires the doxygen tool.
This is generated for releases and can be viewed online at:
https://clusterlabs.org/pacemaker/doxygen/
* Also for developers, a report of Pacemaker ABI compatibility between any two
commits can be generated by running in this directory:
make LAST_RELEASE=$EARLIER_COMMIT TAG=$NEWER_COMMIT abi-www
which requires the abi-compliance-checker tool. This is generated for each
release compared to the previous release and can be viewed online at:
https://clusterlabs.org/pacemaker/abi/
* In addition, there are a few old text files in this directory focusing on
particular characteristics of Pacemaker clusters. These are mostly outdated
but do still have some useful information. The plan is to incorporate an
updated version of them into the books.
## Editing the Books
-We are currently transitioning from using Publican to Sphinx
-to generate the books.
-
-### Publican
-
-Each book has a subdirectory by book title, containing a en-US subdirectory.
-
-Each book's en-US directory has .txt files, which are the chapter sources in
-asciidoc format. The file asciidoc.reference in this directory has a quick
-guide to asciidoc; search online for more detailed help.
-
-Once you have edited the asciidoc as desired, run "make" in this directory
-to generate all the books locally. You can view the results by pointing your
-web browser to (replacing BOOK\_TITLE appropriately):
-
- file:///path/to/checkout/doc/BOOK_TITLE/publish/
-
-Each en-US subdirectory also contains some raw XML files of lesser interest:
-
-* Author\_Group.xml: This contains the author listing at the top of the
- generated book. To avoid clutter, we just put "Pacemaker project
- contributors" here and list individual authors in the revision history, so
- this typically does not need to be edited.
-* Book\_Info.xml: Revision numbers, etc. This is generally updated only for
- official releases.
-* Revision\_History.xml: This can be updated for any change, listing the
- individual authors.
-
-### Sphinx
-
-There is a sphinx subdirectory here with a subdirectory for each book by title.
-Each book's directory contains .rst files, which are the chapter sources in
+The sphinx subdirectory has a subdirectory for each book by title. Each book's
+directory contains .rst files, which are the chapter sources in
reStructuredText format (with index.rst as the starting point).
Once you have edited the sources as desired, run "make" in the sphinx
subdirectory to generate all the books locally. You can view the results by
pointing your web browser to (replacing PATH\_TO\_CHECKOUT and BOOK\_TITLE
appropriately):
file:///PATH_TO_CHECKOUT/doc/sphinx/BOOK_TITLE/_build/html/index.html
See the comments at the top of doc/sphinx/Makefile.am for various options you
can use. For a guide to sphinx-flavored reStructuredText, see:
https://www.sphinx-doc.org/en/master/usage/restructuredtext/
diff --git a/doc/publican-clusterlabs/COPYING b/doc/publican-clusterlabs/COPYING
deleted file mode 100644
index 44306613e2..0000000000
--- a/doc/publican-clusterlabs/COPYING
+++ /dev/null
@@ -1 +0,0 @@
-SETUP This file should contain your COPYRIGHT License
\ No newline at end of file
diff --git a/doc/publican-clusterlabs/README b/doc/publican-clusterlabs/README
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/doc/publican-clusterlabs/defaults.cfg b/doc/publican-clusterlabs/defaults.cfg
deleted file mode 100644
index 3f6cdc5c1d..0000000000
--- a/doc/publican-clusterlabs/defaults.cfg
+++ /dev/null
@@ -1,6 +0,0 @@
-# Config::Simple 4.59
-# Thu Nov 12 09:56:27 2009
-
-doc_url: http://www.clusterlabs.org/wiki/Documentation
-prod_url: http://www.clusterlabs.org
-
diff --git a/doc/publican-clusterlabs/en-US/Feedback.xml b/doc/publican-clusterlabs/en-US/Feedback.xml
deleted file mode 100644
index b854682439..0000000000
--- a/doc/publican-clusterlabs/en-US/Feedback.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<section>
- <title>We Need Feedback!</title>
- <indexterm>
- <primary>feedback</primary>
- <secondary>contact information for this manual</secondary>
- </indexterm>
- <para>
- If you find a typographical error in this manual, or if you have thought of a way to make this manual better, we would love to hear from you!
- Please submit a report in Bugzilla<footnote><para><ulink url="http://bugs.clusterlabs.org"/></para></footnote> against the product <application>&PRODUCT;.</application>
- </para>
- <para>
- When submitting a bug report, be sure to mention the manual's identifier: <citetitle>&BOOKID;</citetitle>
- </para>
- <para>
- If you have a suggestion for improving the documentation, try to be as specific as possible when describing it.
- If you have found an error, please include the section number and some of the surrounding text so we can find it easily.
- </para>
-</section>
diff --git a/doc/publican-clusterlabs/en-US/Legal_Notice.xml b/doc/publican-clusterlabs/en-US/Legal_Notice.xml
deleted file mode 100644
index dee66b7a20..0000000000
--- a/doc/publican-clusterlabs/en-US/Legal_Notice.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE legalnotice PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<legalnotice>
- <para>
- Copyright <trademark class="copyright"></trademark> &YEAR; &HOLDER;.
- </para>
- <para>
- The text of and illustrations in this document are licensed under version
- 4.0 or later of the Creative Commons Attribution-ShareAlike International
- Public License ("CC-BY-SA")<footnote><para>An explanation of CC-BY-SA is
- available at <ulink url="https://creativecommons.org/licenses/by-sa/4.0/" />
- </para></footnote>.
- </para>
- <para>
- In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
- </para>
- <para>
- In addition to the requirements of this license, the following activities are looked upon favorably:
- <orderedlist>
- <listitem>
- <para>
- If you are distributing Open Publication works on hardcopy or CD-ROM, you provide email notification to the authors of your intent to redistribute at least thirty days before your manuscript or media freeze, to give the authors time to provide updated documents.
- This notification should describe modifications, if any, made to the document.
- </para>
- </listitem>
- <listitem>
- <para>
- All substantive modifications (including deletions) be either clearly marked up in the document or else described in an attachment to the document.
- </para>
- </listitem>
- <listitem>
- <para>
- Finally, while it is not mandatory under this license, it is considered good form to offer a free copy of any hardcopy or CD-ROM expression of the author(s) work.
- </para>
- </listitem>
- </orderedlist>
- </para>
-</legalnotice>
diff --git a/doc/publican-clusterlabs/en-US/css/overrides.css b/doc/publican-clusterlabs/en-US/css/overrides.css
deleted file mode 100644
index 5a5f639b97..0000000000
--- a/doc/publican-clusterlabs/en-US/css/overrides.css
+++ /dev/null
@@ -1,69 +0,0 @@
-a:link {
- color:#0076d6;
-}
-
-a:visited {
- color:grey;
-}
-
-h1 {
- color:#172969;
-}
-
-.producttitle {
- background: #2C4081 url(../images/h1-bg.png) top left repeat;
-}
-
-.section h1.title {
- color:#2C4081;
-}
-
-
-h2,h3,h4,h5,h6 {
- color:#2C4081;
-}
-
-table {
- border:1px solid #732f2f;
-}
-
-table th {
- background-color:#2C4081;
-}
-
-table tr.even td {
- background-color: #e3e0d6;
-}
-
-#title a {
- height: 54px;
-}
-
-.term{
- color:#172969;
-}
-
-.revhistory table th {
- color: #172969;
-}
-
-.edition {
- color: #172969;
-}
-
-span.remark{
- background-color: #ffff00;
-}
-
-.example {
- border: 1px solid #732f2f;
- background-color: #e3e0d6;
-}
-
-.programlisting {
- border: 1px solid #732f2f;
-}
-
-.screen {
- border: 1px solid #732f2f;
-}
diff --git a/doc/publican-clusterlabs/en-US/images/1.png b/doc/publican-clusterlabs/en-US/images/1.png
deleted file mode 100644
index 520ff22683..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/1.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/1.svg b/doc/publican-clusterlabs/en-US/images/1.svg
deleted file mode 100644
index a874e974c1..0000000000
--- a/doc/publican-clusterlabs/en-US/images/1.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg1">
- <defs
- id="defs1" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text1"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan1">1</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/10.png b/doc/publican-clusterlabs/en-US/images/10.png
deleted file mode 100644
index 6fc0647356..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/10.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/10.svg b/doc/publican-clusterlabs/en-US/images/10.svg
deleted file mode 100644
index 6892e0de9b..0000000000
--- a/doc/publican-clusterlabs/en-US/images/10.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg10">
- <defs
- id="defs10" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text10"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan10">10</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/11.png b/doc/publican-clusterlabs/en-US/images/11.png
deleted file mode 100644
index 2887c4c8ac..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/11.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/11.svg b/doc/publican-clusterlabs/en-US/images/11.svg
deleted file mode 100644
index 7f5c269cfc..0000000000
--- a/doc/publican-clusterlabs/en-US/images/11.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg11">
- <defs
- id="defs11" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text11"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan11">11</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/12.png b/doc/publican-clusterlabs/en-US/images/12.png
deleted file mode 100644
index 2667299e3a..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/12.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/12.svg b/doc/publican-clusterlabs/en-US/images/12.svg
deleted file mode 100644
index 9bcf3cc586..0000000000
--- a/doc/publican-clusterlabs/en-US/images/12.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg12">
- <defs
- id="defs12" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text12"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan12">12</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/13.png b/doc/publican-clusterlabs/en-US/images/13.png
deleted file mode 100644
index fb9f00ce66..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/13.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/13.svg b/doc/publican-clusterlabs/en-US/images/13.svg
deleted file mode 100644
index 796664551f..0000000000
--- a/doc/publican-clusterlabs/en-US/images/13.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg13">
- <defs
- id="defs13" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text13"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan13">13</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/14.png b/doc/publican-clusterlabs/en-US/images/14.png
deleted file mode 100644
index 2f6d426846..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/14.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/14.svg b/doc/publican-clusterlabs/en-US/images/14.svg
deleted file mode 100644
index 869be6ab2b..0000000000
--- a/doc/publican-clusterlabs/en-US/images/14.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg14">
- <defs
- id="defs14" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text14"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan14">14</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/15.png b/doc/publican-clusterlabs/en-US/images/15.png
deleted file mode 100644
index 62645715c3..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/15.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/15.svg b/doc/publican-clusterlabs/en-US/images/15.svg
deleted file mode 100644
index 003f16c2e8..0000000000
--- a/doc/publican-clusterlabs/en-US/images/15.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg15">
- <defs
- id="defs15" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text15"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan15">15</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/16.png b/doc/publican-clusterlabs/en-US/images/16.png
deleted file mode 100644
index 3873d725b4..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/16.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/16.svg b/doc/publican-clusterlabs/en-US/images/16.svg
deleted file mode 100644
index ab4bee018b..0000000000
--- a/doc/publican-clusterlabs/en-US/images/16.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg16">
- <defs
- id="defs16" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text16"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan16">16</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/17.png b/doc/publican-clusterlabs/en-US/images/17.png
deleted file mode 100644
index 66615089cb..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/17.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/17.svg b/doc/publican-clusterlabs/en-US/images/17.svg
deleted file mode 100644
index ff29b7aa41..0000000000
--- a/doc/publican-clusterlabs/en-US/images/17.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg17">
- <defs
- id="defs17" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text17"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan17">17</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/18.png b/doc/publican-clusterlabs/en-US/images/18.png
deleted file mode 100644
index cf5cd4584b..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/18.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/18.svg b/doc/publican-clusterlabs/en-US/images/18.svg
deleted file mode 100644
index 6225d8a91a..0000000000
--- a/doc/publican-clusterlabs/en-US/images/18.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg18">
- <defs
- id="defs18" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text18"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan18">18</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/19.png b/doc/publican-clusterlabs/en-US/images/19.png
deleted file mode 100644
index 0e481be1fe..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/19.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/19.svg b/doc/publican-clusterlabs/en-US/images/19.svg
deleted file mode 100644
index efd3c0eeb9..0000000000
--- a/doc/publican-clusterlabs/en-US/images/19.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg19">
- <defs
- id="defs19" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text19"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan19">19</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/2.png b/doc/publican-clusterlabs/en-US/images/2.png
deleted file mode 100644
index ccaa4240d6..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/2.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/2.svg b/doc/publican-clusterlabs/en-US/images/2.svg
deleted file mode 100644
index 27100aca9f..0000000000
--- a/doc/publican-clusterlabs/en-US/images/2.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg2">
- <defs
- id="defs2" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text2"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan2">2</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/20.png b/doc/publican-clusterlabs/en-US/images/20.png
deleted file mode 100644
index a3852a14e2..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/20.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/20.svg b/doc/publican-clusterlabs/en-US/images/20.svg
deleted file mode 100644
index 7d727359a3..0000000000
--- a/doc/publican-clusterlabs/en-US/images/20.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg20">
- <defs
- id="defs20" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text20"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan20">20</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/21.png b/doc/publican-clusterlabs/en-US/images/21.png
deleted file mode 100644
index b958a30b0b..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/21.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/21.svg b/doc/publican-clusterlabs/en-US/images/21.svg
deleted file mode 100644
index babe3ad790..0000000000
--- a/doc/publican-clusterlabs/en-US/images/21.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg21">
- <defs
- id="defs21" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text21"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan21">21</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/22.png b/doc/publican-clusterlabs/en-US/images/22.png
deleted file mode 100644
index e4c68b1407..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/22.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/22.svg b/doc/publican-clusterlabs/en-US/images/22.svg
deleted file mode 100644
index d7c7af500d..0000000000
--- a/doc/publican-clusterlabs/en-US/images/22.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg22">
- <defs
- id="defs22" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text22"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan22">22</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/23.png b/doc/publican-clusterlabs/en-US/images/23.png
deleted file mode 100644
index a627327317..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/23.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/23.svg b/doc/publican-clusterlabs/en-US/images/23.svg
deleted file mode 100644
index 399deffb41..0000000000
--- a/doc/publican-clusterlabs/en-US/images/23.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg23">
- <defs
- id="defs23" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text23"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan23">23</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/24.png b/doc/publican-clusterlabs/en-US/images/24.png
deleted file mode 100644
index bdcea873a0..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/24.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/24.svg b/doc/publican-clusterlabs/en-US/images/24.svg
deleted file mode 100644
index 25a37e8dc8..0000000000
--- a/doc/publican-clusterlabs/en-US/images/24.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg24">
- <defs
- id="defs24" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text24"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan24">24</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/25.png b/doc/publican-clusterlabs/en-US/images/25.png
deleted file mode 100644
index db5a9eeedb..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/25.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/25.svg b/doc/publican-clusterlabs/en-US/images/25.svg
deleted file mode 100644
index adfb67af3e..0000000000
--- a/doc/publican-clusterlabs/en-US/images/25.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg25">
- <defs
- id="defs25" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text25"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan25">25</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/26.png b/doc/publican-clusterlabs/en-US/images/26.png
deleted file mode 100644
index 4bf703699f..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/26.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/26.svg b/doc/publican-clusterlabs/en-US/images/26.svg
deleted file mode 100644
index 6e8e5d62b8..0000000000
--- a/doc/publican-clusterlabs/en-US/images/26.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg26">
- <defs
- id="defs26" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text26"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan26">26</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/27.png b/doc/publican-clusterlabs/en-US/images/27.png
deleted file mode 100644
index d0105b0a43..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/27.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/27.svg b/doc/publican-clusterlabs/en-US/images/27.svg
deleted file mode 100644
index 299194e448..0000000000
--- a/doc/publican-clusterlabs/en-US/images/27.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg27">
- <defs
- id="defs27" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text27"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan27">27</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/28.png b/doc/publican-clusterlabs/en-US/images/28.png
deleted file mode 100644
index 19eac5c489..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/28.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/28.svg b/doc/publican-clusterlabs/en-US/images/28.svg
deleted file mode 100644
index 5df71b8555..0000000000
--- a/doc/publican-clusterlabs/en-US/images/28.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg28">
- <defs
- id="defs28" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text28"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan28">28</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/29.png b/doc/publican-clusterlabs/en-US/images/29.png
deleted file mode 100644
index e64d4e6e32..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/29.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/29.svg b/doc/publican-clusterlabs/en-US/images/29.svg
deleted file mode 100644
index 88aa692be4..0000000000
--- a/doc/publican-clusterlabs/en-US/images/29.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg29">
- <defs
- id="defs29" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text29"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan29">29</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/3.png b/doc/publican-clusterlabs/en-US/images/3.png
deleted file mode 100644
index 73478793d5..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/3.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/3.svg b/doc/publican-clusterlabs/en-US/images/3.svg
deleted file mode 100644
index 7954fa5a0d..0000000000
--- a/doc/publican-clusterlabs/en-US/images/3.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg3">
- <defs
- id="defs3" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text3"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan3">3</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/4.png b/doc/publican-clusterlabs/en-US/images/4.png
deleted file mode 100644
index 9ae22affd1..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/4.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/4.svg b/doc/publican-clusterlabs/en-US/images/4.svg
deleted file mode 100644
index c97f7658a5..0000000000
--- a/doc/publican-clusterlabs/en-US/images/4.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg4">
- <defs
- id="defs4" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text4"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan4">4</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/5.png b/doc/publican-clusterlabs/en-US/images/5.png
deleted file mode 100644
index bba793a77a..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/5.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/5.svg b/doc/publican-clusterlabs/en-US/images/5.svg
deleted file mode 100644
index 6450446938..0000000000
--- a/doc/publican-clusterlabs/en-US/images/5.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg5">
- <defs
- id="defs5" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text5"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan5">5</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/6.png b/doc/publican-clusterlabs/en-US/images/6.png
deleted file mode 100644
index b5483fbb58..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/6.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/6.svg b/doc/publican-clusterlabs/en-US/images/6.svg
deleted file mode 100644
index 45af47a1cd..0000000000
--- a/doc/publican-clusterlabs/en-US/images/6.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg6">
- <defs
- id="defs6" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text6"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan6">6</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/7.png b/doc/publican-clusterlabs/en-US/images/7.png
deleted file mode 100644
index d085f2d805..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/7.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/7.svg b/doc/publican-clusterlabs/en-US/images/7.svg
deleted file mode 100644
index 2e9ffec986..0000000000
--- a/doc/publican-clusterlabs/en-US/images/7.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg7">
- <defs
- id="defs7" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text7"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan7">7</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/8.png b/doc/publican-clusterlabs/en-US/images/8.png
deleted file mode 100644
index f37327163d..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/8.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/8.svg b/doc/publican-clusterlabs/en-US/images/8.svg
deleted file mode 100644
index 340dbce58e..0000000000
--- a/doc/publican-clusterlabs/en-US/images/8.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg8">
- <defs
- id="defs8" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text8"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan8">8</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/9.png b/doc/publican-clusterlabs/en-US/images/9.png
deleted file mode 100644
index e8709d448b..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/9.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/9.svg b/doc/publican-clusterlabs/en-US/images/9.svg
deleted file mode 100644
index 3838627082..0000000000
--- a/doc/publican-clusterlabs/en-US/images/9.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="32"
- height="32"
- id="svg9">
- <defs
- id="defs9" />
- <circle
- cx="16"
- cy="16"
- r="14"
- id="circle"
- style="fill:#aa0000" />
- <text
- x="16"
- y="16"
- transform="scale(0.89833804,1.1131667)"
- id="text9"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="18"
- y="20"
- id="tspan9">9</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/Pacemaker-stack.svg b/doc/publican-clusterlabs/en-US/images/Pacemaker-stack.svg
deleted file mode 100644
index 54da570000..0000000000
--- a/doc/publican-clusterlabs/en-US/images/Pacemaker-stack.svg
+++ /dev/null
@@ -1,1083 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="1052.3622"
- height="744.09448"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.46+devel"
- sodipodi:docname="Pacemaker-stack.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape"
- version="1.0"
- enable-background="new">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient3468">
- <stop
- style="stop-color:#000000;stop-opacity:0.31481481;"
- offset="0"
- id="stop3470" />
- <stop
- style="stop-color:#ff0000;stop-opacity:0.125;"
- offset="1"
- id="stop3472" />
- </linearGradient>
- <marker
- inkscape:stockid="Arrow1Lend"
- orient="auto"
- refY="0.0"
- refX="0.0"
- id="Arrow1Lend"
- style="overflow:visible;">
- <path
- id="path6465"
- d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
- style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
- transform="scale(0.8) rotate(180) translate(12.5,0)" />
- </marker>
- <marker
- inkscape:stockid="Arrow2Lstart"
- orient="auto"
- refY="0.0"
- refX="0.0"
- id="Arrow2Lstart"
- style="overflow:visible">
- <path
- id="path6480"
- style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
- d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
- transform="scale(1.1) translate(1,0)" />
- </marker>
- <linearGradient
- id="linearGradient4767">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop4769" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop4771" />
- </linearGradient>
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 526.18109 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="744.09448 : 526.18109 : 1"
- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
- id="perspective10" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="20"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="0.84801059"
- inkscape:cx="542.71246"
- inkscape:cy="382.07947"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showgrid="false"
- inkscape:window-width="1680"
- inkscape:window-height="1001"
- inkscape:window-x="0"
- inkscape:window-y="26"
- inkscape:snap-global="true"
- inkscape:window-maximized="1">
- <inkscape:grid
- type="xygrid"
- id="grid9704"
- visible="true"
- enabled="true"
- spacingx="2px"
- spacingy="2px"
- dotted="true" />
- </sodipodi:namedview>
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:groupmode="layer"
- id="layer2"
- inkscape:label="Areas"
- style="display:inline">
- <rect
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#c8c8c8;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.14258301;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3.42774902, 3.42774902;stroke-dashoffset:0;display:inline;font-family:Sans;-inkscape-font-specification:Sans"
- id="rect5128"
- width="826.31659"
- height="311.55591"
- x="122.95211"
- y="415.39191" />
- <rect
- style="fill:#1d00fb;fill-opacity:0.1254902;fill-rule:evenodd;stroke:#000000;stroke-width:1.0216763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3.06502925, 3.06502925;stroke-dashoffset:0"
- id="rect9869"
- width="415.27484"
- height="390.60483"
- x="406.04105"
- y="24.711681" />
- <rect
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#969696;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.82043868;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.4613161, 2.4613161;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans"
- id="rect9835"
- width="303.51474"
- height="286.53323"
- x="137.8407"
- y="428.20981" />
- <rect
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706000000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.8,4.8;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans"
- id="rect9833"
- width="443.37769"
- height="233.1974"
- x="490.47974"
- y="477.91968" />
- <rect
- style="fill:#000000;fill-opacity:0.03921569;fill-rule:evenodd;stroke:#000000;stroke-width:2.02884078;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6.08652264, 6.08652264;stroke-dashoffset:0;display:inline"
- id="rect3450"
- width="149.7639"
- height="164.98082"
- x="661.49438"
- y="36.672237" />
- <rect
- y="639.48785"
- x="149.6749"
- height="65.67556"
- width="280.07031"
- id="rect4863"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:#000000;stroke-width:0.99444085;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.98332261, 2.98332261;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans" />
- </g>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1"
- style="display:inline">
- <text
- xml:space="preserve"
- style="font-size:12px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
- x="346.99619"
- y="817.37476"
- id="text4785"><tspan
- sodipodi:role="line"
- id="tspan4787"
- x="346.99619"
- y="817.37476" /></text>
- <flowRoot
- xml:space="preserve"
- id="flowRoot4887"
- style="font-size:12px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"><flowRegion
- id="flowRegion4889"><rect
- id="rect4891"
- width="176.30978"
- height="85.671654"
- x="264.87854"
- y="756.44318" /></flowRegion><flowPara
- id="flowPara4893" /></flowRoot> <flowRoot
- xml:space="preserve"
- id="flowRoot5303"
- style="font-size:22px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"><flowRegion
- id="flowRegion5305"><rect
- id="rect5307"
- width="110.59427"
- height="24.664909"
- x="555.35828"
- y="146.1257" /></flowRegion><flowPara
- id="flowPara5309" /></flowRoot> <flowRoot
- xml:space="preserve"
- id="flowRoot5392"
- style="font-size:10px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"><flowRegion
- id="flowRegion5394"><rect
- id="rect5396"
- width="88.316284"
- height="44.555965"
- x="-177.42821"
- y="246.37662" /></flowRegion><flowPara
- id="flowPara5398" /></flowRoot> <rect
- style="font-size:36px;fill:#ab37c3;fill-opacity:0.62835245;stroke:#000000;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect5101"
- width="320"
- height="60"
- x="486.03693"
- y="345.32062" />
- <text
- xml:space="preserve"
- style="font-size:28px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial"
- x="646.10529"
- y="382.73761"
- id="text5103"><tspan
- sodipodi:role="line"
- id="tspan5105"
- x="646.10529"
- y="382.73761">OpenAIS</tspan></text>
- <rect
- style="font-size:22px;fill:#f0f300;fill-opacity:0.96168584;stroke:#000000;stroke-width:1.79003513;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect5113"
- width="85.653038"
- height="119.70997"
- x="493.6633"
- y="182.87541" />
- <text
- xml:space="preserve"
- style="font-size:22px;font-style:normal;font-weight:normal;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial"
- x="537.14764"
- y="243.33733"
- id="text5115"><tspan
- sodipodi:role="line"
- id="tspan5117"
- x="288.1481"
- y="492.33685">LRM</tspan></text>
- <rect
- style="font-size:22px;fill:#00fab4;fill-opacity:0.31372549;stroke:#000000;stroke-width:0.72598213;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect5386"
- width="60"
- height="20"
- x="590.31262"
- y="144.68628" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial"
- x="620.38293"
- y="160.41284"
- id="text5388"><tspan
- sodipodi:role="line"
- id="tspan5390"
- x="620.38293"
- y="160.41284">SBD</tspan></text>
- <rect
- style="font-size:22px;fill:#f9ea00;fill-opacity:0.5098038;stroke:#000000;stroke-width:0.93765765;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect5177"
- width="120.56235"
- height="19.44669"
- x="339.75027"
- y="375.23956" />
- <text
- xml:space="preserve"
- style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial"
- x="400.37854"
- y="389.28772"
- id="text5179"><tspan
- sodipodi:role="line"
- id="tspan5181"
- x="400.37854"
- y="389.28772">dlm_controld</tspan></text>
- <rect
- style="font-size:22px;fill:#f9ea00;fill-opacity:0.5098038;stroke:#000000;stroke-width:0.93805921;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect5228"
- width="120.56194"
- height="19.463411"
- x="339.18832"
- y="345.77615" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial"
- x="399.81653"
- y="361.97128"
- id="text5230"><tspan
- sodipodi:role="line"
- id="tspan5232"
- x="399.81653"
- y="361.97128">ocfs2_controld</tspan></text>
- <rect
- style="font-size:22px;fill:#f9ea00;fill-opacity:0.5098038;stroke:#000000;stroke-width:0.93805921;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect5241"
- width="120.56194"
- height="19.463411"
- x="339.18832"
- y="315.23956" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial"
- x="399.81647"
- y="331.43469"
- id="text5243"><tspan
- sodipodi:role="line"
- id="tspan5245"
- x="399.81647"
- y="331.43469">clvmd</tspan></text>
- <rect
- style="font-size:22px;fill:#00c500;fill-opacity:0.5098038;stroke:#000000;stroke-width:2.23176122;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect5107"
- width="249.62111"
- height="69.6679"
- x="559.74811"
- y="261.31393" />
- <text
- xml:space="preserve"
- style="font-size:26px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial"
- x="683.57037"
- y="303.89301"
- id="text5109"><tspan
- sodipodi:role="line"
- id="tspan5111"
- x="683.57037"
- y="303.89301">Pacemaker</tspan></text>
- <rect
- style="font-size:22px;fill:#00c500;fill-opacity:0.5098038;stroke:#000000;stroke-width:0.87441856;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect5332"
- width="60"
- height="60"
- x="670.31262"
- y="214.68628" />
- <text
- xml:space="preserve"
- style="font-size:10px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial"
- x="700.33459"
- y="248.26538"
- id="text5649"><tspan
- sodipodi:role="line"
- id="tspan5651"
- x="700.33459"
- y="248.26538">CIB</tspan></text>
- <rect
- style="font-size:22px;fill:#00c500;fill-opacity:0.5098038;stroke:#000000;stroke-width:0.87555265;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect5653"
- width="60"
- height="60"
- x="740.31262"
- y="214.68628" />
- <text
- xml:space="preserve"
- style="font-size:10px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial"
- x="770.12708"
- y="240.96313"
- id="text5655"><tspan
- sodipodi:role="line"
- id="tspan5657"
- x="770.12708"
- y="240.96313">Policy</tspan><tspan
- sodipodi:role="line"
- x="770.12708"
- y="253.46313"
- id="tspan5659">Engine</tspan></text>
- <path
- style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 684.55866,296.14788 0,0"
- id="path9147"
- inkscape:connector-type="polyline" />
- <flowRoot
- xml:space="preserve"
- id="flowRoot9370"
- style="font-size:10px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"><flowRegion
- id="flowRegion9372"><rect
- id="rect9374"
- width="168.62997"
- height="73.112297"
- x="587.25684"
- y="472.87146" /></flowRegion><flowPara
- id="flowPara9376" /></flowRoot> <flowRoot
- xml:space="preserve"
- id="flowRoot9390"
- style="font-size:10px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"><flowRegion
- id="flowRegion9392"><rect
- id="rect9394"
- width="143.86613"
- height="64.857681"
- x="714.61371"
- y="458.72067" /></flowRegion><flowPara
- id="flowPara9396" /></flowRoot> <flowRoot
- xml:space="preserve"
- id="flowRoot9404"
- style="font-size:10px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"><flowRegion
- id="flowRegion9406"><rect
- id="rect9408"
- width="94.338448"
- height="67.216141"
- x="709.89679"
- y="516.50299" /></flowRegion><flowPara
- id="flowPara9410" /></flowRoot> <rect
- style="opacity:1;fill:#000000;fill-opacity:0.5098038;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
- id="rect9644"
- width="0"
- height="0"
- x="860"
- y="714.09448" />
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- x="225.69032"
- y="477.62704"
- id="text9733"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan9735"
- x="225.69032"
- y="477.62704">ext3, XFS</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- x="358.56805"
- y="476.44781"
- id="text9739"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan9741"
- x="358.56805"
- y="476.44781">OCFS2</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- x="288.00186"
- y="548.08936"
- id="text9745"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan9747"
- x="288.00186"
- y="548.08936">cLVM2</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- x="218.04878"
- y="615.1178"
- id="text9751"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan9753"
- x="218.04878"
- y="615.1178">DRBD</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- x="350.87958"
- y="615.1178"
- id="text9757"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan9759"
- x="350.87958"
- y="615.1178">Multipath IO</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- x="218.86955"
- y="678.60858"
- id="text9763"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan9765"
- x="218.86955"
- y="678.60858">Local disks</tspan></text>
- <rect
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:#000000;stroke-width:1.62952805;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.88858379, 4.88858379;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans"
- id="rect9767"
- width="112.06894"
- height="49.757401"
- x="298.82321"
- y="646.26764" />
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- x="353.23804"
- y="664.41174"
- id="text9769"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan9771"
- x="353.23804"
- y="664.41174">SAN</tspan><tspan
- sodipodi:role="line"
- x="353.23804"
- y="681.91174"
- id="tspan9773">FC(oE), iSCSI</tspan></text>
- <path
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:none;stroke:#000000;stroke-width:0.85381305px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
- d="m 288.44229,582.26051 0,116.63947"
- id="path9775" />
- <rect
- y="518.65619"
- x="406.95398"
- height="49.757401"
- width="112.06894"
- id="rect4885"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:#000000;stroke-width:1.62952805;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.88858379, 4.88858379;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans" />
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- x="466.32343"
- y="548.07935"
- id="text9779"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan9781"
- x="466.32343"
- y="548.07935">DLM</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- x="614.20917"
- y="550.09448"
- id="text9785"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan9787"
- x="614.20917"
- y="550.09448">SCTP</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- x="745.90765"
- y="547.73602"
- id="text9791"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan9793"
- x="745.90765"
- y="547.73602">TCP</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- x="675.76727"
- y="670.86316"
- id="text9797"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan9799"
- x="675.76727"
- y="670.86316">Ethernet</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- x="805.06036"
- y="668.5047"
- id="text9803"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan9805"
- x="805.06036"
- y="668.5047">Infiniband</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- x="659.36188"
- y="631.9386"
- id="text9809"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan9811"
- x="659.36188"
- y="631.9386">Bonding</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- x="875.24768"
- y="536.03778"
- id="text9815"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan9817"
- x="875.24768"
- y="536.03778">UDP</tspan><tspan
- sodipodi:role="line"
- x="875.24768"
- y="553.53778"
- id="tspan4926">multicast</tspan></text>
- <rect
- style="opacity:1;fill:#1d00fb;fill-opacity:0.4750958;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1"
- id="rect9843"
- width="0"
- height="10"
- x="80"
- y="124.09448" />
- <rect
- style="fill:#1d00fb;fill-opacity:0.4750958;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;display:inline"
- id="rect3432"
- width="120"
- height="40"
- x="675.35095"
- y="98.365234" />
- <text
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial"
- x="731.12549"
- y="124.02045"
- id="text3434"><tspan
- sodipodi:role="line"
- id="tspan3436"
- x="731.12549"
- y="124.02045">Fat GUI</tspan></text>
- <rect
- style="fill:#1d00fb;fill-opacity:0.4750958;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;display:inline"
- id="rect3438"
- width="120"
- height="40"
- x="674.57642"
- y="152.71002" />
- <text
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="730.35095"
- y="178.36523"
- id="text3440"><tspan
- sodipodi:role="line"
- id="tspan3442"
- x="730.35095"
- y="178.36523">CRM Shell</tspan></text>
- <rect
- style="fill:#1d00fd;fill-opacity:0.4745098;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;display:inline"
- id="rect3444"
- width="120"
- height="40"
- x="676.30884"
- y="45.865906" />
- <text
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="732.08337"
- y="71.521118"
- id="text3446"><tspan
- sodipodi:role="line"
- id="tspan3448"
- x="732.08337"
- y="71.521118">Web GUI</tspan></text>
- <rect
- style="opacity:1;fill:#d1fc25;fill-opacity:0.78927199;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect4936"
- width="0"
- height="10"
- x="-240"
- y="14.094482" />
- <rect
- style="font-size:22px;fill:#f9ea00;fill-opacity:0.5098038;stroke:#000000;stroke-width:0.83309597;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect5272"
- width="90.140778"
- height="20.532293"
- x="370.4534"
- y="223.6217" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial"
- x="415.17615"
- y="237.93082"
- id="text3398"><tspan
- sodipodi:role="line"
- id="tspan3400"
- x="415.17615"
- y="237.93082">Filesystems</tspan></text>
- <rect
- style="font-size:22px;fill:#f9ea00;fill-opacity:0.5098038;stroke:#000000;stroke-width:0.83309597;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
- id="rect3402"
- width="90.140778"
- height="20.532293"
- x="370.4534"
- y="254.15399" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="415.17615"
- y="268.4631"
- id="text3404"><tspan
- sodipodi:role="line"
- id="tspan3406"
- x="415.17615"
- y="268.4631">IP address</tspan></text>
- <rect
- style="font-size:22px;fill:#f9ea00;fill-opacity:0.5098038;stroke:#000000;stroke-width:0.83309597;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
- id="rect3408"
- width="90.140778"
- height="20.532293"
- x="370.4534"
- y="283.6217" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="415.17615"
- y="297.93079"
- id="text3410"><tspan
- sodipodi:role="line"
- id="tspan3412"
- x="415.17615"
- y="297.93079">DRBD</tspan></text>
- <rect
- style="font-size:22px;fill:#f9ea00;fill-opacity:0.5098038;stroke:#000000;stroke-width:0.83309597;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
- id="rect3414"
- width="90.140778"
- height="20.532293"
- x="370.31262"
- y="194.15399" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="415.03534"
- y="208.4631"
- id="text3416"><tspan
- sodipodi:role="line"
- id="tspan3418"
- x="415.03534"
- y="208.4631">iSCSI</tspan></text>
- <rect
- style="font-size:22px;fill:#f9ea00;fill-opacity:0.5098038;stroke:#000000;stroke-width:0.83309597;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
- id="rect3420"
- width="90.140778"
- height="20.532293"
- x="370.31262"
- y="163.6217" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="415.03534"
- y="177.93082"
- id="text3422"><tspan
- sodipodi:role="line"
- id="tspan3424"
- x="415.03534"
- y="177.93082">Apache</tspan></text>
- <rect
- style="font-size:22px;fill:#f9ea00;fill-opacity:0.5098038;stroke:#000000;stroke-width:0.83309597;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
- id="rect3426"
- width="90.140778"
- height="20.532293"
- x="370.4534"
- y="44.153984" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="415.17615"
- y="58.463097"
- id="text3428"><tspan
- sodipodi:role="line"
- id="tspan3430"
- x="415.17615"
- y="58.463097">SAP</tspan></text>
- <rect
- style="writing-mode:tb-rl;fill:#d1fc25;fill-opacity:0.78927199;fill-rule:evenodd;stroke:#000000;stroke-width:1.55184007;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect4930"
- width="31.12739"
- height="268.20279"
- x="-501.60672"
- y="44.179905"
- transform="scale(-1,1)" />
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-weight:normal;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial"
- x="484.99542"
- y="174.45819"
- id="text4932"><tspan
- sodipodi:role="line"
- id="tspan4934"
- x="219.26895"
- y="440.18463">OCF agents</tspan></text>
- <rect
- style="font-size:22px;fill:#f9ea00;fill-opacity:0.5098038;stroke:#000000;stroke-width:0.83309597;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
- id="rect4938"
- width="90.140778"
- height="20.532293"
- x="370.31262"
- y="133.6217" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="415.03534"
- y="147.9308"
- id="text4940"><tspan
- sodipodi:role="line"
- id="tspan4942"
- x="415.03534"
- y="147.9308">Xen</tspan></text>
- <rect
- style="font-size:22px;fill:#f9ea00;fill-opacity:0.5098038;stroke:#000000;stroke-width:0.83309597;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
- id="rect4944"
- width="90.140778"
- height="20.532293"
- x="370.31262"
- y="103.62169" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="415.03534"
- y="117.9308"
- id="text4946"><tspan
- sodipodi:role="line"
- id="tspan4948"
- x="415.03534"
- y="117.9308">libvirt</tspan></text>
- <rect
- style="font-size:22px;fill:#f9ea00;fill-opacity:0.5098038;stroke:#000000;stroke-width:0.83309597;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
- id="rect4950"
- width="90.140778"
- height="20.532293"
- x="370.4534"
- y="73.621689" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="415.17615"
- y="87.930801"
- id="text4952"><tspan
- sodipodi:role="line"
- id="tspan4954"
- x="415.17615"
- y="87.930801">MySQL</tspan></text>
- <rect
- style="writing-mode:tb-rl;fill:#d1fc25;fill-opacity:0.78927199;fill-rule:evenodd;stroke:#000000;stroke-width:1.61414051;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
- id="rect5020"
- width="29.88586"
- height="151.11201"
- x="-540.25555"
- y="44.743347"
- transform="scale(-1,1)" />
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-weight:normal;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="525.37073"
- y="110.02466"
- id="text5022"><tspan
- sodipodi:role="line"
- id="tspan5024"
- x="154.83542"
- y="480.55994">LSB</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial"
- x="528.08606"
- y="91.580811"
- id="text5026"><tspan
- sodipodi:role="line"
- id="tspan5028"
- x="147.89059"
- y="483.27527"> </tspan></text>
- <rect
- style="writing-mode:tb-rl;fill:#d1fc25;fill-opacity:0.78927199;fill-rule:evenodd;stroke:#000000;stroke-width:1.60802722;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
- id="rect5057"
- width="29.891973"
- height="149.93889"
- x="-574.25861"
- y="44.740292"
- transform="scale(-1,1)" />
- <text
- xml:space="preserve"
- style="font-size:14.30705261px;font-style:normal;font-weight:normal;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="571.63904"
- y="109.98261"
- id="text5059"
- transform="scale(0.9785384,1.0219323)"><tspan
- sodipodi:role="line"
- id="tspan5061"
- x="156.69727"
- y="524.92438">STONITH</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-weight:normal;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="568.08606"
- y="91.580811"
- id="text5063"><tspan
- sodipodi:role="line"
- id="tspan5065"
- x="147.89059"
- y="523.27527"> </tspan></text>
- <rect
- style="font-size:22px;fill:#00fab4;fill-opacity:0.31372549;stroke:#000000;stroke-width:0.72598213;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
- id="rect5085"
- width="60"
- height="20"
- x="590.31262"
- y="114.68628" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="620.38293"
- y="130.41283"
- id="text5087"><tspan
- sodipodi:role="line"
- id="tspan5089"
- x="620.38293"
- y="130.41283">iLO</tspan></text>
- <rect
- style="font-size:22px;fill:#00fab4;fill-opacity:0.31372549;stroke:#000000;stroke-width:0.72598213;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
- id="rect5091"
- width="60"
- height="20"
- x="590.31262"
- y="84.686279" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="620.38293"
- y="100.41283"
- id="text5093"><tspan
- sodipodi:role="line"
- id="tspan5095"
- x="620.38293"
- y="100.41283">DRAC</tspan></text>
- <rect
- style="font-size:22px;fill:#00fab4;fill-opacity:0.31372549;stroke:#000000;stroke-width:0.72598213;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
- id="rect5097"
- width="60"
- height="20"
- x="590.31262"
- y="54.686279" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="620.38293"
- y="70.412834"
- id="text5099"><tspan
- sodipodi:role="line"
- id="tspan5101"
- x="620.38293"
- y="70.412834">...</tspan></text>
- <rect
- style="font-size:22px;fill:#00fab4;fill-opacity:0.5098038;stroke:#000000;stroke-width:0.72598213;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
- id="rect5103"
- width="60"
- height="100"
- x="590.31262"
- y="174.68628" />
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Arial"
- x="920.97113"
- y="104.14124"
- id="text5105"><tspan
- sodipodi:role="line"
- id="tspan5107"
- x="920.97113"
- y="104.14124" /></text>
- <rect
- style="opacity:1;fill:#d1fc25;fill-opacity:0.78927199;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect5111"
- width="0"
- height="20"
- x="780"
- y="94.094482" />
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-weight:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Arial"
- x="620.21008"
- y="228.22388"
- id="text5113"><tspan
- sodipodi:role="line"
- id="tspan5115"
- x="620.21008"
- y="228.22388">Fencing</tspan></text>
- <rect
- style="opacity:1;fill:#d1fc25;fill-opacity:0.78927199;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect5117"
- width="10"
- height="0"
- x="730"
- y="204.09448" />
- <rect
- style="opacity:1;fill:#d1fc25;fill-opacity:0.78927199;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect5119"
- width="0"
- height="0"
- x="950"
- y="104.09448" />
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- x="705.74603"
- y="452.82455"
- id="text5124"
- sodipodi:linespacing="100%"><tspan
- sodipodi:role="line"
- id="tspan5126"
- x="705.74603"
- y="452.82455"
- style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans Bold">Linux kernel</tspan></text>
- <rect
- y="582.58923"
- x="297.64398"
- height="49.757401"
- width="112.06894"
- id="rect4873"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:#000000;stroke-width:1.62952805;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.88858379, 4.88858379;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans" />
- <rect
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:#000000;stroke-width:1.62952805;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.88858379, 4.88858379;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans"
- id="rect4875"
- width="112.06894"
- height="49.757401"
- x="166.74939"
- y="583.76849" />
- <rect
- y="646.2677"
- x="166.39093"
- height="49.757401"
- width="112.06894"
- id="rect4877"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:#000000;stroke-width:1.62952805;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.88858379, 4.88858379;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans" />
- <rect
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:#000000;stroke-width:1.62952805;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.88858379, 4.88858379;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans"
- id="rect4879"
- width="112.06894"
- height="49.757401"
- x="232.7863"
- y="517.73157" />
- <rect
- y="446.97772"
- x="303.54013"
- height="49.757401"
- width="112.06894"
- id="rect4881"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:#000000;stroke-width:1.62952805;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.88858379, 4.88858379;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans" />
- <rect
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:#000000;stroke-width:1.62952805;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.88858379, 4.88858379;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans"
- id="rect4883"
- width="112.06894"
- height="49.757401"
- x="172.64554"
- y="446.97772" />
- <rect
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:#000000;stroke-width:1.62952805;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.88858379, 4.88858379;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans"
- id="rect4887"
- width="112.06894"
- height="49.757401"
- x="561.12164"
- y="519.01465" />
- <rect
- y="517.83545"
- x="686.12012"
- height="49.757401"
- width="112.06894"
- id="rect4889"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:#000000;stroke-width:1.62952805;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.88858379, 4.88858379;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans" />
- <rect
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:#000000;stroke-width:1.62952805;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.88858379, 4.88858379;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans"
- id="rect4892"
- width="112.06894"
- height="49.757401"
- x="812.29779"
- y="517.83545" />
- <rect
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:#000000;stroke-width:1.62952805;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.88858379, 4.88858379;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans"
- id="rect4894"
- width="112.06894"
- height="49.757401"
- x="602.39471"
- y="601.96613" />
- <rect
- y="640.05994"
- x="619.26239"
- height="49.757401"
- width="112.06894"
- id="rect4896"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:#000000;stroke-width:1.62952805;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.88858379, 4.88858379;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans" />
- <rect
- y="638.88074"
- x="747.44012"
- height="49.757401"
- width="112.06894"
- id="rect4902"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:0.11764706;fill-rule:evenodd;stroke:#000000;stroke-width:1.62952805;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.88858379, 4.88858379;stroke-dashoffset:0;font-family:Sans;-inkscape-font-specification:Sans" />
- </g>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/dot.png b/doc/publican-clusterlabs/en-US/images/dot.png
deleted file mode 100644
index 079add95de..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/dot.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/dot.svg b/doc/publican-clusterlabs/en-US/images/dot.svg
deleted file mode 100644
index eaeff2ea78..0000000000
--- a/doc/publican-clusterlabs/en-US/images/dot.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="5"
- height="6"
- id="svgdot">
- <defs
- id="defsdot" />
- <text
- x="2.5"
- y="3"
- transform="scale(0.89833804,1.1131667)"
- id="textdot"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="4.5"
- y="5"
- id="tspandot">dot</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/dot2.png b/doc/publican-clusterlabs/en-US/images/dot2.png
deleted file mode 100644
index 8348fcd054..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/dot2.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/dot2.svg b/doc/publican-clusterlabs/en-US/images/dot2.svg
deleted file mode 100644
index 893f689356..0000000000
--- a/doc/publican-clusterlabs/en-US/images/dot2.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="5"
- height="6"
- id="svgdot2">
- <defs
- id="defsdot2" />
- <text
- x="2.5"
- y="3"
- transform="scale(0.89833804,1.1131667)"
- id="textdot2"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="4.5"
- y="5"
- id="tspandot2">dot2</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/h1-bg.png b/doc/publican-clusterlabs/en-US/images/h1-bg.png
deleted file mode 100644
index 68a8699675..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/h1-bg.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/h1-bg.svg b/doc/publican-clusterlabs/en-US/images/h1-bg.svg
deleted file mode 100644
index 3f885e982a..0000000000
--- a/doc/publican-clusterlabs/en-US/images/h1-bg.svg
+++ /dev/null
@@ -1,95 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- version="1.0"
- width="5"
- height="100"
- id="svgh1-bg"
- inkscape:version="0.47 r22583"
- sodipodi:docname="h1-bg.svg">
- <metadata
- id="metadata8">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <sodipodi:namedview
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1"
- objecttolerance="10"
- gridtolerance="10"
- guidetolerance="10"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:window-width="993"
- inkscape:window-height="852"
- id="namedview6"
- showgrid="false"
- inkscape:zoom="4.72"
- inkscape:cx="-38.541797"
- inkscape:cy="45.205581"
- inkscape:window-x="0"
- inkscape:window-y="25"
- inkscape:window-maximized="0"
- inkscape:current-layer="svgh1-bg" />
- <defs
- id="defsh1-bg">
- <linearGradient
- id="linearGradient3598">
- <stop
- style="stop-color:#4c67c2;stop-opacity:1;"
- offset="0"
- id="stop3600" />
- <stop
- id="stop3612"
- offset="1"
- style="stop-color:#15255f;stop-opacity:1;" />
- </linearGradient>
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 50 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="5 : 50 : 1"
- inkscape:persp3d-origin="2.5 : 33.333333 : 1"
- id="perspective10" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3598"
- id="linearGradient3604"
- x1="0"
- y1="-5.2763639e-08"
- x2="0"
- y2="100"
- gradientUnits="userSpaceOnUse" />
- </defs>
- <text
- x="2.5"
- y="50"
- transform="scale(0.89833804,1.1131667)"
- id="texth1-bg"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="4.5"
- y="52"
- id="tspanh1-bg">h1-bg</tspan></text>
- <rect
- style="fill:url(#linearGradient3604);fill-opacity:1"
- id="rect2816"
- width="5.0847459"
- height="100"
- x="0"
- y="-5.2763639e-08" />
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/image_left.png b/doc/publican-clusterlabs/en-US/images/image_left.png
deleted file mode 100644
index 227b7c077c..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/image_left.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/image_left.svg b/doc/publican-clusterlabs/en-US/images/image_left.svg
deleted file mode 100644
index c9ea0eafe7..0000000000
--- a/doc/publican-clusterlabs/en-US/images/image_left.svg
+++ /dev/null
@@ -1,262 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- id="svg2"
- version="1.1"
- inkscape:version="0.47 r22583"
- width="195"
- height="50"
- sodipodi:docname="image_left.svg"
- style="display:inline;enable-background:new">
- <metadata
- id="metadata8">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <defs
- id="defs6">
- <linearGradient
- inkscape:collect="always"
- id="linearGradient6188">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop6190" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop6192" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient4091">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop4093" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop4095" />
- </linearGradient>
- <linearGradient
- id="linearGradient4039">
- <stop
- style="stop-color:#2c4081;stop-opacity:1;"
- offset="0"
- id="stop4041" />
- <stop
- style="stop-color:#2c4081;stop-opacity:0;"
- offset="1"
- id="stop4043" />
- </linearGradient>
- <linearGradient
- id="linearGradient4031">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop4033" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop4035" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient4013">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop4015" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop4017" />
- </linearGradient>
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective10" />
- <inkscape:perspective
- id="perspective3678"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 0.5 : 1"
- sodipodi:type="inkscape:persp3d" />
- <inkscape:perspective
- id="perspective3703"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 0.5 : 1"
- sodipodi:type="inkscape:persp3d" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4013"
- id="linearGradient4019"
- x1="43.157043"
- y1="-79.140793"
- x2="43.157043"
- y2="-100.66115"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4031"
- id="linearGradient4037"
- x1="97.157951"
- y1="-73.723228"
- x2="97.157951"
- y2="-95.479019"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4039"
- id="linearGradient4045"
- x1="-0.30023095"
- y1="65.069283"
- x2="486.07388"
- y2="-23.799074"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5,0,0,0.5,0.24607542,0.11399734)" />
- <inkscape:perspective
- id="perspective4071"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 0.5 : 1"
- sodipodi:type="inkscape:persp3d" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4091"
- id="linearGradient4097"
- x1="42.10154"
- y1="-73.627083"
- x2="42.10154"
- y2="-92.733322"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.64120517,-0.56230747)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4091"
- id="linearGradient4099"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.46769187,0,0,0.46769185,42.591722,-42.67314)"
- x1="42.10154"
- y1="-73.627083"
- x2="42.10154"
- y2="-92.733322" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6188"
- id="linearGradient6194"
- x1="367.08057"
- y1="-46.752781"
- x2="33.306782"
- y2="-56.491882"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1.0071758,0)" />
- </defs>
- <sodipodi:namedview
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1"
- objecttolerance="10"
- gridtolerance="10"
- guidetolerance="10"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:window-width="1680"
- inkscape:window-height="1028"
- id="namedview4"
- showgrid="false"
- inkscape:zoom="4.710419"
- inkscape:cx="95.738015"
- inkscape:cy="-1.8964956"
- inkscape:window-x="0"
- inkscape:window-y="0"
- inkscape:window-maximized="1"
- inkscape:current-layer="layer3" />
- <g
- inkscape:groupmode="layer"
- id="layer4"
- inkscape:label="Blank"
- style="display:none" />
- <g
- inkscape:groupmode="layer"
- id="layer1"
- inkscape:label="Background"
- style="display:inline">
- <rect
- style="fill:url(#linearGradient4045);fill-opacity:1"
- id="rect2821"
- width="195"
- height="32.575058"
- x="0.095963053"
- y="0.073580861" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer3"
- inkscape:label="Pacemaker"
- style="display:inline">
- <text
- xml:space="preserve"
- style="font-size:27.22674942px;font-style:normal;font-weight:normal;line-height:125%;opacity:0.95121951;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
- x="19.977491"
- y="35.90564"
- id="text3656"
- sodipodi:linespacing="125%"
- transform="scale(0.93645805,1.0678535)"><tspan
- sodipodi:role="line"
- x="19.977491"
- y="35.90564"
- style="font-size:29.96665764px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Serif"
- id="tspan3662"><tspan
- style="font-size:45px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Serif"
- id="tspan4055">P</tspan><tspan
- style="font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
- id="tspan5103">acemaker</tspan></tspan></text>
- <text
- transform="matrix(1.1426194,0,1.320044,-0.87518206,0,0)"
- sodipodi:linespacing="125%"
- id="text5670"
- y="-44.480221"
- x="67.066498"
- style="font-size:22.31426238999999967px;font-style:normal;font-weight:normal;line-height:125%;opacity:0.95121951000000005;fill:url(#linearGradient6194);fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
- xml:space="preserve"><tspan
- id="tspan5672"
- style="font-size:24.55981255000000019px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient6194);fill-opacity:1;font-family:Liberation Serif"
- y="-44.480221"
- x="67.066498"
- sodipodi:role="line"><tspan
- id="tspan5674"
- style="font-size:36.88070678999999785px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient6194);fill-opacity:1;font-family:Liberation Serif">P</tspan><tspan
- id="tspan5676"
- style="fill:url(#linearGradient6194);fill-opacity:1;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono">acemaker</tspan></tspan></text>
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer2"
- inkscape:label="Reflection"
- style="display:inline" />
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/image_right.png b/doc/publican-clusterlabs/en-US/images/image_right.png
deleted file mode 100644
index 742f0db8d5..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/image_right.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/image_right.svg b/doc/publican-clusterlabs/en-US/images/image_right.svg
deleted file mode 100644
index 04be63dcf2..0000000000
--- a/doc/publican-clusterlabs/en-US/images/image_right.svg
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- version="1.0"
- width="88"
- height="40"
- id="svgimage_left"
- style="display:inline"
- inkscape:version="0.47 r22583"
- sodipodi:docname="image_right.svg">
- <metadata
- id="metadata3953">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <sodipodi:namedview
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1"
- objecttolerance="10"
- gridtolerance="10"
- guidetolerance="10"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:window-width="1120"
- inkscape:window-height="630"
- id="namedview3951"
- showgrid="false"
- inkscape:zoom="5.2444444"
- inkscape:cx="27.181728"
- inkscape:cy="22.5"
- inkscape:window-x="2021"
- inkscape:window-y="361"
- inkscape:window-maximized="0"
- inkscape:current-layer="svgimage_left" />
- <defs
- id="defsimage_left">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 22.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="88 : 22.5 : 1"
- inkscape:persp3d-origin="44 : 15 : 1"
- id="perspective3955" />
- </defs>
- <text
- x="46.796108"
- y="20.958361"
- transform="scale(0.89833804,1.1131667)"
- id="textimage_left"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#bd4c4b;fill-opacity:1;stroke:none;font-family:Liberation Serif"
- sodipodi:linespacing="125%"><tspan
- x="48.796108"
- y="22.958361"
- id="tspanimage_left"
- style="fill:#2c4081;fill-opacity:1">cluster</tspan><tspan
- id="tspan3596"
- style="fill:#1a006d;fill-opacity:1">labs</tspan></text>
- <g
- id="layer1"
- style="display:none">
- <rect
- width="84.851692"
- height="42.521187"
- x="2.0974576"
- y="1.1440678"
- id="rect2817" />
- </g>
- <g
- id="layer2"
- style="display:none" />
- <text
- x="1.1440676"
- y="35.275425"
- id="text3765"
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
- sodipodi:linespacing="125%"><tspan
- x="1.1440676"
- y="35.275425"
- id="tspan3767"
- style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;opacity:0.46052635;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono">documentation</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/important.png b/doc/publican-clusterlabs/en-US/images/important.png
deleted file mode 100644
index 969562b7bc..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/important.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/important.svg b/doc/publican-clusterlabs/en-US/images/important.svg
deleted file mode 100644
index 064c783b53..0000000000
--- a/doc/publican-clusterlabs/en-US/images/important.svg
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="48"
- height="48"
- id="svg2">
- <defs
- id="defs5" />
- <path
- d="M 255.25,-411.29002 L 261.86798,-400.85887 L 273.83367,-397.7882 L 265.95811,-388.27072 L 266.73534,-375.94179 L 255.25,-380.49082 L 243.76466,-375.94179 L 244.54189,-388.27072 L 236.66633,-397.7882 L 248.63202,-400.85887 L 255.25,-411.29002 z "
- transform="matrix(1.1071323,0,0,1.1071323,-258.4137,459.98052)"
- style="fill:#2e3436;fill-opacity:1;stroke:#2e3436;stroke-width:4.25880718;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path4450" />
- <path
- d="M 255.25,-411.29002 L 261.86798,-400.85887 L 273.83367,-397.7882 L 265.95811,-388.27072 L 266.73534,-375.94179 L 255.25,-380.49082 L 243.76466,-375.94179 L 244.54189,-388.27072 L 236.66633,-397.7882 L 248.63202,-400.85887 L 255.25,-411.29002 z "
- transform="matrix(1.1071323,0,0,1.1071323,-258.4137,459.98052)"
- style="fill:#fac521;fill-opacity:1;stroke-width:3.4070456;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path4452" />
- <path
- d="M 24.175987,4.476098 L 16.980534,16.087712 L 3.9317841,19.443104 L 16.980534,20.076901 L 24.175987,10.383543 L 31.408721,20.076901 L 44.457471,19.443104 L 31.468862,16.027571 L 24.175987,4.476098 z "
- style="fill:#feeaab;fill-opacity:1;stroke-width:3.4070456;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path4531" />
- <path
- d="M 12.456856,24.055852 C 11.65845,24.299685 14.436112,29.177769 14.436112,32.041127 C 14.436112,37.343117 13.010825,39.831516 15.971742,37.364645 C 18.711008,35.08244 21.184735,34.873512 24.195894,34.873512 C 27.207053,34.873512 29.646656,35.08244 32.38592,37.364645 C 35.346837,39.831516 33.921551,37.343117 33.92155,32.041127 C 33.92155,28.223316 38.868232,20.827013 33.682674,25.591482 C 31.458295,27.635233 27.413886,29.481744 24.195894,29.481744 C 20.977903,29.481744 16.933493,27.635233 14.709113,25.591482 C 13.412724,24.400365 12.722992,23.974574 12.456856,24.055852 z "
- style="fill:#fcd867;fill-opacity:1;stroke-width:3.4070456;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path2185" />
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/note.png b/doc/publican-clusterlabs/en-US/images/note.png
deleted file mode 100644
index d04775d990..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/note.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/note.svg b/doc/publican-clusterlabs/en-US/images/note.svg
deleted file mode 100644
index abe5a60246..0000000000
--- a/doc/publican-clusterlabs/en-US/images/note.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="48"
- height="48"
- id="svg2">
- <defs
- id="defs5" />
- <path
- d="M 30.27396,4.1232594 L 18.765811,4.1232594 C 11.476786,4.1232594 5.5574109,10.546411 5.5574109,19.960741 C 5.5574109,24.746615 7.0844878,29.075948 9.5403943,32.177328 C 9.4616811,32.681104 9.414455,33.200619 9.414455,33.720144 C 9.414455,39.308917 13.554865,43.591015 18.891751,44.267966 C 17.506371,42.693663 16.656245,40.914707 16.656245,38.616218 C 16.656245,38.01799 16.719219,37.419752 16.82942,36.837262 C 17.459135,36.963202 18.104599,37.026176 18.750063,37.026176 L 30.258211,37.026176 C 37.547237,37.026176 43.466612,29.39081 43.466612,19.960741 C 43.466612,10.530672 37.578724,4.1232594 30.27396,4.1232594 z "
- style="fill:#2e3436;fill-opacity:1;stroke:#2e3436;stroke-width:4.7150631;stroke-miterlimit:4;stroke-dasharray:none"
- id="path4317" />
- <path
- d="M 30.27396,4.1232594 L 18.765811,4.1232594 C 11.476786,4.1232594 5.5574109,10.546411 5.5574109,19.960741 C 5.5574109,24.746615 7.0844878,29.075948 9.5403943,32.177328 C 9.4616811,32.681104 9.414455,33.200619 9.414455,33.720144 C 9.414455,39.308917 13.554865,43.591015 18.891751,44.267966 C 17.506371,42.693663 16.656245,40.914707 16.656245,38.616218 C 16.656245,38.01799 16.719219,37.419752 16.82942,36.837262 C 17.459135,36.963202 18.104599,37.026176 18.750063,37.026176 L 30.258211,37.026176 C 37.547237,37.026176 43.466612,29.39081 43.466612,19.960741 C 43.466612,10.530672 37.578724,4.1232594 30.27396,4.1232594 z "
- style="fill:#bfdce8;fill-opacity:1"
- id="path142" />
- <path
- d="M 19.200879,5.5648899 C 12.490241,5.5648899 7.0622987,11.295775 7.0622987,19.690323 C 7.0622987,22.890926 7.8418023,25.879852 9.1910836,28.332288 C 8.6113289,26.599889 8.2852163,24.667826 8.2852163,22.673336 C 8.2852163,14.629768 13.495502,9.1620492 19.925575,9.1620492 L 30.071259,9.1620492 C 36.515213,9.1620492 41.711609,14.616311 41.711609,22.673336 C 41.864688,21.709218 41.983366,20.710908 41.983366,19.690323 C 41.983366,11.281743 36.524624,5.5648899 29.799492,5.5648899 L 19.200879,5.5648899 z "
- style="fill:#ffffff"
- id="path2358" />
- <path
- d="M 28.241965,33.725087 L 20.792252,33.725087 C 16.073756,33.725087 12.241894,32.944782 12.241894,26.850486 C 12.241894,25.10387 12.368512,23.572125 15.515722,23.567487 L 33.508301,23.540969 C 36.182481,23.537028 36.782127,24.950794 36.782127,26.850486 C 36.782127,32.95497 32.970649,33.725087 28.241965,33.725087 z "
- style="fill:#d0ecf9;fill-opacity:1"
- id="path2173" />
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/pacemaker-logo.png b/doc/publican-clusterlabs/en-US/images/pacemaker-logo.png
deleted file mode 100644
index f5ea2c68a3..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/pacemaker-logo.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/shine.png b/doc/publican-clusterlabs/en-US/images/shine.png
deleted file mode 100644
index a18f7c4612..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/shine.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/stock-go-back.png b/doc/publican-clusterlabs/en-US/images/stock-go-back.png
deleted file mode 100644
index 00850b21b2..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/stock-go-back.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/stock-go-back.svg b/doc/publican-clusterlabs/en-US/images/stock-go-back.svg
deleted file mode 100644
index b3b908143f..0000000000
--- a/doc/publican-clusterlabs/en-US/images/stock-go-back.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="22"
- height="22"
- id="svgstock-go-back">
- <defs
- id="defsstock-go-back" />
- <text
- x="11"
- y="11"
- transform="scale(0.89833804,1.1131667)"
- id="textstock-go-back"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="13"
- y="13"
- id="tspanstock-go-back">stock-go-back</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/stock-go-forward.png b/doc/publican-clusterlabs/en-US/images/stock-go-forward.png
deleted file mode 100644
index cc2797a468..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/stock-go-forward.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/stock-go-forward.svg b/doc/publican-clusterlabs/en-US/images/stock-go-forward.svg
deleted file mode 100644
index 7ee607b48f..0000000000
--- a/doc/publican-clusterlabs/en-US/images/stock-go-forward.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="22"
- height="22"
- id="svgstock-go-forward">
- <defs
- id="defsstock-go-forward" />
- <text
- x="11"
- y="11"
- transform="scale(0.89833804,1.1131667)"
- id="textstock-go-forward"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="13"
- y="13"
- id="tspanstock-go-forward">stock-go-forward</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/stock-go-up.png b/doc/publican-clusterlabs/en-US/images/stock-go-up.png
deleted file mode 100644
index 1ebf2799c3..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/stock-go-up.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/stock-go-up.svg b/doc/publican-clusterlabs/en-US/images/stock-go-up.svg
deleted file mode 100644
index a7c2af2f15..0000000000
--- a/doc/publican-clusterlabs/en-US/images/stock-go-up.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="22"
- height="22"
- id="svgstock-go-up">
- <defs
- id="defsstock-go-up" />
- <text
- x="11"
- y="11"
- transform="scale(0.89833804,1.1131667)"
- id="textstock-go-up"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="13"
- y="13"
- id="tspanstock-go-up">stock-go-up</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/stock-home.png b/doc/publican-clusterlabs/en-US/images/stock-home.png
deleted file mode 100644
index 3f0c190634..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/stock-home.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/stock-home.svg b/doc/publican-clusterlabs/en-US/images/stock-home.svg
deleted file mode 100644
index d06a54480e..0000000000
--- a/doc/publican-clusterlabs/en-US/images/stock-home.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="22"
- height="22"
- id="svgstock-home">
- <defs
- id="defsstock-home" />
- <text
- x="11"
- y="11"
- transform="scale(0.89833804,1.1131667)"
- id="textstock-home"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="13"
- y="13"
- id="tspanstock-home">stock-home</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/title_logo.png b/doc/publican-clusterlabs/en-US/images/title_logo.png
deleted file mode 100644
index 1c091e46f9..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/title_logo.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/title_logo.svg b/doc/publican-clusterlabs/en-US/images/title_logo.svg
deleted file mode 100644
index bf3f0bbbce..0000000000
--- a/doc/publican-clusterlabs/en-US/images/title_logo.svg
+++ /dev/null
@@ -1,726 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- version="1.1"
- width="284"
- height="142"
- id="svg2"
- xml:space="preserve"
- inkscape:version="0.47 r22583"
- sodipodi:docname="pacemaker_logo.svg"><metadata
- id="metadata3032"><rdf:RDF><cc:Work
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1"
- objecttolerance="10"
- gridtolerance="10"
- guidetolerance="10"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:window-width="1103"
- inkscape:window-height="862"
- id="namedview3030"
- showgrid="false"
- inkscape:zoom="2.2350201"
- inkscape:cx="141.38575"
- inkscape:cy="71.657651"
- inkscape:window-x="0"
- inkscape:window-y="0"
- inkscape:window-maximized="0"
- inkscape:current-layer="svg2" /><defs
- id="defs6"><linearGradient
- id="linearGradient3808"><stop
- style="stop-color:#003ac7;stop-opacity:1;"
- offset="0"
- id="stop3810" /><stop
- style="stop-color:#cecbfd;stop-opacity:1;"
- offset="1"
- id="stop3812" /></linearGradient><inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 372.04724 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1052.3622 : 372.04724 : 1"
- inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
- id="perspective3034" /><linearGradient
- x1="0"
- y1="0"
- x2="1"
- y2="0"
- id="linearGradient26"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(202.74854,0,0,202.74854,331.46045,-322.67773)"
- spreadMethod="pad"><stop
- id="stop28"
- style="stop-color:#ea5b63;stop-opacity:1"
- offset="0" /><stop
- id="stop30"
- style="stop-color:#f29d92;stop-opacity:1"
- offset="1" /></linearGradient><linearGradient
- x1="0"
- y1="0"
- x2="1"
- y2="0"
- id="linearGradient46"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(170.52614,0,0,170.52614,327.94824,-275.06055)"
- spreadMethod="pad"><stop
- id="stop48"
- style="stop-color:#ea5b63;stop-opacity:1"
- offset="0" /><stop
- id="stop50"
- style="stop-color:#f29d92;stop-opacity:1"
- offset="1" /></linearGradient><linearGradient
- x1="0"
- y1="0"
- x2="1"
- y2="0"
- id="linearGradient66"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(170.52621,0,0,170.52621,327.94727,-275.06055)"
- spreadMethod="pad"><stop
- id="stop68"
- style="stop-color:#ea5b63;stop-opacity:1"
- offset="0" /><stop
- id="stop70"
- style="stop-color:#f29d92;stop-opacity:1"
- offset="1" /></linearGradient><linearGradient
- x1="0"
- y1="0"
- x2="1"
- y2="0"
- id="linearGradient86"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(170.52553,0,0,170.52553,327.94775,-275.06055)"
- spreadMethod="pad"><stop
- id="stop88"
- style="stop-color:#ea5b63;stop-opacity:1"
- offset="0" /><stop
- id="stop90"
- style="stop-color:#f29d92;stop-opacity:1"
- offset="1" /></linearGradient><linearGradient
- x1="0"
- y1="0"
- x2="1"
- y2="0"
- id="linearGradient106"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(170.52562,0,0,170.52562,327.94824,-275.26367)"
- spreadMethod="pad"><stop
- id="stop108"
- style="stop-color:#ea5b63;stop-opacity:1"
- offset="0" /><stop
- id="stop110"
- style="stop-color:#f29d92;stop-opacity:1"
- offset="1" /></linearGradient><linearGradient
- x1="0"
- y1="0"
- x2="1"
- y2="0"
- id="linearGradient126"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(170.52614,0,0,170.52614,327.94775,-275.06055)"
- spreadMethod="pad"><stop
- id="stop128"
- style="stop-color:#ea5b63;stop-opacity:1"
- offset="0" /><stop
- id="stop130"
- style="stop-color:#f29d92;stop-opacity:1"
- offset="1" /></linearGradient><linearGradient
- x1="0"
- y1="0"
- x2="1"
- y2="0"
- id="linearGradient146"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(170.52606,0,0,170.52606,327.94678,-278.20117)"
- spreadMethod="pad"><stop
- id="stop148"
- style="stop-color:#ea5b63;stop-opacity:1"
- offset="0" /><stop
- id="stop150"
- style="stop-color:#f29d92;stop-opacity:1"
- offset="1" /></linearGradient><linearGradient
- x1="0"
- y1="0"
- x2="1"
- y2="0"
- id="linearGradient166"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(170.52553,0,0,170.52553,327.94678,-275.06055)"
- spreadMethod="pad"><stop
- id="stop168"
- style="stop-color:#ea5b63;stop-opacity:1"
- offset="0" /><stop
- id="stop170"
- style="stop-color:#f29d92;stop-opacity:1"
- offset="1" /></linearGradient><linearGradient
- x1="0"
- y1="0"
- x2="1"
- y2="0"
- id="linearGradient186"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(170.52654,0,0,170.52654,327.94727,-275.26367)"
- spreadMethod="pad"><stop
- id="stop188"
- style="stop-color:#ea5b63;stop-opacity:1"
- offset="0" /><stop
- id="stop190"
- style="stop-color:#f29d92;stop-opacity:1"
- offset="1" /></linearGradient><linearGradient
- x1="0"
- y1="0"
- x2="1"
- y2="0"
- id="linearGradient206"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(170.52614,0,0,170.52614,327.94629,-278.47363)"
- spreadMethod="pad"><stop
- id="stop208"
- style="stop-color:#ea5b63;stop-opacity:1"
- offset="0" /><stop
- id="stop210"
- style="stop-color:#f29d92;stop-opacity:1"
- offset="1" /></linearGradient><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient3814"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781"
- gradientUnits="userSpaceOnUse" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2896"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2898"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2900"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2902"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2904"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2906"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2908"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2910"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2912"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2914"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2916"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2918"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2920"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2922"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2924"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2926"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2928"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2930"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2932"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2934"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2936"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2938"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2940"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2942"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2944"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2946"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2948"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2950"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2952"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2954"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2956"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2958"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2960"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2962"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2964"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2966"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2968"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2970"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2972"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2974"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2976"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2978"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2980"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2982"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2984"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2986"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2988"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2990"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2992"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /><linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3808"
- id="linearGradient2994"
- gradientUnits="userSpaceOnUse"
- x1="307.9917"
- y1="322.6781"
- x2="534.20892"
- y2="322.6781" /></defs><g
- transform="matrix(1.25,0,0,-1.25,-384.98962,475.00526)"
- id="g12"
- style="fill:url(#linearGradient3814);fill-opacity:1"><g
- transform="scale(1,-1)"
- id="g14"
- style="fill:url(#linearGradient2904);fill-opacity:1"><g
- id="g16"
- style="fill:url(#linearGradient2902);fill-opacity:1"><g
- id="g22"
- style="fill:url(#linearGradient2900);fill-opacity:1"><g
- id="g24"
- style="fill:url(#linearGradient2898);fill-opacity:1"><path
- d="m 354.3042,-307.84424 c 24.22559,-7.51855 104.01807,-33.7666 179.47119,41.11475 1.14063,1.33105 -0.24414,1.71582 -1.00976,1.07422 -39.3711,-33.02784 -109.92579,-58.3335 -185.87256,-26.41797 -13.11621,5.51269 -22.42969,-9.88135 -8.55274,-19.38086 12.04785,-8.25342 72.40967,-51.12647 93.12647,-58.15967 20.71484,-7.03223 39.7207,-12.35449 41.62109,-9.69238 1.90234,2.66015 -14.78516,13.03222 -24.13672,22.23828 -24.13672,23.75488 -52.07422,31.73535 -72.22314,37.82129 -20.14356,6.07959 -21.85254,7.79248 -24.89551,8.92871 -3.04102,1.14258 -3.04102,4.18213 2.47168,2.47363 z"
- id="path32"
- style="fill:url(#linearGradient2896);fill-opacity:1;stroke:none" /></g></g></g></g><g
- transform="scale(1,-1)"
- id="g34"
- style="fill:url(#linearGradient2914);fill-opacity:1"><g
- id="g36"
- style="fill:url(#linearGradient2912);fill-opacity:1"><g
- id="g42"
- style="fill:url(#linearGradient2910);fill-opacity:1"><g
- id="g44"
- style="fill:url(#linearGradient2908);fill-opacity:1"><path
- d="m 335.06348,-279.8418 c -1.26319,0 -2.3125,0.44434 -3.14746,1.33301 -0.83545,0.88867 -1.25293,2.02832 -1.25293,3.41797 0,1.40039 0.4248,2.55273 1.27539,3.45605 0.85009,0.90332 1.89648,1.35547 3.13965,1.35547 1.28271,0 2.34667,-0.44433 3.19189,-1.333 0.84521,-0.88868 1.26807,-2.05274 1.26807,-3.49317 0,-1.40918 -0.42286,-2.55176 -1.26807,-3.4248 -0.84522,-0.875 -1.91406,-1.31153 -3.20654,-1.31153 z m 4.28711,-3.34375 c 0,0 4.09375,0 4.09375,0 0,0 0,16.25 0,16.25 0,0 -4.09375,0 -4.09375,0 0,0 0,-1.73144 0,-1.73144 -0.79639,0.75781 -1.59522,1.30273 -2.39649,1.63672 -0.80127,0.33398 -1.66943,0.50097 -2.60498,0.50097 -2.10058,0 -3.91699,-0.8125 -5.44971,-2.43847 -1.53271,-1.625 -2.29882,-3.64649 -2.29882,-6.0625 0,-2.50586 0.74121,-4.5586 2.22461,-6.16016 1.48291,-1.60059 3.28418,-2.40137 5.40429,-2.40137 0.97559,0 1.89112,0.18262 2.74707,0.54981 0.85596,0.36523 1.64746,0.91601 2.37403,1.64844 0,0 0,-1.792 0,-1.792 z"
- id="path52"
- style="fill:url(#linearGradient2906);fill-opacity:1;stroke:none" /></g></g></g></g><g
- transform="scale(1,-1)"
- id="g54"
- style="fill:url(#linearGradient2924);fill-opacity:1"><g
- id="g56"
- style="fill:url(#linearGradient2922);fill-opacity:1"><g
- id="g62"
- style="fill:url(#linearGradient2920);fill-opacity:1"><g
- id="g64"
- style="fill:url(#linearGradient2918);fill-opacity:1"><path
- d="m 363.01953,-279.89355 c 0,0 -3.38672,1.86425 -3.38672,1.86425 -0.63672,-0.66894 -1.26611,-1.13183 -1.88769,-1.3916 -0.62158,-0.25976 -1.3501,-0.38965 -2.18555,-0.38965 -1.52197,0 -2.75293,0.4541 -3.69287,1.36035 -0.93994,0.90821 -1.40967,2.07032 -1.40967,3.48633 0,1.37891 0.45215,2.50391 1.35645,3.37598 0.90429,0.87207 2.09228,1.30859 3.56396,1.30859 1.81836,0 3.23486,-0.625 4.24902,-1.875 0,0 3.20557,2.21094 3.20557,2.21094 -1.74072,2.27637 -4.19726,3.41406 -7.36963,3.41406 -2.85449,0 -5.08984,-0.84472 -6.70605,-2.53515 -1.61621,-1.69043 -2.42432,-3.66895 -2.42432,-5.93653 0,-1.57031 0.39307,-3.01757 1.1792,-4.33984 0.78613,-1.32227 1.88281,-2.36133 3.29102,-3.11719 1.4082,-0.75586 2.98291,-1.13379 4.72412,-1.13379 1.6123,0 3.06006,0.32129 4.34375,0.96192 1.2832,0.6416 2.33301,1.55371 3.14941,2.73633 z"
- id="path72"
- style="fill:url(#linearGradient2916);fill-opacity:1;stroke:none" /></g></g></g></g><g
- transform="scale(1,-1)"
- id="g74"
- style="fill:url(#linearGradient2934);fill-opacity:1"><g
- id="g76"
- style="fill:url(#linearGradient2932);fill-opacity:1"><g
- id="g82"
- style="fill:url(#linearGradient2930);fill-opacity:1"><g
- id="g84"
- style="fill:url(#linearGradient2928);fill-opacity:1"><path
- d="m 377.68555,-277.0918 c -0.27051,-0.89746 -0.80323,-1.62597 -1.59912,-2.18847 -0.7959,-0.56153 -1.71973,-0.84278 -2.771,-0.84278 -1.1416,0 -2.14258,0.31543 -3.00342,0.94629 -0.54053,0.39453 -1.04101,1.08985 -1.50146,2.08496 0,0 8.875,0 8.875,0 z m 4.07812,3.1875 c 0,0 -13.14062,0 -13.14062,0 0.18945,1.15625 0.69482,2.0752 1.51709,2.75782 0.82177,0.68261 1.8706,1.02343 3.14599,1.02343 1.52442,0 2.83448,-0.53222 3.93067,-1.59863 0,0 3.4375,1.61523 3.4375,1.61523 -0.85645,1.21778 -1.88233,2.11817 -3.07715,2.70118 -1.19531,0.58398 -2.61426,0.87597 -4.25733,0.87597 -2.5498,0 -4.62597,-0.80273 -6.22949,-2.40918 -1.60351,-1.60547 -2.40478,-3.61621 -2.40478,-6.0332 0,-2.47461 0.80078,-4.53125 2.40234,-6.16602 1.60156,-1.63671 3.60986,-2.4541 6.0249,-2.4541 2.56446,0 4.64991,0.81641 6.25635,2.44825 1.60645,1.63183 2.41016,3.7871 2.41016,6.46484 0,0 -0.0156,0.77441 -0.0156,0.77441 z"
- id="path92"
- style="fill:url(#linearGradient2926);fill-opacity:1;stroke:none" /></g></g></g></g><g
- transform="scale(1,-1)"
- id="g94"
- style="fill:url(#linearGradient2944);fill-opacity:1"><g
- id="g96"
- style="fill:url(#linearGradient2942);fill-opacity:1"><g
- id="g102"
- style="fill:url(#linearGradient2940);fill-opacity:1"><g
- id="g104"
- style="fill:url(#linearGradient2938);fill-opacity:1"><path
- d="m 385.01367,-283.18555 c 0,0 4.09375,0 4.09375,0 0,0 0,1.89942 0,1.89942 0.69727,-0.77344 1.47071,-1.35157 2.32227,-1.73242 0.85156,-0.38282 1.78125,-0.57325 2.78711,-0.57325 1.01562,0 1.93164,0.25196 2.74902,0.75489 0.81641,0.5039 1.47363,1.23828 1.97168,2.20507 0.64844,-0.96679 1.44141,-1.70117 2.38281,-2.20507 0.94141,-0.50293 1.97071,-0.75489 3.08594,-0.75489 1.15527,0 2.17188,0.26856 3.04785,0.80567 0.87598,0.53711 1.50684,1.23925 1.88965,2.10547 0.38379,0.86523 0.57617,2.27343 0.57617,4.22265 0,0 0,9.52246 0,9.52246 0,0 -4.09375,0 -4.09375,0 0,0 0,-8.208 0,-8.208 0,-1.83399 -0.23047,-3.07422 -0.69043,-3.72461 -0.45996,-0.64844 -1.14941,-0.97364 -2.06836,-0.97364 -0.70019,0 -1.32715,0.19825 -1.88183,0.59473 -0.55469,0.39648 -0.9668,0.94434 -1.23633,1.64258 -0.26953,0.69922 -0.4043,1.82226 -0.4043,3.36816 0,0 0,7.30078 0,7.30078 0,0 -4.09375,0 -4.09375,0 0,0 0,-7.83593 0,-7.83593 0,-1.44727 -0.10742,-2.49512 -0.32226,-3.14454 -0.21485,-0.64941 -0.53711,-1.13183 -0.96485,-1.45019 -0.42968,-0.31641 -0.94726,-0.47559 -1.55664,-0.47559 -0.67773,0 -1.29394,0.20117 -1.84765,0.60254 -0.55372,0.40137 -0.9668,0.96387 -1.24219,1.6875 -0.27344,0.72363 -0.41016,1.86328 -0.41016,3.41992 0,0 0,7.19629 0,7.19629 0,0 -4.09375,0 -4.09375,0 0,0 0,-16.25 0,-16.25 z"
- id="path112"
- style="fill:url(#linearGradient2936);fill-opacity:1;stroke:none" /></g></g></g></g><g
- transform="scale(1,-1)"
- id="g114"
- style="fill:url(#linearGradient2954);fill-opacity:1"><g
- id="g116"
- style="fill:url(#linearGradient2952);fill-opacity:1"><g
- id="g122"
- style="fill:url(#linearGradient2950);fill-opacity:1"><g
- id="g124"
- style="fill:url(#linearGradient2948);fill-opacity:1"><path
- d="m 421.01367,-279.8418 c -1.26269,0 -2.3125,0.44434 -3.14648,1.33301 -0.83594,0.88867 -1.25391,2.02832 -1.25391,3.41797 0,1.40039 0.42578,2.55273 1.27539,3.45605 0.85059,0.90332 1.89649,1.35547 3.14063,1.35547 1.28222,0 2.3457,-0.44433 3.1914,-1.333 0.84571,-0.88868 1.26758,-2.05274 1.26758,-3.49317 0,-1.40918 -0.42187,-2.55176 -1.26758,-3.4248 -0.8457,-0.875 -1.91406,-1.31153 -3.20703,-1.31153 z m 4.28711,-3.34375 c 0,0 4.09375,0 4.09375,0 0,0 0,16.25 0,16.25 0,0 -4.09375,0 -4.09375,0 0,0 0,-1.73144 0,-1.73144 -0.7959,0.75781 -1.59473,1.30273 -2.39648,1.63672 -0.80078,0.33398 -1.66895,0.50097 -2.6045,0.50097 -2.10058,0 -3.91699,-0.8125 -5.45019,-2.43847 -1.53223,-1.625 -2.29883,-3.64649 -2.29883,-6.0625 0,-2.50586 0.74219,-4.5586 2.22461,-6.16016 1.4834,-1.60059 3.28516,-2.40137 5.4043,-2.40137 0.97656,0 1.8916,0.18262 2.74804,0.54981 0.85547,0.36523 1.64649,0.91601 2.37305,1.64844 0,0 0,-1.792 0,-1.792 z"
- id="path132"
- style="fill:url(#linearGradient2946);fill-opacity:1;stroke:none" /></g></g></g></g><g
- transform="scale(1,-1)"
- id="g134"
- style="fill:url(#linearGradient2964);fill-opacity:1"><g
- id="g136"
- style="fill:url(#linearGradient2962);fill-opacity:1"><g
- id="g142"
- style="fill:url(#linearGradient2960);fill-opacity:1"><g
- id="g144"
- style="fill:url(#linearGradient2958);fill-opacity:1"><path
- d="m 433.85938,-289.4668 c 0,0 4.09375,0 4.09375,0 0,0 0,12.98731 0,12.98731 0,0 5.99707,-6.70606 5.99707,-6.70606 0,0 5.06152,0 5.06152,0 0,0 -6.93359,7.75293 -6.93359,7.75293 0,0 7.8291,8.49707 7.8291,8.49707 0,0 -5.06153,0 -5.06153,0 0,0 -6.89257,-7.48242 -6.89257,-7.48242 0,0 0,7.48242 0,7.48242 0,0 -4.09375,0 -4.09375,0 0,0 0,-22.53125 0,-22.53125 z"
- id="path152"
- style="fill:url(#linearGradient2956);fill-opacity:1;stroke:none" /></g></g></g></g><g
- transform="scale(1,-1)"
- id="g154"
- style="fill:url(#linearGradient2974);fill-opacity:1"><g
- id="g156"
- style="fill:url(#linearGradient2972);fill-opacity:1"><g
- id="g162"
- style="fill:url(#linearGradient2970);fill-opacity:1"><g
- id="g164"
- style="fill:url(#linearGradient2968);fill-opacity:1"><path
- d="m 463.48145,-277.0918 c -0.27051,-0.89746 -0.80372,-1.62597 -1.59864,-2.18847 -0.79687,-0.56153 -1.7207,-0.84278 -2.77148,-0.84278 -1.1416,0 -2.14258,0.31543 -3.00391,0.94629 -0.54004,0.39453 -1.04101,1.08985 -1.50097,2.08496 0,0 8.875,0 8.875,0 z m 4.0791,3.1875 c 0,0 -13.1416,0 -13.1416,0 0.18945,1.15625 0.69433,2.0752 1.5166,2.75782 0.82226,0.68261 1.87109,1.02343 3.14648,1.02343 1.52442,0 2.83399,-0.53222 3.93067,-1.59863 0,0 3.4375,1.61523 3.4375,1.61523 -0.85645,1.21778 -1.88184,2.11817 -3.07715,2.70118 -1.19532,0.58398 -2.61426,0.87597 -4.25782,0.87597 -2.54882,0 -4.625,-0.80273 -6.22851,-2.40918 -1.60352,-1.60547 -2.40527,-3.61621 -2.40527,-6.0332 0,-2.47461 0.80078,-4.53125 2.40234,-6.16602 1.60156,-1.63671 3.61035,-2.4541 6.02441,-2.4541 2.56446,0 4.65039,0.81641 6.25684,2.44825 1.60644,1.63183 2.41016,3.7871 2.41016,6.46484 0,0 -0.0147,0.77441 -0.0147,0.77441 z"
- id="path172"
- style="fill:url(#linearGradient2966);fill-opacity:1;stroke:none" /></g></g></g></g><g
- transform="scale(1,-1)"
- id="g174"
- style="fill:url(#linearGradient2984);fill-opacity:1"><g
- id="g176"
- style="fill:url(#linearGradient2982);fill-opacity:1"><g
- id="g182"
- style="fill:url(#linearGradient2980);fill-opacity:1"><g
- id="g184"
- style="fill:url(#linearGradient2978);fill-opacity:1"><path
- d="m 470.48242,-283.18555 c 0,0 3.53125,0 3.53125,0 0,0 0,2.04785 0,2.04785 0.375,-0.80273 0.875,-1.4121 1.49707,-1.8291 0.62207,-0.41699 1.30469,-0.625 2.0459,-0.625 0.52344,0 1.07227,0.13965 1.64453,0.417 0,0 -1.25586,3.5039 -1.25586,3.5039 -0.47265,-0.23828 -0.86133,-0.3584 -1.16699,-0.3584 -0.62012,0 -1.14551,0.3877 -1.57324,1.16504 -0.42969,0.77539 -0.64356,2.29883 -0.64356,4.56836 0,0 0.0147,0.79102 0.0147,0.79102 0,0 0,6.56933 0,6.56933 0,0 -4.09375,0 -4.09375,0 0,0 0,-16.25 0,-16.25 z"
- id="path192"
- style="fill:url(#linearGradient2976);fill-opacity:1;stroke:none" /></g></g></g></g><g
- transform="scale(1,-1)"
- id="g194"
- style="fill:url(#linearGradient2994);fill-opacity:1"><g
- id="g196"
- style="fill:url(#linearGradient2992);fill-opacity:1"><g
- id="g202"
- style="fill:url(#linearGradient2990);fill-opacity:1"><g
- id="g204"
- style="fill:url(#linearGradient2988);fill-opacity:1"><path
- d="m 316.66992,-286.62988 c -1.2832,0 -2.34717,0.43652 -3.19238,1.31152 -0.84522,0.87305 -1.26758,2.15723 -1.26758,3.56641 0,1.44043 0.42236,2.60449 1.26758,3.49316 0.84521,0.88867 1.90918,1.33301 3.19238,1.33301 1.24268,0 2.37403,-0.45215 3.22461,-1.35547 0.8501,-0.90332 1.27539,-2.05566 1.27539,-3.45605 0,-1.38965 -0.41797,-2.6709 -1.25293,-3.55958 -0.83545,-0.88867 -1.97461,-1.333 -3.24707,-1.333 z m -5.96387,-2.6416 c 2.60059,0 4.01026,-0.74024 6.50928,-0.74024 2.11719,0 3.91651,0.77246 5.39795,2.37305 1.48145,1.60156 2.22217,3.59765 2.22217,6.10351 0,2.41602 -0.8125,4.39453 -2.29639,6.0625 -1.58154,1.77832 -6.67724,3.64551 -10.45361,0.29297 0,0 0,8.24414 0,8.24414 0,0 -4.09375,0 -4.09375,0 0,0 0,-22.33593 0,-22.33593 0,0 1.52344,0 2.71435,0 z"
- id="path212"
- style="fill:url(#linearGradient2986);fill-opacity:1;stroke:none" /></g></g></g></g></g></svg>
diff --git a/doc/publican-clusterlabs/en-US/images/warning.png b/doc/publican-clusterlabs/en-US/images/warning.png
deleted file mode 100644
index 94b69d1ff1..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/warning.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/warning.svg b/doc/publican-clusterlabs/en-US/images/warning.svg
deleted file mode 100644
index 4231e5ac04..0000000000
--- a/doc/publican-clusterlabs/en-US/images/warning.svg
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- version="1.0"
- width="48"
- height="48"
- id="svg5921"
- sodipodi:version="0.32"
- inkscape:version="0.46"
- sodipodi:docname="warning.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape">
- <metadata
- id="metadata11">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <sodipodi:namedview
- inkscape:window-height="975"
- inkscape:window-width="1680"
- inkscape:pageshadow="2"
- inkscape:pageopacity="0.0"
- guidetolerance="10.0"
- gridtolerance="10.0"
- objecttolerance="10.0"
- borderopacity="1.0"
- bordercolor="#666666"
- pagecolor="#ffffff"
- id="base"
- showgrid="false"
- inkscape:zoom="1"
- inkscape:cx="49.390126"
- inkscape:cy="6.0062258"
- inkscape:window-x="0"
- inkscape:window-y="25"
- inkscape:current-layer="svg5921" />
- <defs
- id="defs5923">
- <linearGradient
- inkscape:collect="always"
- id="linearGradient2400">
- <stop
- style="stop-color:#fac521;stop-opacity:1;"
- offset="0"
- id="stop2402" />
- <stop
- style="stop-color:#fde7a3;stop-opacity:1"
- offset="1"
- id="stop2404" />
- </linearGradient>
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 20 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="40 : 20 : 1"
- inkscape:persp3d-origin="20 : 13.333333 : 1"
- id="perspective13" />
- <inkscape:perspective
- id="perspective2396"
- inkscape:persp3d-origin="24 : 16 : 1"
- inkscape:vp_z="48 : 24 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 24 : 1"
- sodipodi:type="inkscape:persp3d" />
- <inkscape:perspective
- id="perspective2394"
- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
- inkscape:vp_z="744.09448 : 526.18109 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 526.18109 : 1"
- sodipodi:type="inkscape:persp3d" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2400"
- id="linearGradient2406"
- x1="-2684.8242"
- y1="1639.8413"
- x2="-2684.8242"
- y2="1587.1559"
- gradientUnits="userSpaceOnUse" />
- </defs>
- <g
- transform="matrix(0.4536635,0,0,0.4536635,-5.1836431,-4.6889387)"
- id="layer1">
- <g
- transform="translate(2745.6887,-1555.5977)"
- id="g8304"
- style="enable-background:new" />
- </g>
- <g
- id="g3189"
- transform="matrix(1.2987724,0,0,1.2987724,-1.4964485,-1.8271549)">
- <path
- style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-opacity:1;enable-background:new"
- id="path8034"
- transform="matrix(0.3735251,4.0822414e-3,-4.0822414e-3,0.3735251,605.96125,-374.33682)"
- d="M -1603,1054.4387 L -1577.0919,1027.891 L -1540,1027.4387 L -1513.4523,1053.3468 L -1513,1090.4387 L -1538.9081,1116.9864 L -1576,1117.4387 L -1602.5477,1091.5306 L -1603,1054.4387 z" />
- <path
- style="opacity:1;fill:url(#linearGradient2406);fill-opacity:1;stroke:none;stroke-width:0.72954363000000000;stroke-opacity:1;enable-background:new"
- id="path8036"
- d="M -2723.6739,1596.2775 L -2704.5623,1577.1175 L -2677.5001,1577.0833 L -2658.3401,1596.1949 L -2658.3059,1623.257 L -2677.4175,1642.417 L -2704.4797,1642.4513 L -2723.6396,1623.3396 L -2723.6739,1596.2775 z"
- transform="matrix(0.4536635,0,0,0.4536635,1240.4351,-710.40684)" />
- <path
- transform="translate(6.7837002e-6,-8.8630501e-6)"
- id="path3178"
- d="M 13.46875,5.0625 L 4.8125,13.78125 L 4.8125,16.625 L 13.46875,7.9375 L 25.75,7.90625 L 34.4375,16.59375 L 34.4375,13.71875 L 25.75,5.0625 L 13.46875,5.0625 z"
- style="opacity:1;fill:#fde8a6;fill-opacity:1;stroke:none;stroke-width:0.72954363;stroke-opacity:1;enable-background:new" />
- <path
- id="path4412"
- style="fill:#fef2cb;fill-opacity:1;stroke:#fef2cb;stroke-width:0.9430126;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 23.308501,28.806303 C 23.308501,30.239154 22.087319,31.313792 20.231121,31.313792 L 20.198559,31.313792 C 18.358657,31.313792 17.121188,30.239154 17.121188,28.806303 C 17.121188,27.308327 18.391219,26.282537 20.231121,26.282537 C 22.054757,26.282537 23.27593,27.308327 23.308501,28.806303 z M 22.982851,24.507759 L 24.057489,11.351592 L 16.355915,11.351592 L 17.430553,24.507759 L 22.982851,24.507759 z" />
- <path
- id="path4414"
- style="fill:#2e3436"
- d="M 22.732962,27.86025 C 22.732962,29.293101 21.51178,30.36774 19.655592,30.36774 L 19.623029,30.36774 C 17.783118,30.36774 16.545659,29.293101 16.545659,27.86025 C 16.545659,26.362275 17.81568,25.336485 19.655592,25.336485 C 21.479218,25.336485 22.7004,26.362275 22.732962,27.86025 z M 22.407312,23.561697 L 23.48195,10.40553 L 15.780385,10.40553 L 16.855023,23.561697 L 22.407312,23.561697 z" />
- </g>
-</svg>
diff --git a/doc/publican-clusterlabs/en-US/images/watermark-draft.png b/doc/publican-clusterlabs/en-US/images/watermark-draft.png
deleted file mode 100644
index 0ead5af8bb..0000000000
Binary files a/doc/publican-clusterlabs/en-US/images/watermark-draft.png and /dev/null differ
diff --git a/doc/publican-clusterlabs/en-US/images/watermark-draft.svg b/doc/publican-clusterlabs/en-US/images/watermark-draft.svg
deleted file mode 100644
index 4ecbf37fec..0000000000
--- a/doc/publican-clusterlabs/en-US/images/watermark-draft.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.0"
- width="500"
- height="500"
- id="svgwatermark-draft">
- <defs
- id="defswatermark-draft" />
- <text
- x="250"
- y="250"
- transform="scale(0.89833804,1.1131667)"
- id="textwatermark-draft"
- xml:space="preserve"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Liberation Serif;"><tspan
- x="252"
- y="252"
- id="tspanwatermark-draft">watermark-draft</tspan></text>
-</svg>
diff --git a/doc/publican-clusterlabs/overrides.cfg b/doc/publican-clusterlabs/overrides.cfg
deleted file mode 100644
index 4505371868..0000000000
--- a/doc/publican-clusterlabs/overrides.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config::Simple 4.59
-# Thu Nov 12 09:56:27 2009
-
-strict: 0
-
diff --git a/doc/publican-clusterlabs/publican-clusterlabs.spec b/doc/publican-clusterlabs/publican-clusterlabs.spec
deleted file mode 100644
index c2bcf95e35..0000000000
--- a/doc/publican-clusterlabs/publican-clusterlabs.spec
+++ /dev/null
@@ -1,43 +0,0 @@
-%define brand clusterlabs
-
-Name: publican-clusterlabs
-Summary: Common documentation files for %{brand}
-Version: 0.1
-Release: 0%{?dist}
-License: SETUP: Set This
-Group: Applications/Text
-Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
-Buildarch: noarch
-Source: https://www.SETUP.set.me.example.com/source/%{name}-%{version}.tgz
-Requires: publican >= 1.0
-BuildRequires: publican >= 1.0
-URL: https://www.SETUP.set.me.example.com
-
-%description
-This package provides common files and templates needed to build documentation
-for %{brand} with publican.
-
-%prep
-%setup -q
-
-%build
-publican build --formats=xml --langs=all --publish
-
-%install
-rm -rf $RPM_BUILD_ROOT
-mkdir -p -m755 $RPM_BUILD_ROOT%{_datadir}/publican/Common_Content
-publican install_brand --path=$RPM_BUILD_ROOT%{_datadir}/publican/Common_Content
-
-%clean
-rm -rf $RPM_BUILD_ROOT
-
-%files
-%defattr(-,root,root,-)
-%doc README
-%doc COPYING
-%{_datadir}/publican/Common_Content/%{brand}
-
-%changelog
-* Thu Nov 12 2009 SETUP:YourName <SETUP:your.email@example.com> 0.1
-- Created Brand
-
diff --git a/doc/publican-clusterlabs/publican.cfg b/doc/publican-clusterlabs/publican.cfg
deleted file mode 100644
index 96691d965a..0000000000
--- a/doc/publican-clusterlabs/publican.cfg
+++ /dev/null
@@ -1,4 +0,0 @@
-version: 0.1
-xml_lang: en-US
-type: brand
-brand: clusterlabs
diff --git a/doc/publican-clusterlabs/xsl/common.xsl b/doc/publican-clusterlabs/xsl/common.xsl
deleted file mode 100644
index 5f255dfcc7..0000000000
--- a/doc/publican-clusterlabs/xsl/common.xsl
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version='1.0'?>
-
-<!--
- Copyright 2009 Andrew Beekhof
- License: GPL
- Author: Andrew Beekhof <andrew@beekhof.net>
--->
-
-<!DOCTYPE xsl:stylesheet [
-<!ENTITY lowercase "'abcdefghijklmnopqrstuvwxyz'">
-<!ENTITY uppercase "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'">
- ]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version='1.0'
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- exclude-result-prefixes="#default">
-
-<xsl:param name="title.color">#2C4081</xsl:param>
-<!-- http://docbook.sourceforge.net/release/xsl/current/doc/html/generate.toc.html -->
-<xsl:param name="generate.toc">
-appendix toc,title
-article/appendix nop
-article toc,title
-book toc,title,figure,table,example,equation
-chapter toc,title
-part toc,title
-preface toc,title
-qandadiv nop
-qandaset nop
-reference toc,title
-sect1 nop
-sect2 nop
-sect3 nop
-sect4 nop
-sect5 nop
-section nop
-set toc,title
-<!-- publican defaults
-set toc
-book toc,qandadiv
-article toc
-chapter nop
-qandadiv nop
-qandaset nop
-sect1 nop
-sect2 nop
-sect3 nop
-sect4 nop
-sect5 nop
-section nop
-part nop
--->
-</xsl:param>
-
-<xsl:template name="tr.attributes">
- <xsl:param name="row" select="."/>
- <xsl:param name="rownum" select="0"/>
-
- <xsl:if test="$rownum mod 2 = 0">
- <xsl:attribute name="class">even</xsl:attribute>
- </xsl:if>
-
-</xsl:template>
-
-
-</xsl:stylesheet>
diff --git a/doc/publican-clusterlabs/xsl/header.html b/doc/publican-clusterlabs/xsl/header.html
deleted file mode 100644
index 957895814f..0000000000
--- a/doc/publican-clusterlabs/xsl/header.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<htmlcode>
-<script type="text/javascript">
-var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
-document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
-</script>
-<script type="text/javascript">
-try{
-var pageTracker = _gat._getTracker("UA-8156370-1");
-pageTracker._trackPageview();
-} catch(err) {}</script>
-</htmlcode>
-
diff --git a/doc/publican-clusterlabs/xsl/html-single.xsl b/doc/publican-clusterlabs/xsl/html-single.xsl
deleted file mode 100644
index 0a4839b54c..0000000000
--- a/doc/publican-clusterlabs/xsl/html-single.xsl
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version='1.0'?>
-
-<!--
- Copyright 2009 Andrew Beekhof
- License: GPL
- Author: Andrew Beekhof <andrew@beekhof.net>
--->
-
-<!DOCTYPE xsl:stylesheet [
-<!ENTITY lowercase "'abcdefghijklmnopqrstuvwxyz'">
-<!ENTITY uppercase "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'">
- ]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version='1.0'
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- exclude-result-prefixes="#default">
-
-<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>
-<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/graphics.xsl"/>
-<xsl:import href="https://fedorahosted.org/released/publican/xsl/docbook4/html-single.xsl"/>
-<xsl:import href="common.xsl"/>
-</xsl:stylesheet>
diff --git a/doc/publican-clusterlabs/xsl/html.xsl b/doc/publican-clusterlabs/xsl/html.xsl
deleted file mode 100644
index c4c44218a1..0000000000
--- a/doc/publican-clusterlabs/xsl/html.xsl
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version='1.0'?>
-
-<!--
- Copyright 2009 Andrew Beekhof
- License: GPL
- Author: Andrew Beekhof <andrew@beekhof.net>
--->
-
-<!DOCTYPE xsl:stylesheet [
-<!ENTITY lowercase "'abcdefghijklmnopqrstuvwxyz'">
-<!ENTITY uppercase "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'">
- ]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version='1.0'
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- exclude-result-prefixes="#default">
-
-<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>
-<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/graphics.xsl"/>
-<xsl:import href="https://fedorahosted.org/released/publican/xsl/docbook4/html.xsl"/>
-<xsl:import href="common.xsl"/>
-
-<xsl:template name="user.head.content">
- <!--
- Paths to document() are relative to the xml build directory under $book/tmp
- Not the location of this xslt
- -->
- <xsl:variable name="codefile" select="document('/usr/share/publican/Common_Content/clusterlabs/xsl/header.html',/)"/>
- <xsl:copy-of select="$codefile/htmlcode/node()"/>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/doc/publican-clusterlabs/xsl/pdf.xsl b/doc/publican-clusterlabs/xsl/pdf.xsl
deleted file mode 100644
index 9690ecca87..0000000000
--- a/doc/publican-clusterlabs/xsl/pdf.xsl
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version='1.0'?>
-
-<!--
- Copyright 2009 Andrew Beekhof
- License: GPL
- Author: Andrew Beekhof <andrew@beekhof.net>
--->
-
-<!DOCTYPE xsl:stylesheet [
-<!ENTITY lowercase "'abcdefghijklmnopqrstuvwxyz'">
-<!ENTITY uppercase "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'">
- ]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version='1.0'
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- exclude-result-prefixes="#default">
-
-<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>
-<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/graphics.xsl"/>
-<xsl:import href="https://fedorahosted.org/released/publican/xsl/docbook4/pdf.xsl"/>
-<xsl:import href="common.xsl"/>
-<xsl:param name="admon.graphics.extension" select="'.svg'"/>
-
-</xsl:stylesheet>
diff --git a/rpm/pacemaker.spec.in b/rpm/pacemaker.spec.in
index 04b5d91b63..781f47376f 100644
--- a/rpm/pacemaker.spec.in
+++ b/rpm/pacemaker.spec.in
@@ -1,897 +1,888 @@
# User-configurable globals and defines to control package behavior
# (these should not test {with X} values, which are declared later)
## User and group to use for nonprivileged services
%global uname hacluster
%global gname haclient
## Where to install Pacemaker documentation
%if 0%{?suse_version} > 0
%global pcmk_docdir %{_docdir}/%{name}-%{version}
%else
%if 0%{?rhel} > 7
%global pcmk_docdir %{_docdir}/%{name}-doc
%else
%global pcmk_docdir %{_docdir}/%{name}
%endif
%endif
## GitHub entity that distributes source (for ease of using a fork)
%global github_owner ClusterLabs
## Upstream pacemaker version, and its package version (specversion
## can be incremented to build packages reliably considered "newer"
## than previously built packages with the same pcmkversion)
%global pcmkversion X.Y.Z
%global specversion 1
## Upstream commit (full commit ID, abbreviated commit ID, or tag) to build
%global commit HEAD
## 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.
%global commit_abbrev 7
## Python major version to use (2, 3, or 0 for auto-detect)
%global python_major 0
# Define conditionals so that "rpmbuild --with <feature>" and
# "rpmbuild --without <feature>" can enable and disable specific features
## Add option to enable support for stonith/external fencing agents
%bcond_with stonithd
## Add option to enable support for storing sensitive information outside CIB
%bcond_with cibsecrets
## Add option to create binaries suitable for use with profiling tools
%bcond_with profiling
## Add option to create binaries with coverage analysis
%bcond_with coverage
## Add option to skip generating documentation
## (the build tools aren't available everywhere)
%bcond_without doc
## Add option to prefix package version with "0."
## (so later "official" packages will be considered updates)
%bcond_with pre_release
## Add option to ship Upstart job files
%bcond_with upstart_job
## Add option to turn off hardening of libraries and daemon executables
%bcond_without hardening
## Add option to disable links for legacy daemon names
%bcond_without legacy_links
# Define globals for convenient use later
## Workaround to use parentheses in other globals
%global lparen (
%global rparen )
## Whether this is a tagged release (final or release candidate)
%define tag_release %(c=%{commit}; case ${c} in Pacemaker-*%{rparen} echo 1 ;;
*%{rparen} echo 0 ;; esac)
## Portion of export/dist tarball name after "pacemaker-", and release version
%if 0%{tag_release}
%define archive_version %(c=%{commit}; echo ${c:10})
%define archive_github_url %{commit}#/%{name}-%{archive_version}.tar.gz
%define pcmk_release %(c=%{commit}; case $c in *-rc[[:digit:]]*%{rparen}
echo 0.%{specversion}.${c: -3} ;;
*%{rparen} echo %{specversion} ;; esac)
%else
%define archive_version %(c=%{commit}; echo ${c:0:%{commit_abbrev}})
%define archive_github_url %{archive_version}#/%{name}-%{archive_version}.tar.gz
%if %{with pre_release}
%define pcmk_release 0.%{specversion}.%{archive_version}.git
%else
%define pcmk_release %{specversion}.%{archive_version}.git
%endif
%endif
-## Heuristic used to infer bleeding-edge deployments that are
-## less likely to have working versions of the documentation tools
-%define bleeding %(test ! -e /etc/yum.repos.d/fedora-rawhide.repo; echo $?)
-
## Whether this platform defaults to using systemd as an init system
## (needs to be evaluated prior to BuildRequires being enumerated and
## installed as it's intended to conditionally select some of these, and
## for that there are only few indicators with varying reliability:
## - presence of systemd-defined macros (when building in a full-fledged
## environment, which is not the case with ordinary mock-based builds)
## - systemd-aware rpm as manifested with the presence of particular
## macro (rpm itself will trivially always be present when building)
## - existence of /usr/lib/os-release file, which is something heavily
## propagated by systemd project
## - when not good enough, there's always a possibility to check
## particular distro-specific macros (incl. version comparison)
%define systemd_native (%{?_unitdir:1}%{!?_unitdir:0}%{nil \
} || %{?__transaction_systemd_inhibit:1}%{!?__transaction_systemd_inhibit:0}%{nil \
} || %(test -f /usr/lib/os-release; test $? -ne 0; echo $?))
%if 0%{?fedora} > 20 || 0%{?rhel} > 7
## Base GnuTLS cipher priorities (presumably only the initial, required keyword)
## overridable with "rpmbuild --define 'pcmk_gnutls_priorities PRIORITY-SPEC'"
%define gnutls_priorities %{?pcmk_gnutls_priorities}%{!?pcmk_gnutls_priorities:@SYSTEM}
%endif
%if !%{defined _rundir}
%if 0%{?fedora} >= 15 || 0%{?rhel} >= 7 || 0%{?suse_version} >= 1200
%define _rundir /run
%else
%define _rundir /var/run
%endif
%endif
%if 0%{?fedora} > 22 || 0%{?rhel} > 7
%global supports_recommends 1
%endif
## Different distros name certain packages differently
## (note: corosync libraries also differ, but all provide corosync-devel)
%if 0%{?suse_version} > 0
%global pkgname_bzip2_devel libbz2-devel
%global pkgname_docbook_xsl docbook-xsl-stylesheets
%global pkgname_gnutls_devel libgnutls-devel
%global pkgname_shadow_utils shadow
%global pkgname_procps procps
%global pkgname_glue_libs libglue
%global pkgname_pcmk_libs lib%{name}3
%global hacluster_id 90
%else
%global pkgname_libtool_devel libtool-ltdl-devel
%global pkgname_libtool_devel_arch libtool-ltdl-devel%{?_isa}
%global pkgname_bzip2_devel bzip2-devel
%global pkgname_docbook_xsl docbook-style-xsl
%global pkgname_gnutls_devel gnutls-devel
%global pkgname_shadow_utils shadow-utils
%global pkgname_procps procps-ng
-%global pkgname_publican publican
%global pkgname_glue_libs cluster-glue-libs
%global pkgname_pcmk_libs %{name}-libs
%global hacluster_id 189
%endif
# Python-related definitions
## Use Python 3 on certain platforms if major version not specified
%if %{?python_major} == 0
%if 0%{?fedora} > 26 || 0%{?rhel} > 7
%global python_major 3
%endif
%endif
## Turn off auto-compilation of Python files outside Python specific paths,
## so there's no risk that unexpected "__python" macro gets picked to do the
## RPM-native byte-compiling there (only "{_datadir}/pacemaker/tests" affected)
## -- distro-dependent tricks or automake's fallback to be applied there
%if %{defined _python_bytecompile_extra}
%global _python_bytecompile_extra 0
%else
### the statement effectively means no RPM-native byte-compiling will occur at
### all, so distro-dependent tricks for Python-specific packages to be applied
%global __os_install_post %(echo '%{__os_install_post}' | {
sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g'; })
%endif
## Values that differ by Python major version
%if 0%{?python_major} > 2
%global python_name python3
%global python_path %{?__python3}%{!?__python3:/usr/bin/python%{?python3_pkgversion}%{!?python3_pkgversion:3}}
%define python_site %{?python3_sitelib}%{!?python3_sitelib:%(
%{python_path} -c 'from distutils.sysconfig import get_python_lib as gpl; print(gpl(1))' 2>/dev/null)}
%else
%if 0%{?python_major} > 1
%global python_name python2
%global python_path %{?__python2}%{!?__python2:/usr/bin/python%{?python2_pkgversion}%{!?python2_pkgversion:2}}
%define python_site %{?python2_sitelib}%{!?python2_sitelib:%(
%{python_path} -c 'from distutils.sysconfig import get_python_lib as gpl; print(gpl(1))' 2>/dev/null)}
%else
%if %{defined python_version}
%global python_name python%(echo %{python_version} | cut -d'.' -f1)
%define python_path %{?__python}%{!?__python:/usr/bin/%{python_name}}
%else
%global python_name python
%global python_path %{?__python}%{!?__python:/usr/bin/python%{?python_pkgversion}}
%endif
%define python_site %{?python_sitelib}%{!?python_sitelib:%(
%{python_name} -c 'from distutils.sysconfig import get_python_lib as gpl; print(gpl(1))' 2>/dev/null)}
%endif
%endif
# Definitions for backward compatibility with older RPM versions
## Ensure the license macro behaves consistently (older RPM will otherwise
## overwrite it once it encounters "License:"). Courtesy Jason Tibbitts:
## https://pkgs.fedoraproject.org/cgit/rpms/epel-rpm-macros.git/tree/macros.zzz-epel?h=el6&id=e1adcb77
%if !%{defined _licensedir}
%define description %{lua:
rpm.define("license %doc")
print("%description")
}
%endif
# Keep sane profiling data if requested
%if %{with profiling}
## Disable -debuginfo package and stripping binaries/libraries
%define debug_package %{nil}
%endif
Name: pacemaker
Summary: Scalable High-Availability cluster resource manager
Version: %{pcmkversion}
Release: %{pcmk_release}%{?dist}
%if %{defined _unitdir}
License: GPLv2+ and LGPLv2+
%else
# initscript is Revised BSD
License: GPLv2+ and LGPLv2+ and BSD
%endif
Url: https://www.clusterlabs.org/
Group: System Environment/Daemons
# Example: https://codeload.github.com/ClusterLabs/pacemaker/tar.gz/e91769e
# will download pacemaker-e91769e.tar.gz
#
# The ending part starting with '#' is ignored by github but necessary for
# rpmbuild to know what the tar archive name is. (The downloaded file will be
# named correctly only for commit IDs, not tagged releases.)
#
# You can use "spectool -s 0 pacemaker.spec" (rpmdevtools) to show final URL.
Source0: https://codeload.github.com/%{github_owner}/%{name}/tar.gz/%{archive_github_url}
Requires: resource-agents
Requires: %{pkgname_pcmk_libs}%{?_isa} = %{version}-%{release}
Requires: %{name}-cluster-libs%{?_isa} = %{version}-%{release}
Requires: %{name}-cli = %{version}-%{release}
%if !%{defined _unitdir}
Requires: %{pkgname_procps}
Requires: psmisc
%endif
%{?systemd_requires}
Requires: %{python_path}
BuildRequires: %{python_name}-devel
# Pacemaker requires a minimum libqb functionality
Requires: libqb >= 0.13.0
BuildRequires: libqb-devel >= 0.13.0
# Basics required for the build (even if usually satisfied through other BRs)
BuildRequires: coreutils findutils grep sed
# Required for core functionality
BuildRequires: automake autoconf gcc libtool pkgconfig %{?pkgname_libtool_devel}
BuildRequires: pkgconfig(glib-2.0) >= 2.16
BuildRequires: libxml2-devel libxslt-devel libuuid-devel
BuildRequires: %{pkgname_bzip2_devel}
# Enables optional functionality
BuildRequires: ncurses-devel %{pkgname_docbook_xsl}
BuildRequires: help2man %{pkgname_gnutls_devel} pam-devel pkgconfig(dbus-1)
%if %{systemd_native}
BuildRequires: pkgconfig(systemd)
%endif
Requires: corosync >= 2.0.0
BuildRequires: corosync-devel >= 2.0.0
%if %{with stonithd}
BuildRequires: %{pkgname_glue_libs}-devel
%endif
-## (note no avoiding effect when building through non-customized mock)
-%if !%{bleeding}
%if %{with doc}
-BuildRequires: inkscape asciidoc %{?pkgname_publican}
-%endif
+BuildRequires: inkscape asciidoc
%endif
Provides: pcmk-cluster-manager = %{version}-%{release}
Provides: pcmk-cluster-manager%{?_isa} = %{version}-%{release}
# Bundled bits
## Pacemaker uses the crypto/md5-buffer module from gnulib
%if 0%{?fedora} || 0%{?rhel}
Provides: bundled(gnulib)
%endif
%description
Pacemaker is an advanced, scalable High-Availability cluster resource
manager.
It supports more than 16 node clusters with significant capabilities
for managing resources and dependencies.
It will run scripts at initialization, when machines go up or down,
when related resources fail and can be configured to periodically check
resource health.
Available rpmbuild rebuild options:
--with(out) : cibsecrets coverage doc stonithd hardening pre_release
profiling upstart_job
%package cli
License: GPLv2+ and LGPLv2+
Summary: Command line tools for controlling Pacemaker clusters
Group: System Environment/Daemons
Requires: %{pkgname_pcmk_libs}%{?_isa} = %{version}-%{release}
%if 0%{?supports_recommends}
Recommends: pcmk-cluster-manager = %{version}-%{release}
# For crm_report
Recommends: tar
Recommends: bzip2
%endif
Requires: perl-TimeDate
Requires: %{pkgname_procps}
Requires: psmisc
Requires(post):coreutils
%description cli
Pacemaker is an advanced, scalable High-Availability cluster resource
manager.
The %{name}-cli package contains command line tools that can be used
to query and control the cluster from machines that may, or may not,
be part of the cluster.
%package -n %{pkgname_pcmk_libs}
License: GPLv2+ and LGPLv2+
Summary: Core Pacemaker libraries
Group: System Environment/Daemons
Requires(pre): %{pkgname_shadow_utils}
Requires: %{name}-schemas = %{version}-%{release}
# sbd 1.4.0+ supports the libpe_status API for pe_working_set_t
Conflicts: sbd < 1.4.0
%description -n %{pkgname_pcmk_libs}
Pacemaker is an advanced, scalable High-Availability cluster resource
manager.
The %{pkgname_pcmk_libs} package contains shared libraries needed for cluster
nodes and those just running the CLI tools.
%package cluster-libs
License: GPLv2+ and LGPLv2+
Summary: Cluster Libraries used by Pacemaker
Group: System Environment/Daemons
Requires: %{pkgname_pcmk_libs}%{?_isa} = %{version}-%{release}
%description cluster-libs
Pacemaker is an advanced, scalable High-Availability cluster resource
manager.
The %{name}-cluster-libs package contains cluster-aware shared
libraries needed for nodes that will form part of the cluster nodes.
%package remote
%if %{defined _unitdir}
License: GPLv2+ and LGPLv2+
%else
# initscript is Revised BSD
License: GPLv2+ and LGPLv2+ and BSD
%endif
Summary: Pacemaker remote daemon for non-cluster nodes
Group: System Environment/Daemons
Requires: %{pkgname_pcmk_libs}%{?_isa} = %{version}-%{release}
Requires: %{name}-cli = %{version}-%{release}
Requires: resource-agents
%if !%{defined _unitdir}
Requires: %{pkgname_procps}
%endif
# -remote can be fully independent of systemd
%{?systemd_ordering}%{!?systemd_ordering:%{?systemd_requires}}
Provides: pcmk-cluster-manager = %{version}-%{release}
Provides: pcmk-cluster-manager%{?_isa} = %{version}-%{release}
%description remote
Pacemaker is an advanced, scalable High-Availability cluster resource
manager.
The %{name}-remote package contains the Pacemaker Remote daemon
which is capable of extending pacemaker functionality to remote
nodes not running the full corosync/cluster stack.
%package -n %{pkgname_pcmk_libs}-devel
License: GPLv2+ and LGPLv2+
Summary: Pacemaker development package
Group: Development/Libraries
Requires: %{pkgname_pcmk_libs}%{?_isa} = %{version}-%{release}
Requires: %{name}-cluster-libs%{?_isa} = %{version}-%{release}
Requires: libuuid-devel%{?_isa} %{?pkgname_libtool_devel_arch}
Requires: libxml2-devel%{?_isa} libxslt-devel%{?_isa}
Requires: %{pkgname_bzip2_devel}%{?_isa} glib2-devel%{?_isa}
Requires: libqb-devel%{?_isa}
Requires: corosync-devel >= 2.0.0
%description -n %{pkgname_pcmk_libs}-devel
Pacemaker is an advanced, scalable High-Availability cluster resource
manager.
The %{pkgname_pcmk_libs}-devel package contains headers and shared libraries
for developing tools for Pacemaker.
%package cts
License: GPLv2+ and LGPLv2+
Summary: Test framework for cluster-related technologies like Pacemaker
Group: System Environment/Daemons
Requires: %{python_path}
Requires: %{pkgname_pcmk_libs} = %{version}-%{release}
Requires: %{name}-cli = %{version}-%{release}
Requires: %{pkgname_procps}
Requires: psmisc
BuildArch: noarch
# systemd python bindings are separate package in some distros
%if %{defined systemd_requires}
%if 0%{?fedora} > 22 || 0%{?rhel} > 7
Requires: %{python_name}-systemd
%else
%if 0%{?fedora} > 20 || 0%{?rhel} > 6
Requires: systemd-python
%endif
%endif
%endif
%description cts
Test framework for cluster-related technologies like Pacemaker
%package doc
License: CC-BY-SA-4.0
Summary: Documentation for Pacemaker
Group: Documentation
BuildArch: noarch
%description doc
Documentation for Pacemaker.
Pacemaker is an advanced, scalable High-Availability cluster resource
manager.
%package schemas
License: GPLv2+
Summary: Schemas and upgrade stylesheets for Pacemaker
BuildArch: noarch
%description schemas
Schemas and upgrade stylesheets for Pacemaker
Pacemaker is an advanced, scalable High-Availability cluster resource
manager.
%prep
%setup -q -n %{name}-%{archive_version}
%build
export systemdsystemunitdir=%{?_unitdir}%{!?_unitdir:no}
%if %{with hardening}
# prefer distro-provided hardening flags in case they are defined
# through _hardening_{c,ld}flags macros, configure script will
# use its own defaults otherwise; if such hardenings are completely
# undesired, rpmbuild using "--without hardening"
# (or "--define '_without_hardening 1'")
export CFLAGS_HARDENED_EXE="%{?_hardening_cflags}"
export CFLAGS_HARDENED_LIB="%{?_hardening_cflags}"
export LDFLAGS_HARDENED_EXE="%{?_hardening_ldflags}"
export LDFLAGS_HARDENED_LIB="%{?_hardening_ldflags}"
%endif
./autogen.sh
%{configure} \
PYTHON=%{python_path} \
%{!?with_hardening: --disable-hardening} \
%{!?with_legacy_links: --disable-legacy-links} \
%{?with_profiling: --with-profiling} \
%{?with_coverage: --with-coverage} \
%{?with_cibsecrets: --with-cibsecrets} \
- %{!?with_doc: --with-brand=} \
%{?gnutls_priorities: --with-gnutls-priorities="%{gnutls_priorities}"} \
--with-initdir=%{_initrddir} \
--with-runstatedir=%{_rundir} \
--localstatedir=%{_var} \
--with-version=%{version}-%{release}
%if 0%{?suse_version} >= 1200
# Fedora handles rpath removal automagically
sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool
sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool
%endif
make %{_smp_mflags} V=1
%check
make %{_smp_mflags} check
{ cts/cts-scheduler --run load-stopped-loop \
&& cts/cts-cli \
&& touch .CHECKED
} 2>&1 | sed 's/[fF]ail/faiil/g' # prevent false positives in rpmlint
[ -f .CHECKED ] && rm -f -- .CHECKED
exit $? # TODO remove when rpm<4.14 compatibility irrelevant
%install
# skip automake-native Python byte-compilation, since RPM-native one (possibly
# distro-confined to Python-specific directories, which is currently the only
# relevant place, anyway) assures proper intrinsic alignment with wider system
# (such as with py_byte_compile macro, which is concurrent Fedora/EL specific)
make install \
DESTDIR=%{buildroot} V=1 docdir=%{pcmk_docdir} \
%{?_python_bytecompile_extra:%{?py_byte_compile:am__py_compile=true}}
mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig
install -m 644 daemons/pacemakerd/pacemaker.sysconfig ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig/pacemaker
install -m 644 tools/crm_mon.sysconfig ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig/crm_mon
%if %{with upstart_job}
mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/init
install -m 644 pacemakerd/pacemaker.upstart ${RPM_BUILD_ROOT}%{_sysconfdir}/init/pacemaker.conf
install -m 644 pacemakerd/pacemaker.combined.upstart ${RPM_BUILD_ROOT}%{_sysconfdir}/init/pacemaker.combined.conf
install -m 644 tools/crm_mon.upstart ${RPM_BUILD_ROOT}%{_sysconfdir}/init/crm_mon.conf
%endif
%if %{defined _unitdir}
mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/lib/rpm-state/%{name}
%endif
# Don't package static libs
find %{buildroot} -name '*.a' -type f -print0 | xargs -0 rm -f
find %{buildroot} -name '*.la' -type f -print0 | xargs -0 rm -f
# For now, don't package the servicelog-related binaries built only for
# ppc64le when certain dependencies are installed. If they get more exercise by
# advanced users, we can reconsider.
rm -f %{buildroot}/%{_sbindir}/notifyServicelogEvent
rm -f %{buildroot}/%{_sbindir}/ipmiservicelogd
# Don't ship init scripts for systemd based platforms
%if %{defined _unitdir}
rm -f %{buildroot}/%{_initrddir}/pacemaker
rm -f %{buildroot}/%{_initrddir}/pacemaker_remote
%endif
# Byte-compile Python sources where suitable and the distro procedures known
%if %{defined py_byte_compile}
%{py_byte_compile %{python_path} %{buildroot}%{_datadir}/pacemaker/tests}
%if !%{defined _python_bytecompile_extra}
%{py_byte_compile %{python_path} %{buildroot}%{python_site}/cts}
%endif
%endif
%if %{with coverage}
GCOV_BASE=%{buildroot}/%{_var}/lib/pacemaker/gcov
mkdir -p $GCOV_BASE
find . -name '*.gcno' -type f | while read F ; do
D=`dirname $F`
mkdir -p ${GCOV_BASE}/$D
cp $F ${GCOV_BASE}/$D
done
%endif
%post
%if %{defined _unitdir}
%systemd_post pacemaker.service
%else
/sbin/chkconfig --add pacemaker || :
%endif
%preun
%if %{defined _unitdir}
%systemd_preun pacemaker.service
%else
/sbin/service pacemaker stop >/dev/null 2>&1 || :
if [ "$1" -eq 0 ]; then
# Package removal, not upgrade
/sbin/chkconfig --del pacemaker || :
fi
%endif
%postun
%if %{defined _unitdir}
%systemd_postun_with_restart pacemaker.service
%endif
%pre remote
%if %{defined _unitdir}
# Stop the service before anything is touched, and remember to restart
# it as one of the last actions (compared to using systemd_postun_with_restart,
# this avoids suicide when sbd is in use)
systemctl --quiet is-active pacemaker_remote
if [ $? -eq 0 ] ; then
mkdir -p %{_localstatedir}/lib/rpm-state/%{name}
touch %{_localstatedir}/lib/rpm-state/%{name}/restart_pacemaker_remote
systemctl stop pacemaker_remote >/dev/null 2>&1
else
rm -f %{_localstatedir}/lib/rpm-state/%{name}/restart_pacemaker_remote
fi
%endif
%post remote
%if %{defined _unitdir}
%systemd_post pacemaker_remote.service
%else
/sbin/chkconfig --add pacemaker_remote || :
%endif
%preun remote
%if %{defined _unitdir}
%systemd_preun pacemaker_remote.service
%else
/sbin/service pacemaker_remote stop >/dev/null 2>&1 || :
if [ "$1" -eq 0 ]; then
# Package removal, not upgrade
/sbin/chkconfig --del pacemaker_remote || :
fi
%endif
%postun remote
%if %{defined _unitdir}
# This next line is a no-op, because we stopped the service earlier, but
# we leave it here because it allows us to revert to the standard behavior
# in the future if desired
%systemd_postun_with_restart pacemaker_remote.service
# Explicitly take care of removing the flag-file(s) upon final removal
if [ "$1" -eq 0 ] ; then
rm -f %{_localstatedir}/lib/rpm-state/%{name}/restart_pacemaker_remote
fi
%endif
%posttrans remote
%if %{defined _unitdir}
if [ -e %{_localstatedir}/lib/rpm-state/%{name}/restart_pacemaker_remote ] ; then
systemctl start pacemaker_remote >/dev/null 2>&1
rm -f %{_localstatedir}/lib/rpm-state/%{name}/restart_pacemaker_remote
fi
%endif
%post cli
%if %{defined _unitdir}
%systemd_post crm_mon.service
%endif
if [ "$1" -eq 2 ]; then
# Package upgrade, not initial install:
# Move any pre-2.0 logs to new location to ensure they get rotated
{ mv -fbS.rpmsave %{_var}/log/pacemaker.log* %{_var}/log/pacemaker \
|| mv -f %{_var}/log/pacemaker.log* %{_var}/log/pacemaker
} >/dev/null 2>/dev/null || :
fi
%preun cli
%if %{defined _unitdir}
%systemd_preun crm_mon.service
%endif
%postun cli
%if %{defined _unitdir}
%systemd_postun_with_restart crm_mon.service
%endif
%pre -n %{pkgname_pcmk_libs}
getent group %{gname} >/dev/null || groupadd -r %{gname} -g %{hacluster_id}
getent passwd %{uname} >/dev/null || useradd -r -g %{gname} -u %{hacluster_id} -s /sbin/nologin -c "cluster user" %{uname}
exit 0
%if %{defined ldconfig_scriptlets}
%ldconfig_scriptlets -n %{pkgname_pcmk_libs}
%ldconfig_scriptlets cluster-libs
%else
%post -n %{pkgname_pcmk_libs} -p /sbin/ldconfig
%postun -n %{pkgname_pcmk_libs} -p /sbin/ldconfig
%post cluster-libs -p /sbin/ldconfig
%postun cluster-libs -p /sbin/ldconfig
%endif
%files
###########################################################
%config(noreplace) %{_sysconfdir}/sysconfig/pacemaker
%{_sbindir}/pacemakerd
%if %{defined _unitdir}
%{_unitdir}/pacemaker.service
%else
%{_initrddir}/pacemaker
%endif
%exclude %{_libexecdir}/pacemaker/cts-log-watcher
%exclude %{_libexecdir}/pacemaker/cts-support
%exclude %{_sbindir}/pacemaker-remoted
%if %{with legacy_links}
%exclude %{_sbindir}/pacemaker_remoted
%endif
%{_libexecdir}/pacemaker/*
%{_sbindir}/crm_attribute
%{_sbindir}/crm_master
%{_sbindir}/fence_legacy
%doc %{_mandir}/man7/pacemaker-controld.*
%doc %{_mandir}/man7/pacemaker-schedulerd.*
%doc %{_mandir}/man7/pacemaker-fenced.*
%doc %{_mandir}/man7/ocf_pacemaker_controld.*
%doc %{_mandir}/man7/ocf_pacemaker_o2cb.*
%doc %{_mandir}/man7/ocf_pacemaker_remote.*
%doc %{_mandir}/man8/crm_attribute.*
%doc %{_mandir}/man8/crm_master.*
%doc %{_mandir}/man8/fence_legacy.*
%doc %{_mandir}/man8/pacemakerd.*
%doc %{_datadir}/pacemaker/alerts
%license licenses/GPLv2
%doc COPYING
%doc ChangeLog
%dir %attr (750, %{uname}, %{gname}) %{_var}/lib/pacemaker/cib
%dir %attr (750, %{uname}, %{gname}) %{_var}/lib/pacemaker/pengine
/usr/lib/ocf/resource.d/pacemaker/controld
/usr/lib/ocf/resource.d/pacemaker/o2cb
/usr/lib/ocf/resource.d/pacemaker/remote
%if %{with upstart_job}
%config(noreplace) %{_sysconfdir}/init/pacemaker.conf
%config(noreplace) %{_sysconfdir}/init/pacemaker.combined.conf
%endif
%files cli
%dir %attr (750, root, %{gname}) %{_sysconfdir}/pacemaker
%config(noreplace) %{_sysconfdir}/logrotate.d/pacemaker
%config(noreplace) %{_sysconfdir}/sysconfig/crm_mon
%if %{defined _unitdir}
%{_unitdir}/crm_mon.service
%endif
%if %{with upstart_job}
%config(noreplace) %{_sysconfdir}/init/crm_mon.conf
%endif
%{_sbindir}/attrd_updater
%{_sbindir}/cibadmin
%if %{with cibsecrets}
%{_sbindir}/cibsecret
%endif
%{_sbindir}/crm_diff
%{_sbindir}/crm_error
%{_sbindir}/crm_failcount
%{_sbindir}/crm_mon
%{_sbindir}/crm_node
%{_sbindir}/crm_resource
%{_sbindir}/crm_rule
%{_sbindir}/crm_standby
%{_sbindir}/crm_verify
%{_sbindir}/crmadmin
%{_sbindir}/iso8601
%{_sbindir}/crm_shadow
%{_sbindir}/crm_simulate
%{_sbindir}/crm_report
%{_sbindir}/crm_ticket
%{_sbindir}/stonith_admin
# "dirname" is owned by -schemas, which is a prerequisite
%{_datadir}/pacemaker/report.collector
%{_datadir}/pacemaker/report.common
# XXX "dirname" is not owned by any prerequisite
%{_datadir}/snmp/mibs/PCMK-MIB.txt
%exclude /usr/lib/ocf/resource.d/pacemaker/controld
%exclude /usr/lib/ocf/resource.d/pacemaker/o2cb
%exclude /usr/lib/ocf/resource.d/pacemaker/remote
%dir /usr/lib/ocf
%dir /usr/lib/ocf/resource.d
/usr/lib/ocf/resource.d/pacemaker
%doc %{_mandir}/man7/*
%exclude %{_mandir}/man7/pacemaker-controld.*
%exclude %{_mandir}/man7/pacemaker-schedulerd.*
%exclude %{_mandir}/man7/pacemaker-fenced.*
%exclude %{_mandir}/man7/ocf_pacemaker_controld.*
%exclude %{_mandir}/man7/ocf_pacemaker_o2cb.*
%exclude %{_mandir}/man7/ocf_pacemaker_remote.*
%doc %{_mandir}/man8/*
%exclude %{_mandir}/man8/crm_attribute.*
%exclude %{_mandir}/man8/crm_master.*
%exclude %{_mandir}/man8/fence_legacy.*
%exclude %{_mandir}/man8/pacemakerd.*
%exclude %{_mandir}/man8/pacemaker-remoted.*
%license licenses/GPLv2
%doc COPYING
%doc ChangeLog
%dir %attr (750, %{uname}, %{gname}) %{_var}/lib/pacemaker
%dir %attr (750, %{uname}, %{gname}) %{_var}/lib/pacemaker/blackbox
%dir %attr (750, %{uname}, %{gname}) %{_var}/lib/pacemaker/cores
%dir %attr (770, %{uname}, %{gname}) %{_var}/log/pacemaker
%dir %attr (770, %{uname}, %{gname}) %{_var}/log/pacemaker/bundles
%files -n %{pkgname_pcmk_libs}
%{_libdir}/libcib.so.*
%{_libdir}/liblrmd.so.*
%{_libdir}/libcrmservice.so.*
%{_libdir}/libcrmcommon.so.*
%{_libdir}/libpe_status.so.*
%{_libdir}/libpe_rules.so.*
%{_libdir}/libpacemaker.so.*
%{_libdir}/libstonithd.so.*
%license licenses/LGPLv2.1
%doc COPYING
%doc ChangeLog
%files cluster-libs
%{_libdir}/libcrmcluster.so.*
%license licenses/LGPLv2.1
%doc COPYING
%doc ChangeLog
%files remote
%config(noreplace) %{_sysconfdir}/sysconfig/pacemaker
%if %{defined _unitdir}
# state directory is shared between the subpackets
# let rpm take care of removing it once it isn't
# referenced anymore and empty
%ghost %dir %{_localstatedir}/lib/rpm-state/%{name}
%{_unitdir}/pacemaker_remote.service
%else
%{_initrddir}/pacemaker_remote
%endif
%{_sbindir}/pacemaker-remoted
%if %{with legacy_links}
%{_sbindir}/pacemaker_remoted
%endif
%{_mandir}/man8/pacemaker-remoted.*
%license licenses/GPLv2
%doc COPYING
%doc ChangeLog
%files doc
%doc %{pcmk_docdir}
%license licenses/CC-BY-SA-4.0
%files cts
%{python_site}/cts
%{_datadir}/pacemaker/tests
%{_libexecdir}/pacemaker/cts-log-watcher
%{_libexecdir}/pacemaker/cts-support
%license licenses/GPLv2
%doc COPYING
%doc ChangeLog
%files -n %{pkgname_pcmk_libs}-devel
%{_includedir}/pacemaker
%{_libdir}/*.so
%if %{with coverage}
%{_var}/lib/pacemaker/gcov
%endif
%{_libdir}/pkgconfig/*.pc
%license licenses/LGPLv2.1
%doc COPYING
%doc ChangeLog
%files schemas
%license licenses/GPLv2
%dir %{_datadir}/pacemaker
%{_datadir}/pacemaker/*.rng
%{_datadir}/pacemaker/*.xsl
%{_datadir}/pacemaker/api
%{_datadir}/pkgconfig/pacemaker-schemas.pc
%changelog
* PACKAGE_DATE ClusterLabs <admin@clusterlabs.org> PACKAGE_VERSION-1
- See included ChangeLog file for details

File Metadata

Mime Type
text/x-diff
Expires
Sat, Nov 23, 10:04 AM (1 d, 13 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1018543
Default Alt Text
(1 MB)

Event Timeline