 |
pacemaker
2.0.3-4b1f869f0f
Scalable High-Availability cluster resource manager
|
Go to the documentation of this file.
18 #define VARIANT_GROUP 1
24 xmlNode *xml_obj = rsc->
xml;
25 xmlNode *xml_native_rsc = NULL;
26 group_variant_data_t *group_data = NULL;
28 const char *group_colocated = g_hash_table_lookup(rsc->
meta,
"collocated");
29 const char *clone_id = NULL;
33 group_data = calloc(1,
sizeof(group_variant_data_t));
34 group_data->num_children = 0;
35 group_data->first_child = NULL;
36 group_data->last_child = NULL;
39 group_data->ordered = TRUE;
40 group_data->colocated = TRUE;
42 if (group_ordered != NULL) {
45 if (group_colocated != NULL) {
51 for (xml_native_rsc = __xml_first_child_element(xml_obj); xml_native_rsc != NULL;
52 xml_native_rsc = __xml_next_element(xml_native_rsc)) {
57 if (
common_unpack(xml_native_rsc, &new_rsc, rsc, data_set) == FALSE) {
59 if (new_rsc != NULL && new_rsc->
fns != NULL) {
65 group_data->num_children++;
68 if (group_data->first_child == NULL) {
69 group_data->first_child = new_rsc;
71 group_data->last_child = new_rsc;
76 if (group_data->num_children == 0) {
87 pe_rsc_trace(rsc,
"Added %d children to resource %s...", group_data->num_children, rsc->
id);
95 gboolean c_all = TRUE;
96 gboolean c_any = FALSE;
99 for (; gIter != NULL; gIter = gIter->next) {
102 if (child_rsc->
fns->
active(child_rsc, all)) {
109 if (c_any == FALSE) {
111 }
else if (all && c_all == FALSE) {
118 group_print_xml(
resource_t * rsc,
const char *pre_text,
long options,
void *print_data)
121 char *child_text = crm_concat(pre_text,
" ",
' ');
127 for (; gIter != NULL; gIter = gIter->next) {
130 child_rsc->
fns->
print(child_rsc, child_text, options, print_data);
140 char *child_text = NULL;
143 if (pre_text == NULL) {
148 group_print_xml(rsc, pre_text, options, print_data);
152 child_text = crm_concat(pre_text,
" ",
' ');
154 status_print(
"%sResource Group: %s", pre_text ? pre_text :
"", rsc->
id);
167 for (; gIter != NULL; gIter = gIter->next) {
173 child_rsc->
fns->
print(child_rsc, child_text, options, print_data);
189 unsigned int options = va_arg(args,
unsigned int);
193 char *count = crm_itoa(g_list_length(gIter));
197 ,
"number_resources", count);
201 for (; gIter != NULL; gIter = gIter->next) {
204 out->
message(out, crm_map_element_name(child_rsc->
xml), options, child_rsc);
214 unsigned int options = va_arg(args,
unsigned int);
217 out->
begin_list(out, NULL, NULL,
"Resource Group: %s", rsc->
id);
225 out->
message(out, crm_map_element_name(child_rsc->
xml), options, child_rsc);
237 unsigned int options = va_arg(args,
unsigned int);
240 out->
begin_list(out, NULL, NULL,
"Resource Group: %s", rsc->
id);
249 out->
message(out, crm_map_element_name(child_rsc->
xml), options, child_rsc);
269 child_rsc->
fns->
free(child_rsc);
284 for (; gIter != NULL; gIter = gIter->next) {
288 if (role > group_role) {
gboolean group_unpack(resource_t *rsc, pe_working_set_t *data_set)
gboolean crm_str_eq(const char *a, const char *b, gboolean use_case)
void pe__rscs_brief_output(pcmk__output_t *out, GListPtr rsc_list, long options, gboolean print_all)
void group_print(resource_t *rsc, const char *pre_text, long options, void *print_data)
void common_free(resource_t *rsc)
int crm_str_to_boolean(const char *s, int *ret)
#define CRM_CHECK(expr, failure_action)
void print_rscs_brief(GListPtr rsc_list, const char *pre_text, long options, void *print_data, gboolean print_all)
int pe__group_text(pcmk__output_t *out, va_list args)
gboolean group_active(resource_t *rsc, gboolean all)
void group_free(resource_t *rsc)
gboolean common_unpack(xmlNode *xml_obj, resource_t **rsc, resource_t *parent, pe_working_set_t *data_set)
int(* message)(pcmk__output_t *out, const char *message_id,...)
void(* free)(pe_resource_t *)
#define XML_CIB_TAG_RESOURCE
void(* print)(pe_resource_t *, const char *, long, void *)
void(* end_list)(pcmk__output_t *out)
const char * role2text(enum rsc_role_e role)
enum rsc_role_e(* state)(const pe_resource_t *, gboolean)
int pe__group_html(pcmk__output_t *out, va_list args)
enum rsc_role_e group_resource_state(const resource_t *rsc, gboolean current)
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
#define XML_RSC_ATTR_ORDERED
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
void(* begin_list)(pcmk__output_t *out, const char *singular_noun, const char *plural_noun, const char *format,...) G_GNUC_PRINTF(4
gboolean(* active)(pe_resource_t *, gboolean)
This structure contains everything that makes up a single output formatter.
#define crm_config_warn(fmt...)
#define pe_rsc_trace(rsc, fmt, args...)
#define status_print(fmt, args...)
int pe__group_xml(pcmk__output_t *out, va_list args)
void pcmk__output_xml_pop_parent(pcmk__output_t *out)
#define XML_RSC_ATTR_INCARNATION
Cluster status and scheduling.
int pe__name_and_nvpairs_xml(pcmk__output_t *out, bool is_list, const char *tag_name, size_t pairs_count,...)
resource_object_functions_t * fns
#define crm_config_err(fmt...)