48#define PE__CONTAINER_AGENT_UNKNOWN_S "unknown"
49#define PE__CONTAINER_AGENT_DOCKER_S "docker"
50#define PE__CONTAINER_AGENT_PODMAN_S "podman"
52typedef struct pe__bundle_variant_data_s {
55 int nreplicas_per_host;
62 char *container_network;
65 gchar *container_host_options;
66 char *container_command;
67 char *launcher_options;
68 const char *attribute_target;
82#define get_bundle_variant_data(data, rsc) do { \
83 pcmk__assert(pcmk__is_bundle(rsc)); \
84 data = rsc->priv->variant_opaque; \
101 return bundle_data->nreplicas;
118 return bundle_data->child;
136 if (!pcmk__is_bundle(top)) {
141 for (
const GList *iter =
data->replicas; iter != NULL; iter = iter->next) {
145 return replica->
child;
167 for (GList *iter = bundle_data->replicas; iter != NULL; iter = iter->next) {
170 if (pcmk__same_node(node, replica->
node)) {
193 if (bundle_data->replicas == NULL) {
196 replica = bundle_data->replicas->data;
217 for (GList *iter = bundle_data->replicas; iter != NULL; iter = iter->next) {
242 for (
const GList *iter = bundle_data->replicas; iter != NULL;
252next_ip(
const char *last_ip)
254 unsigned int oct1 = 0;
255 unsigned int oct2 = 0;
256 unsigned int oct3 = 0;
257 unsigned int oct4 = 0;
258 int rc = sscanf(last_ip,
"%u.%u.%u.%u", &oct1, &oct2, &oct3, &oct4);
264 }
else if (oct3 > 253) {
267 }
else if (oct4 > 253) {
282 if(
data->ip_range_start == NULL) {
285 }
else if(
data->ip_last) {
289 replica->
ipaddr = strdup(
data->ip_range_start);
293 switch (
data->agent_type) {
296 if (
data->add_host) {
297 g_string_append_printf(buffer,
" --add-host=%s-%d:%s",
301 g_string_append_printf(buffer,
" --hosts-entry=%s=%s-%d",
313create_resource(
const char *
name,
const char *provider,
const char *kind)
340 if(
data->ip_range_start) {
343 if(
data->control_port) {
344 if(
data->nreplicas_per_host > 1) {
348 data->nreplicas_per_host = 1;
361 if(
data->ip_range_start) {
363 xmlNode *xml_ip = NULL;
364 xmlNode *xml_obj = NULL;
368 xml_ip = create_resource(
id,
"heartbeat",
"IPaddr2");
376 if(
data->host_network) {
380 if(
data->host_netmask) {
382 "cidr_netmask",
data->host_netmask);
399 parent->priv->children = g_list_append(
parent->priv->children,
423 xmlNode *xml_container = NULL;
424 xmlNode *xml_obj = NULL;
427 const char *hostname_opt = NULL;
428 const char *env_opt = NULL;
429 const char *agent_str = NULL;
431 GString *buffer = NULL;
432 GString *dbuffer = NULL;
435 switch (
data->agent_type) {
438 hostname_opt =
"-h ";
444 agent_str = container_agent_str(
data->agent_type);
446 buffer = g_string_sized_new(4096);
451 xml_container = create_resource(
id,
"heartbeat", agent_str);
463 g_string_append(buffer,
" --restart=no");
471 if (
data->ip_range_start != NULL) {
472 g_string_append_printf(buffer,
" %s%s-%d", hostname_opt,
data->prefix,
477 if (
data->container_network != NULL) {
481 if (
data->control_port != NULL) {
483 data->control_port, NULL);
489 for (GList *iter =
data->mounts; iter != NULL; iter = iter->next) {
490 pe__bundle_mount_t *mount = (pe__bundle_mount_t *) iter->data;
499 switch (
data->agent_type) {
503 " -v ", pcmk__s(source, mount->source),
504 ":", mount->target, NULL);
506 if (mount->options != NULL) {
516 for (GList *iter =
data->ports; iter != NULL; iter = iter->next) {
517 pe__bundle_port_t *port = (pe__bundle_port_t *) iter->data;
519 switch (
data->agent_type) {
522 if (replica->
ipaddr != NULL) {
524 " -p ", replica->
ipaddr,
":", port->source,
525 ":", port->target, NULL);
527 }
else if (!pcmk__str_eq(
data->container_network,
531 " -p ", port->source,
":", port->target,
552 if (
data->launcher_options != NULL) {
556 if (
data->container_host_options != NULL) {
561 (
const char *) buffer->str);
562 g_string_free(buffer, TRUE);
565 (dbuffer != NULL)? (
const char *) dbuffer->str :
"");
566 if (dbuffer != NULL) {
567 g_string_free(dbuffer, TRUE);
570 if (replica->
child != NULL) {
571 if (
data->container_command != NULL) {
573 data->container_command);
592 }
else if ((child != NULL) &&
data->untrusted) {
599 if (
data->container_command != NULL) {
601 data->container_command);
622 parent->priv->children = g_list_append(
parent->priv->children,
643 g_list_foreach(rsc->
priv->
children, (GFunc) disallow_node,
651 if (replica->
child && valid_network(
data)) {
652 GHashTableIter gIter;
654 xmlNode *xml_remote = NULL;
657 const char *
uname = NULL;
658 const char *connect_name = NULL;
675 connect_name = (replica->
ipaddr? replica->
ipaddr :
"#uname");
677 if (
data->control_port == NULL) {
688 connect_name, (
data->control_port?
689 data->control_port : port_s));
698 uname = pcmk__xe_id(xml_remote);
731 (GFunc) disallow_node, (gpointer)
uname);
752 g_hash_table_insert(
parent->priv->allowed_nodes,
761 while (g_hash_table_iter_next(&gIter, NULL, (
void **)&node)) {
762 if (pcmk__is_pacemaker_remote_node(node)) {
789 parent->priv->children = g_list_append(
parent->priv->children,
802 rc = create_container_resource(
parent,
data, replica);
807 rc = create_ip_resource(
parent,
data, replica);
812 rc = create_remote_resource(
parent,
data, replica);
817 if ((replica->
child != NULL) && (replica->
ipaddr != NULL)) {
821 if (replica->
remote != NULL) {
837 const char *
target,
const char *options, uint32_t
flags)
840 sizeof(pe__bundle_mount_t));
845 mount->flags =
flags;
846 bundle_data->mounts = g_list_append(bundle_data->mounts, mount);
850mount_free(pe__bundle_mount_t *mount)
854 free(mount->options);
859port_free(pe__bundle_port_t *port)
880 for (GList *gIter = bundle_data->replicas; gIter != NULL;
881 gIter = gIter->next) {
884 if (replica->
remote == remote) {
896 GHashTable *params = NULL;
923 replica = replica_for_remote(rsc);
924 if (replica == NULL) {
933 node = pcmk__current_node(replica->
container);
937 crm_trace(
"Cannot determine address for bundle connection %s", rsc->
id);
941 crm_trace(
"Setting address for bundle connection %s to bundle host %s",
942 rsc->
id, pcmk__node_name(node));
943 if(xml != NULL && field != NULL) {
950#define pe__set_bundle_mount_flags(mount_xml, flags, flags_to_set) do { \
951 flags = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, \
952 "Bundle mount", pcmk__xe_id(mount_xml), \
953 flags, (flags_to_set), #flags_to_set); \
959 const char *value = NULL;
960 xmlNode *xml_obj = NULL;
961 const xmlNode *xml_child = NULL;
962 xmlNode *xml_resource = NULL;
964 bool need_log_mount = TRUE;
971 bundle_data->prefix = strdup(rsc->
id);
975 if (xml_obj != NULL) {
979 if (xml_obj == NULL) {
982 if (xml_obj != NULL) {
987 if (xml_obj == NULL) {
999 if ((value == NULL) && (bundle_data->promoted_max > 0)) {
1000 bundle_data->nreplicas = bundle_data->promoted_max;
1012 if (bundle_data->nreplicas_per_host == 1) {
1016 bundle_data->container_command =
1027 bundle_data->ip_range_start =
1029 bundle_data->host_netmask =
1031 bundle_data->host_network =
1033 bundle_data->control_port =
1037 bundle_data->add_host = TRUE;
1045 pe__bundle_port_t *port =
1050 if(port->source == NULL) {
1057 if(port->source != NULL && strlen(port->source) > 0) {
1058 if(port->target == NULL) {
1059 port->target = strdup(port->source);
1061 bundle_data->ports = g_list_append(bundle_data->ports, port);
1065 pcmk__xe_id(xml_child));
1083 if (source == NULL) {
1090 mount_add(bundle_data, source,
target, options,
flags);
1091 if (strcmp(
target,
"/var/log") == 0) {
1092 need_log_mount = FALSE;
1096 pcmk__xe_id(xml_child));
1102 if (xml_obj && valid_network(bundle_data)) {
1103 const char *suffix = NULL;
1105 xmlNode *xml_set = NULL;
1113 suffix = (
const char *) xml_resource->name;
1114 if (bundle_data->promoted_max > 0) {
1122 bundle_data->prefix, xml_resource->name);
1127 value = pcmk__itoa(bundle_data->nreplicas);
1131 value = pcmk__itoa(bundle_data->nreplicas_per_host);
1136 pcmk__btoa(bundle_data->nreplicas_per_host > 1));
1138 if (bundle_data->promoted_max) {
1142 value = pcmk__itoa(bundle_data->promoted_max);
1150 }
else if(xml_obj) {
1153 rsc->
id, pcmk__xe_id(xml_obj));
1159 GList *childIter = NULL;
1160 pe__bundle_port_t *port = NULL;
1161 GString *buffer = NULL;
1192 if (need_log_mount) {
1198 if(bundle_data->control_port) {
1199 port->source = strdup(bundle_data->control_port);
1212 port->target = strdup(port->source);
1213 bundle_data->ports = g_list_append(bundle_data->ports, port);
1215 buffer = g_string_sized_new(1024);
1217 childIter != NULL; childIter = childIter->next) {
1222 replica->
child = childIter->data;
1231 allocate_ip(bundle_data, replica, buffer);
1232 bundle_data->replicas = g_list_append(bundle_data->replicas,
1235 bundle_data->attribute_target =
1239 bundle_data->container_host_options = g_string_free(buffer, FALSE);
1241 if (bundle_data->attribute_target) {
1244 bundle_data->attribute_target);
1247 bundle_data->attribute_target);
1252 GString *buffer = g_string_sized_new(1024);
1254 for (
int lpc = 0; lpc < bundle_data->nreplicas; lpc++) {
1259 allocate_ip(bundle_data, replica, buffer);
1260 bundle_data->replicas = g_list_append(bundle_data->replicas,
1263 bundle_data->container_host_options = g_string_free(buffer, FALSE);
1266 for (GList *gIter = bundle_data->replicas; gIter != NULL;
1267 gIter = gIter->next) {
1270 if (create_replica_resources(rsc, bundle_data, replica) !=
pcmk_rc_ok) {
1292 if (replica->
child != NULL) {
1302 if (bundle_data->child) {
1304 bundle_data->child);
1315 if (child_active && !all) {
1317 }
else if (!child_active && all) {
1331 for (iter = bundle_data->replicas; iter != NULL; iter = iter->next) {
1335 rsc_active = replica_resource_active(replica->
ip, all);
1336 if (rsc_active >= 0) {
1337 return (
bool) rsc_active;
1340 rsc_active = replica_resource_active(replica->
child, all);
1341 if (rsc_active >= 0) {
1342 return (
bool) rsc_active;
1345 rsc_active = replica_resource_active(replica->
container, all);
1346 if (rsc_active >= 0) {
1347 return (
bool) rsc_active;
1350 rsc_active = replica_resource_active(replica->
remote, all);
1351 if (rsc_active >= 0) {
1352 return (
bool) rsc_active;
1380 for (GList *gIter = bundle_data->replicas; gIter != NULL;
1381 gIter = gIter->next) {
1385 if (pcmk__same_node(replica->
node, node)) {
1386 return replica->
child;
1392PCMK__OUTPUT_ARGS(
"bundle",
"uint32_t",
"pcmk_resource_t *",
"GList *",
1397 uint32_t show_opts = va_arg(args, uint32_t);
1399 GList *only_node = va_arg(args, GList *);
1400 GList *only_rsc = va_arg(args, GList *);
1404 gboolean printed_header = FALSE;
1405 bool print_everything =
true;
1407 const char *desc = NULL;
1418 for (GList *gIter = bundle_data->replicas; gIter != NULL;
1419 gIter = gIter->next) {
1426 gboolean print_ip, print_child, print_ctnr, print_remote;
1434 print_ip = (ip != NULL)
1437 print_child = (child != NULL)
1442 print_remote = (remote != NULL)
1446 if (!print_everything && !print_ip && !print_child && !print_ctnr && !print_remote) {
1450 if (!printed_header) {
1451 const char *
type = container_agent_str(bundle_data->agent_type);
1453 const char *maintenance = pcmk__flag_text(rsc->
flags,
1455 const char *managed = pcmk__flag_text(rsc->
flags,
1459 printed_header = TRUE;
1476 id = pcmk__itoa(replica->
offset);
1484 out->message(out, (
const char *) ip->
priv->
xml->name, show_opts,
1485 ip, only_node, only_rsc);
1489 out->message(out, (
const char *) child->
priv->
xml->name,
1490 show_opts, child, only_node, only_rsc);
1494 out->message(out, (
const char *) container->
priv->
xml->name,
1495 show_opts, container, only_node, only_rsc);
1499 out->message(out, (
const char *) remote->
priv->
xml->name,
1500 show_opts, remote, only_node, only_rsc);
1506 if (printed_header) {
1521 char buffer[LINE_MAX];
1528 offset += snprintf(buffer + offset, LINE_MAX - offset,
"%s",
1531 offset += snprintf(buffer + offset, LINE_MAX - offset,
"%s",
1535 offset += snprintf(buffer + offset, LINE_MAX - offset,
" (%s)",
1555 return " (maintenance)";
1558 return " (unmanaged)";
1563PCMK__OUTPUT_ARGS(
"bundle",
"uint32_t",
"pcmk_resource_t *",
"GList *",
1568 uint32_t show_opts = va_arg(args, uint32_t);
1570 GList *only_node = va_arg(args, GList *);
1571 GList *only_rsc = va_arg(args, GList *);
1573 const char *desc = NULL;
1576 bool print_everything =
true;
1589 for (GList *gIter = bundle_data->replicas; gIter != NULL;
1590 gIter = gIter->next) {
1596 gboolean print_ip, print_child, print_ctnr, print_remote;
1604 print_ip = (ip != NULL)
1607 print_child = (child != NULL)
1612 print_remote = (remote != NULL)
1617 (print_everything == FALSE && (print_ip || print_child || print_ctnr || print_remote))) {
1624 (bundle_data->nreplicas > 1)?
" set" :
"",
1625 rsc->
id, bundle_data->image,
1627 desc ?
" (" :
"", desc ? desc :
"", desc ?
")" :
"",
1628 get_unmanaged_str(rsc));
1630 if (pcmk__list_of_multiple(bundle_data->replicas)) {
1631 out->begin_list(out, NULL, NULL,
"Replica[%d]", replica->
offset);
1635 out->message(out, (
const char *) ip->
priv->
xml->name,
1636 new_show_opts, ip, only_node, only_rsc);
1640 out->message(out, (
const char *) child->
priv->
xml->name,
1641 new_show_opts, child, only_node, only_rsc);
1645 out->message(out, (
const char *) container->
priv->
xml->name,
1646 new_show_opts, container, only_node, only_rsc);
1650 out->message(out, (
const char *) remote->
priv->
xml->name,
1651 new_show_opts, remote, only_node, only_rsc);
1654 if (pcmk__list_of_multiple(bundle_data->replicas)) {
1657 }
else if (print_everything == FALSE && !(print_ip || print_child || print_ctnr || print_remote)) {
1661 (bundle_data->nreplicas > 1)?
" set" :
"",
1662 rsc->
id, bundle_data->image,
1664 desc ?
" (" :
"", desc ? desc :
"", desc ?
")" :
"",
1665 get_unmanaged_str(rsc));
1667 pe__bundle_replica_output_html(out, replica,
1668 pcmk__current_node(container),
1685 char buffer[LINE_MAX];
1692 offset += snprintf(buffer + offset, LINE_MAX - offset,
"%s",
1695 offset += snprintf(buffer + offset, LINE_MAX - offset,
"%s",
1699 offset += snprintf(buffer + offset, LINE_MAX - offset,
" (%s)",
1706PCMK__OUTPUT_ARGS(
"bundle",
"uint32_t",
"pcmk_resource_t *",
"GList *",
1711 uint32_t show_opts = va_arg(args, uint32_t);
1713 GList *only_node = va_arg(args, GList *);
1714 GList *only_rsc = va_arg(args, GList *);
1716 const char *desc = NULL;
1719 bool print_everything =
true;
1732 for (GList *gIter = bundle_data->replicas; gIter != NULL;
1733 gIter = gIter->next) {
1739 gboolean print_ip, print_child, print_ctnr, print_remote;
1747 print_ip = (ip != NULL)
1750 print_child = (child != NULL)
1755 print_remote = (remote != NULL)
1760 (print_everything == FALSE && (print_ip || print_child || print_ctnr || print_remote))) {
1767 (bundle_data->nreplicas > 1)?
" set" :
"",
1768 rsc->
id, bundle_data->image,
1770 desc ?
" (" :
"", desc ? desc :
"", desc ?
")" :
"",
1771 get_unmanaged_str(rsc));
1773 if (pcmk__list_of_multiple(bundle_data->replicas)) {
1774 out->list_item(out, NULL,
"Replica[%d]", replica->
offset);
1777 out->begin_list(out, NULL, NULL, NULL);
1780 out->message(out, (
const char *) ip->
priv->
xml->name,
1781 new_show_opts, ip, only_node, only_rsc);
1785 out->message(out, (
const char *) child->
priv->
xml->name,
1786 new_show_opts, child, only_node, only_rsc);
1790 out->message(out, (
const char *) container->
priv->
xml->name,
1791 new_show_opts, container, only_node, only_rsc);
1795 out->message(out, (
const char *) remote->
priv->
xml->name,
1796 new_show_opts, remote, only_node, only_rsc);
1800 }
else if (print_everything == FALSE && !(print_ip || print_child || print_ctnr || print_remote)) {
1804 (bundle_data->nreplicas > 1)?
" set" :
"",
1805 rsc->
id, bundle_data->image,
1807 desc ?
" (" :
"", desc ? desc :
"", desc ?
")" :
"",
1808 get_unmanaged_str(rsc));
1810 pe__bundle_replica_output_text(out, replica,
1811 pcmk__current_node(container),
1823 if (replica == NULL) {
1828 replica->
node = NULL;
1858 free(bundle_data->prefix);
1859 free(bundle_data->image);
1860 free(bundle_data->control_port);
1861 free(bundle_data->host_network);
1862 free(bundle_data->host_netmask);
1863 free(bundle_data->ip_range_start);
1864 free(bundle_data->container_network);
1865 free(bundle_data->launcher_options);
1866 free(bundle_data->container_command);
1867 g_free(bundle_data->container_host_options);
1869 g_list_free_full(bundle_data->replicas,
1870 (GDestroyNotify) free_bundle_replica);
1871 g_list_free_full(bundle_data->mounts, (GDestroyNotify)mount_free);
1872 g_list_free_full(bundle_data->ports, (GDestroyNotify)port_free);
1875 if(bundle_data->child) {
1877 bundle_data->child->
priv->
xml = NULL;
1887 return container_role;
1900 if (pcmk__is_bundle(rsc)) {
1904 return bundle_data->nreplicas;
1915 for (GList *item = bundle_data->replicas; item != NULL; item = item->next) {
1921 if (replica->
child) {
1937 bool passes =
false;
1945 for (GList *gIter = bundle_data->replicas; gIter != NULL; gIter = gIter->next) {
1967 if ((remote != NULL)
1994 GList *containers = NULL;
1998 for (GList *iter =
data->replicas; iter != NULL; iter = iter->next) {
2001 containers = g_list_append(containers, replica->
container);
2009 unsigned int *count_clean)
2014 GList *containers = NULL;
2016 GHashTable *nodes = NULL;
2019 if (count_all != NULL) {
2022 if (count_clean != NULL) {
2033 for (iter =
data->replicas; iter != NULL; iter = iter->next) {
2037 containers = g_list_append(containers, replica->
container);
2040 if (containers == NULL) {
2050 if (pcmk__list_of_1(containers)) {
2051 container = containers->data;
2054 g_list_free(containers);
2059 nodes = g_hash_table_new(NULL, NULL);
2060 for (iter = containers; iter != NULL; iter = iter->next) {
2061 container = iter->data;
2063 node_iter != NULL; node_iter = node_iter->next) {
2065 node = node_iter->data;
2068 if (g_hash_table_insert(nodes, (gpointer) node->
details,
2078 g_list_free(containers);
2079 g_hash_table_destroy(nodes);
2098 return (
unsigned int) bundle_data->nreplicas_per_host;
xmlNode * crm_create_op_xml(xmlNode *parent, const char *prefix, const char *task, const char *interval_spec, const char *timeout)
Create a CIB XML element for an operation.
#define PCMK_ACTION_MONITOR
#define PCMK_RESOURCE_CLASS_OCF
const char * pe__add_bundle_remote_name(pcmk_resource_t *rsc, xmlNode *xml, const char *field)
void pe__foreach_const_bundle_replica(const pcmk_resource_t *bundle, bool(*fn)(const pcmk__bundle_replica_t *, void *), void *user_data)
enum rsc_role_e pe__bundle_resource_state(const pcmk_resource_t *rsc, bool current)
@ PE__CONTAINER_AGENT_PODMAN
@ PE__CONTAINER_AGENT_UNKNOWN
@ PE__CONTAINER_AGENT_DOCKER
bool pe__bundle_is_filtered(const pcmk_resource_t *rsc, const GList *only_rsc, bool check_parent)
struct pe__bundle_variant_data_s pe__bundle_variant_data_t
void pe__count_bundle(pcmk_resource_t *rsc)
#define pe__set_bundle_mount_flags(mount_xml, flags, flags_to_set)
pcmk_resource_t * pe__find_bundle_replica(const pcmk_resource_t *bundle, const pcmk_node_t *node)
const pcmk_resource_t * pe__get_rsc_in_container(const pcmk_resource_t *instance)
int pe_bundle_replicas(const pcmk_resource_t *rsc)
Get the number of configured replicas in a bundle.
#define PE__CONTAINER_AGENT_UNKNOWN_S
unsigned int pe__bundle_max_per_node(const pcmk_resource_t *rsc)
pcmk_node_t * pe__bundle_active_node(const pcmk_resource_t *rsc, unsigned int *count_all, unsigned int *count_clean)
pcmk_resource_t * pe__first_container(const pcmk_resource_t *bundle)
bool pe__bundle_needs_remote_name(pcmk_resource_t *rsc)
#define PE__CONTAINER_AGENT_PODMAN_S
@ pe__bundle_mount_subdir
GList * pe__bundle_containers(const pcmk_resource_t *bundle)
pcmk_resource_t * pe__bundled_resource(const pcmk_resource_t *rsc)
bool pe__unpack_bundle(pcmk_resource_t *rsc)
#define get_bundle_variant_data(data, rsc)
#define PE__CONTAINER_AGENT_DOCKER_S
bool pe__node_is_bundle_instance(const pcmk_resource_t *bundle, const pcmk_node_t *node)
bool pe__bundle_active(const pcmk_resource_t *rsc, bool all)
void pe__foreach_bundle_replica(pcmk_resource_t *bundle, bool(*fn)(pcmk__bundle_replica_t *, void *), void *user_data)
void pe__free_bundle(pcmk_resource_t *rsc)
int pe__bundle_max(const pcmk_resource_t *rsc)
#define pcmk__assert_alloc(nmemb, size)
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
int pe__unpack_resource(xmlNode *xml_obj, pcmk_resource_t **rsc, pcmk_resource_t *parent, pcmk_scheduler_t *scheduler)
GHashTable * pe_rsc_params(pcmk_resource_t *rsc, const pcmk_node_t *node, pcmk_scheduler_t *scheduler)
Get a table of resource parameters.
enum pcmk_ipc_server type
#define CRM_LOG_ASSERT(expr)
#define CRM_CHECK(expr, failure_action)
#define crm_trace(fmt, args...)
#define pcmk__config_err(fmt...)
#define DEFAULT_REMOTE_KEY_LOCATION
#define DEFAULT_REMOTE_PORT
pcmk_scheduler_t * scheduler
void pcmk__free_node_copy(void *data)
xmlNode * crm_create_nvpair_xml(xmlNode *parent, const char *id, const char *name, const char *value)
Create an XML name/value pair.
#define pcmk__insert_meta(obj, name, value)
#define PCMK_META_PROMOTABLE
#define PCMK_META_CLONE_NODE_MAX
#define PCMK_META_CONTAINER_ATTRIBUTE_TARGET
#define PCMK_REMOTE_RA_ADDR
#define PCMK_META_PROMOTED_MAX
#define PCMK_META_CLONE_MAX
#define PCMK_META_ORDERED
#define PCMK_VALUE_REMOTE
#define PCMK_META_GLOBALLY_UNIQUE
#define PCMK__ENV_REMOTE_PORT
Control output from tools.
@ pcmk_show_implicit_rscs
void pcmk__output_xml_pop_parent(pcmk__output_t *out)
#define PCMK__OUTPUT_LIST_HEADER(out_obj, cond, retcode, title...)
#define PCMK__OUTPUT_LIST_FOOTER(out_obj, retcode)
pcmk_node_t * pe__copy_node(const pcmk_node_t *this_node)
const char * pe__resource_description(const pcmk_resource_t *rsc, uint32_t show_opts)
const pcmk_resource_t * pe__const_top_resource(const pcmk_resource_t *rsc, bool include_bundle)
int pe__name_and_nvpairs_xml(pcmk__output_t *out, bool is_list, const char *tag_name,...) G_GNUC_NULL_TERMINATED
int pe__common_output_text(pcmk__output_t *out, const pcmk_resource_t *rsc, const char *name, const pcmk_node_t *node, unsigned int options)
int pe__bundle_xml(pcmk__output_t *out, va_list args)
int pe__bundle_html(pcmk__output_t *out, va_list args)
int pe__bundle_text(pcmk__output_t *out, va_list args)
bool pe__count_active_node(const pcmk_resource_t *rsc, pcmk_node_t *node, pcmk_node_t **active, unsigned int *count_all, unsigned int *count_clean)
void common_free(pcmk_resource_t *rsc)
pcmk_node_t * pe_create_node(const char *id, const char *uname, const char *type, int score, pcmk_scheduler_t *scheduler)
int pe__common_output_html(pcmk__output_t *out, const pcmk_resource_t *rsc, const char *name, const pcmk_node_t *node, unsigned int options)
bool pcmk__rsc_filtered_by_node(pcmk_resource_t *rsc, GList *only_node)
bool xml_contains_remote_node(xmlNode *xml)
xmlNode * pe_create_remote_xml(xmlNode *parent, const char *uname, const char *container_id, const char *migrateable, const char *is_managed, const char *start_timeout, const char *server, const char *port)
@ pcmk__rsc_exclusive_probes
@ pcmk__rsc_replica_container
@ pcmk__rsc_remote_nesting_allowed
#define pcmk__set_rsc_flags(resource, flags_to_set)
void pcmk__free_resource(gpointer user_data)
#define pcmk__clear_rsc_flags(resource, flags_to_clear)
#define pcmk__assert(expr)
@ pcmk_role_unknown
Resource role is unknown.
pcmk_node_t * pcmk_find_node(const pcmk_scheduler_t *scheduler, const char *node_name)
Find a node by name in scheduler data.
#define pcmk__rsc_trace(rsc, fmt, args...)
#define PCMK_SCORE_INFINITY
Integer score to use to represent "infinity".
#define PCMK__SERVER_EXECD
#define PCMK__SERVER_REMOTED
Cluster status and scheduling.
pcmk_resource_t * pe_find_resource(GList *rsc_list, const char *id)
const char * rsc_printable_id(const pcmk_resource_t *rsc)
char * crm_strdup_printf(char const *format,...) G_GNUC_PRINTF(1
int crm_str_to_boolean(const char *s, int *ret)
void pcmk__insert_dup(GHashTable *table, const char *name, const char *value)
int pcmk__scan_min_int(const char *text, int *result, int minimum)
gboolean pcmk__str_in_list(const gchar *s, const GList *lst, uint32_t flags)
GHashTable * pcmk__strkey_table(GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func)
void pcmk__g_strcat(GString *buffer,...) G_GNUC_NULL_TERMINATED
#define pcmk__str_copy(str)
void pcmk__add_separated_word(GString **list, size_t init_size, const char *word, const char *separator)
A single instance of a bundle.
pcmk_resource_t * child
Instance of bundled resource.
int offset
0-origin index of this instance in bundle
char * ipaddr
IP address associated with this instance.
pcmk_resource_t * remote
Pacemaker Remote connection into container.
pcmk_node_t * node
Copy of node created for this instance.
pcmk_resource_t * container
Container associated with this instance.
pcmk_resource_t * ip
IP address resource for ipaddr.
enum pcmk__probe_mode probe_mode
This structure contains everything that makes up a single output formatter.
pcmk_node_t * assigned_node
pcmk_scheduler_t * scheduler
pcmk_resource_t * launcher
const pcmk__rsc_methods_t * fns
GHashTable * allowed_nodes
pcmk__resource_private_t * priv
bool(* is_filtered)(const pcmk_resource_t *rsc, const GList *only_rsc, bool check_parent)
pcmk_node_t *(* active_node)(const pcmk_resource_t *rsc, unsigned int *count_all, unsigned int *count_clean)
bool(* active)(const pcmk_resource_t *rsc, bool all)
void(* count)(pcmk_resource_t *rsc)
pcmk__scheduler_private_t * priv
pcmk__node_private_t * priv
struct pcmk__node_details * details
struct pcmk__node_assignment * assign
Wrappers for and extensions to libxml2.
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
char * crm_element_value_copy(const xmlNode *data, const char *name)
Retrieve a copy of the value of an XML attribute.
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
xmlNode * pcmk__xe_first_child(const xmlNode *parent, const char *node_name, const char *attr_n, const char *attr_v)
xmlNode * pcmk__xe_next(const xmlNode *node, const char *element_name)
xmlNode * pcmk__xe_create(xmlNode *parent, const char *name)
void pcmk__xe_set_id(xmlNode *xml, const char *format,...) G_GNUC_PRINTF(2
xmlNode * pcmk__xml_copy(xmlNode *parent, xmlNode *src)
void pcmk__xml_sanitize_id(char *id)
void pcmk__xml_free(xmlNode *xml)
#define PCMK_XA_DESCRIPTION
#define PCMK_XA_IP_RANGE_START
#define PCMK_XE_PORT_MAPPING
#define PCMK_XA_HOST_INTERFACE
#define PCMK_XA_HOST_NETMASK
#define PCMK_XE_INSTANCE_ATTRIBUTES
#define PCMK_XE_STORAGE_MAPPING
#define PCMK_XA_MAINTENANCE
#define PCMK_XE_META_ATTRIBUTES
#define PCMK_XA_INTERNAL_PORT
#define PCMK_XA_PROMOTED_MAX
#define PCMK_XA_TARGET_DIR
#define PCMK_XA_RUN_COMMAND
#define PCMK_XA_CONTROL_PORT
#define PCMK_XE_PRIMITIVE
#define PCMK_XA_SOURCE_DIR
#define PCMK_XA_SOURCE_DIR_ROOT
#define PCMK_XE_OPERATIONS
#define PCMK_XA_REPLICAS_PER_HOST