23 typedef struct group_variant_data_s {
42 CRM_CHECK(pcmk__is_group(group),
return NULL);
44 return group_data->last_child;
63 CRM_CHECK(pcmk__is_group(group),
return false);
65 return pcmk_all_flags_set(group_data->flags,
flags);
78 set_group_flag(
pcmk_resource_t *group,
const char *option, uint32_t flag,
81 const char *value_s = NULL;
84 value_s = g_hash_table_lookup(group->
priv->
meta, option);
91 group_data->flags |= flag;
95 "Support for the '%s' group meta-attribute is " 96 "deprecated and will be removed in a future release " 97 "(use a resource set instead)", option);
107 gIter != NULL; gIter = gIter->next) {
121 int n_inactive,
bool show_inactive,
const char *desc)
123 GString *attrs = NULL;
125 if (n_inactive > 0 && !show_inactive) {
126 attrs = g_string_sized_new(64);
127 g_string_append_printf(attrs,
"%d member%s inactive", n_inactive,
145 (
const char *) attrs->str, desc ?
" (" :
"",
146 desc ? desc :
"", desc ?
")" :
"");
147 g_string_free(attrs, TRUE);
151 desc ?
" (" :
"", desc ? desc :
"",
158 gboolean parent_passes, GList *only_rsc, uint32_t show_opts)
160 bool star_list = pcmk__list_of_1(only_rsc) &&
169 if (!star_list && !child_filtered) {
172 }
else if (!child_filtered && (child_active || show_inactive)) {
175 }
else if (parent_passes && (child_active || show_inactive)) {
186 xmlNode *xml_obj = rsc->
priv->
xml;
187 xmlNode *xml_native_rsc = NULL;
189 const char *clone_id = NULL;
194 group_data->last_child = NULL;
207 xml_native_rsc != NULL;
219 group_data->last_child = new_rsc;
237 gboolean c_all = TRUE;
238 gboolean c_any = FALSE;
241 gIter != NULL; gIter = gIter->next) {
252 if (c_any == FALSE) {
254 }
else if (all && c_all == FALSE) {
260 PCMK__OUTPUT_ARGS(
"group",
"uint32_t",
"pcmk_resource_t *",
"GList *",
265 uint32_t show_opts = va_arg(args, uint32_t);
267 GList *only_node = va_arg(args, GList *);
268 GList *only_rsc = va_arg(args, GList *);
270 const char *desc = NULL;
284 gIter != NULL; gIter = gIter->next) {
288 if (skip_child_rsc(rsc, child_rsc, parent_passes, only_rsc, show_opts)) {
293 char *count = pcmk__itoa(g_list_length(gIter));
294 const char *maintenance = pcmk__flag_text(rsc->
flags,
296 const char *managed = pcmk__flag_text(rsc->
flags,
312 out->message(out, (
const char *) child_rsc->
priv->
xml->name,
313 show_opts, child_rsc, only_node, only_rsc);
323 PCMK__OUTPUT_ARGS(
"group",
"uint32_t",
"pcmk_resource_t *",
"GList *",
328 uint32_t show_opts = va_arg(args, uint32_t);
330 GList *only_node = va_arg(args, GList *);
331 GList *only_rsc = va_arg(args, GList *);
333 const char *desc = NULL;
340 gboolean partially_active = rsc->
priv->
fns->
active(rsc, FALSE);
352 group_header(out, &rc, rsc, !active && partially_active ? inactive_resources(rsc) : 0,
362 gIter != NULL; gIter = gIter->next) {
365 if (skip_child_rsc(rsc, child_rsc, parent_passes, only_rsc, show_opts)) {
369 group_header(out, &rc, rsc, !active && partially_active ? inactive_resources(rsc) : 0,
371 out->message(out, (
const char *) child_rsc->
priv->
xml->name,
372 show_opts, child_rsc, only_node, only_rsc);
389 gIter != NULL; gIter = gIter->next) {
410 gIter != NULL; gIter = gIter->next) {
416 if (role > group_role) {
427 gboolean check_parent)
429 gboolean passes = FALSE;
442 iter != NULL; iter = iter->next) {
const pcmk_resource_t * pe__const_top_resource(const pcmk_resource_t *rsc, bool include_bundle)
#define CRM_CHECK(expr, failure_action)
xmlNode * pcmk__xe_first_child(const xmlNode *parent, const char *node_name, const char *attr_n, const char *attr_v)
const char * pcmk_role_text(enum rsc_role_e role)
Get readable description of a resource role.
Control output from tools.
gboolean(* active)(pcmk_resource_t *rsc, gboolean all)
#define PCMK_XE_PRIMITIVE
bool pe__group_flag_is_set(const pcmk_resource_t *group, uint32_t flags)
#define pcmk__rsc_trace(rsc, fmt, args...)
gboolean(* is_filtered)(const pcmk_resource_t *rsc, GList *only_rsc, gboolean check_parent)
gboolean group_unpack(pcmk_resource_t *rsc, pcmk_scheduler_t *scheduler)
int pe__group_default(pcmk__output_t *out, va_list args)
void group_free(pcmk_resource_t *rsc)
#define pcmk__config_err(fmt...)
const char * pe__resource_description(const pcmk_resource_t *rsc, uint32_t show_opts)
void pcmk__add_separated_word(GString **list, size_t init_size, const char *word, const char *separator)
const char * rsc_printable_id(const pcmk_resource_t *rsc)
const pcmk__rsc_methods_t * fns
int pe__unpack_resource(xmlNode *xml_obj, pcmk_resource_t **rsc, pcmk_resource_t *parent, pcmk_scheduler_t *scheduler)
unsigned int pe__group_max_per_node(const pcmk_resource_t *rsc)
gboolean group_active(pcmk_resource_t *rsc, gboolean all)
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
GList * pe__filter_rsc_list(GList *rscs, GList *filter)
void common_free(pcmk_resource_t *rsc)
int pe__rscs_brief_output(pcmk__output_t *out, GList *rsc_list, unsigned int options)
int pe__name_and_nvpairs_xml(pcmk__output_t *out, bool is_list, const char *tag_name,...) G_GNUC_NULL_TERMINATED
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
#define PCMK_XA_DESCRIPTION
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
pcmk__resource_private_t * priv
#define PCMK_XA_NUMBER_RESOURCES
Wrappers for and extensions to libxml2.
enum rsc_role_e(* state)(const pcmk_resource_t *rsc, gboolean current)
#define pcmk__warn_once(wo_flag, fmt...)
void pcmk__output_xml_pop_parent(pcmk__output_t *out)
#define PCMK_XA_MAINTENANCE
xmlNode * pcmk__xe_next(const xmlNode *node, const char *element_name)
#define pcmk__assert(expr)
#define PCMK__OUTPUT_LIST_FOOTER(out_obj, retcode)
#define PCMK__OUTPUT_LIST_HEADER(out_obj, cond, retcode, title...)
pcmk_resource_t * pe__last_group_member(const pcmk_resource_t *group)
Cluster status and scheduling.
pcmk_scheduler_t * scheduler
int pe__group_xml(pcmk__output_t *out, va_list args)
This structure contains everything that makes up a single output formatter.
bool pe__resource_is_disabled(const pcmk_resource_t *rsc)
#define pcmk__plural_s(i)
struct group_variant_data_s group_variant_data_t
int crm_str_to_boolean(const char *s, int *ret)
Resource role is unknown.
#define PCMK_META_ORDERED
void(* free)(pcmk_resource_t *rsc)
#define pcmk__assert_alloc(nmemb, size)
enum rsc_role_e group_resource_state(const pcmk_resource_t *rsc, gboolean current)
gboolean pe__group_is_filtered(const pcmk_resource_t *rsc, GList *only_rsc, gboolean check_parent)
gboolean pcmk__str_in_list(const gchar *s, const GList *lst, uint32_t flags)