12#include <libxml/xpath.h>
23#define XPATH_NODE_RULE "//" PCMK_XE_RULE "[@" PCMK_XA_ID "='%s']"
38 xmlNodePtr cib_constraints = NULL;
39 xmlNodePtr match = NULL;
40 xmlXPathObject *xpath_obj = NULL;
62 num_results = pcmk__xpath_num_results(xpath_obj);
65 xmlXPathFreeObject(xpath_obj);
67 if (num_results == 0) {
68 *error =
"Rule not found";
72 if (num_results > 1) {
74 *error =
"Found more than one rule with matching ID";
81 num_results = pcmk__xpath_num_results(xpath_obj);
84 xmlXPathFreeObject(xpath_obj);
86 if (num_results != 1) {
87 if (num_results == 0) {
88 *error =
"Rule does not have a date expression";
90 *error =
"Rule has more than one date expression";
102 num_results = pcmk__xpath_num_results(xpath_obj);
106 if (num_results == 0) {
107 xmlXPathFreeObject(xpath_obj);
117 num_results = pcmk__xpath_num_results(xpath_obj);
121 if (num_results == 0) {
122 xmlXPathFreeObject(xpath_obj);
140 *error =
"Error parsing rule";
143 xmlXPathFreeObject(xpath_obj);
162 const char **rule_ids)
169 if (rule_ids == NULL) {
179 for (
const char **rule_id = rule_ids; *rule_id != NULL; rule_id++) {
180 const char *error = NULL;
181 int last_rc = eval_rule(
scheduler, *rule_id, &error);
183 out->
message(out,
"rule-check", *rule_id, last_rc, error);
197 const char **rule_ids)
xmlNode * pcmk_find_cib_element(xmlNode *cib, const char *element_name)
Find an element in the CIB.
@ pcmk__condition_datetime
struct crm_time_s crm_time_t
G_GNUC_INTERNAL int pcmk__init_scheduler(pcmk__output_t *out, xmlNodePtr input, const crm_time_t *date, pcmk_scheduler_t **scheduler)
pcmk_scheduler_t * scheduler
#define PCMK_VALUE_DATE_SPEC
void pcmk__xml_output_finish(pcmk__output_t *out, crm_exit_t exit_status, xmlNodePtr *xml)
int pcmk__xml_output_new(pcmk__output_t **out, xmlNodePtr *xml)
int pcmk__check_rules(pcmk__output_t *out, xmlNodePtr input, const crm_time_t *date, const char **rule_ids)
int pcmk_check_rules(xmlNodePtr *xml, xmlNodePtr input, const crm_time_t *date, const char **rule_ids)
Check whether each rule in a list is in effect.
void pcmk__register_lib_messages(pcmk__output_t *out)
crm_exit_t pcmk_rc2exitc(int rc)
Map a function return code to the most similar exit code.
#define pcmk__assert(expr)
int pcmk__evaluate_date_expression(const xmlNode *date_expression, const crm_time_t *now, crm_time_t *next_change)
enum expression_type pcmk__condition_type(const xmlNode *condition)
void pcmk_free_scheduler(pcmk_scheduler_t *scheduler)
Free scheduler data.
char * crm_strdup_printf(char const *format,...) G_GNUC_PRINTF(1
This structure contains everything that makes up a single output formatter.
int(* message)(pcmk__output_t *out, const char *message_id,...)
pcmk__scheduler_private_t * priv
Wrappers for and extensions to libxml2.
#define PCMK_XE_CONSTRAINTS
#define PCMK_XA_OPERATION
#define PCMK_XE_DATE_SPEC
#define PCMK_XE_DATE_EXPRESSION
xmlXPathObject * pcmk__xpath_search(xmlDoc *doc, const char *path)
xmlNode * pcmk__xpath_result(xmlXPathObject *xpath_obj, int index)