This source file includes following definitions.
- pcmk__colocation_node_attr
- pcmk__colocation_has_influence
1
2
3
4
5
6
7
8
9
10 #ifndef PCMK__LIBPACEMAKER_PRIVATE__H
11 # define PCMK__LIBPACEMAKER_PRIVATE__H
12
13
14
15
16
17 #include <crm/lrmd_events.h>
18 #include <crm/common/scheduler.h>
19 #include <crm/pengine/internal.h>
20
21
22 enum pcmk__coloc_flags {
23 pcmk__coloc_none = 0U,
24
25
26 pcmk__coloc_influence = (1U << 0),
27
28
29 pcmk__coloc_explicit = (1U << 1),
30 };
31
32
33 enum pcmk__coloc_select {
34
35 pcmk__coloc_select_default = 0,
36
37
38 pcmk__coloc_select_this_with = (1 << 0),
39
40
41 pcmk__coloc_select_nonnegative = (1 << 1),
42
43
44 pcmk__coloc_select_active = (1 << 2),
45 };
46
47
48 enum pcmk__updated {
49 pcmk__updated_none = 0,
50 pcmk__updated_first = (1 << 0),
51 pcmk__updated_then = (1 << 1),
52 };
53
54 #define pcmk__set_updated_flags(au_flags, action, flags_to_set) do { \
55 au_flags = pcmk__set_flags_as(__func__, __LINE__, \
56 LOG_TRACE, "Action update", \
57 (action)->uuid, au_flags, \
58 (flags_to_set), #flags_to_set); \
59 } while (0)
60
61 #define pcmk__clear_updated_flags(au_flags, action, flags_to_clear) do { \
62 au_flags = pcmk__clear_flags_as(__func__, __LINE__, \
63 LOG_TRACE, "Action update", \
64 (action)->uuid, au_flags, \
65 (flags_to_clear), #flags_to_clear); \
66 } while (0)
67
68
69 struct resource_alloc_functions_s {
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 pcmk_node_t *(*assign)(pcmk_resource_t *rsc, const pcmk_node_t *prefer,
91 bool stop_if_fail);
92
93
94
95
96
97
98
99 void (*create_actions)(pcmk_resource_t *rsc);
100
101
102
103
104
105
106
107
108
109
110 bool (*create_probe)(pcmk_resource_t *rsc, pcmk_node_t *node);
111
112
113
114
115
116
117
118 void (*internal_constraints)(pcmk_resource_t *rsc);
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 int (*apply_coloc_score)(pcmk_resource_t *dependent,
136 const pcmk_resource_t *primary,
137 const pcmk__colocation_t *colocation,
138 bool for_dependent);
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157 GList *(*colocated_resources)(const pcmk_resource_t *rsc,
158 const pcmk_resource_t *orig_rsc,
159 GList *colocated_rscs);
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178 void (*with_this_colocations)(const pcmk_resource_t *rsc,
179 const pcmk_resource_t *orig_rsc,
180 GList **list);
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200 void (*this_with_colocations)(const pcmk_resource_t *rsc,
201 const pcmk_resource_t *orig_rsc,
202 GList **list);
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233 void (*add_colocated_node_scores)(pcmk_resource_t *source_rsc,
234 const pcmk_resource_t *target_rsc,
235 const char *log_id, GHashTable **nodes,
236 const pcmk__colocation_t *colocation,
237 float factor, uint32_t flags);
238
239
240
241
242
243
244
245
246 void (*apply_location)(pcmk_resource_t *rsc, pcmk__location_t *location);
247
248
249
250
251
252
253
254
255
256
257
258
259
260 uint32_t (*action_flags)(pcmk_action_t *action, const pcmk_node_t *node);
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285 uint32_t (*update_ordered_actions)(pcmk_action_t *first,
286 pcmk_action_t *then,
287 const pcmk_node_t *node, uint32_t flags,
288 uint32_t filter, uint32_t type,
289 pcmk_scheduler_t *scheduler);
290
291
292
293
294
295
296
297 void (*output_actions)(pcmk_resource_t *rsc);
298
299
300
301
302
303
304
305 void (*add_actions_to_graph)(pcmk_resource_t *rsc);
306
307
308
309
310
311
312
313
314
315
316
317 void (*add_graph_meta)(const pcmk_resource_t *rsc, xmlNode *xml);
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334 void (*add_utilization)(const pcmk_resource_t *rsc,
335 const pcmk_resource_t *orig_rsc, GList *all_rscs,
336 GHashTable *utilization);
337
338
339
340
341
342
343
344 void (*shutdown_lock)(pcmk_resource_t *rsc);
345 };
346
347
348
349 G_GNUC_INTERNAL
350 void pcmk__update_action_for_orderings(pcmk_action_t *action,
351 pcmk_scheduler_t *scheduler);
352
353 G_GNUC_INTERNAL
354 uint32_t pcmk__update_ordered_actions(pcmk_action_t *first, pcmk_action_t *then,
355 const pcmk_node_t *node, uint32_t flags,
356 uint32_t filter, uint32_t type,
357 pcmk_scheduler_t *scheduler);
358
359 G_GNUC_INTERNAL
360 void pcmk__log_action(const char *pre_text, const pcmk_action_t *action,
361 bool details);
362
363 G_GNUC_INTERNAL
364 pcmk_action_t *pcmk__new_cancel_action(pcmk_resource_t *rsc, const char *name,
365 guint interval_ms,
366 const pcmk_node_t *node);
367
368 G_GNUC_INTERNAL
369 pcmk_action_t *pcmk__new_shutdown_action(pcmk_node_t *node);
370
371 G_GNUC_INTERNAL
372 bool pcmk__action_locks_rsc_to_node(const pcmk_action_t *action);
373
374 G_GNUC_INTERNAL
375 void pcmk__deduplicate_action_inputs(pcmk_action_t *action);
376
377 G_GNUC_INTERNAL
378 void pcmk__output_actions(pcmk_scheduler_t *scheduler);
379
380 G_GNUC_INTERNAL
381 bool pcmk__check_action_config(pcmk_resource_t *rsc, pcmk_node_t *node,
382 const xmlNode *xml_op);
383
384 G_GNUC_INTERNAL
385 void pcmk__handle_rsc_config_changes(pcmk_scheduler_t *scheduler);
386
387
388
389
390 G_GNUC_INTERNAL
391 void pcmk__create_recurring_actions(pcmk_resource_t *rsc);
392
393 G_GNUC_INTERNAL
394 void pcmk__schedule_cancel(pcmk_resource_t *rsc, const char *call_id,
395 const char *task, guint interval_ms,
396 const pcmk_node_t *node, const char *reason);
397
398 G_GNUC_INTERNAL
399 void pcmk__reschedule_recurring(pcmk_resource_t *rsc, const char *task,
400 guint interval_ms, pcmk_node_t *node);
401
402 G_GNUC_INTERNAL
403 bool pcmk__action_is_recurring(const pcmk_action_t *action);
404
405
406
407
408 G_GNUC_INTERNAL
409 bool pcmk__graph_has_loop(const pcmk_action_t *init_action,
410 const pcmk_action_t *action,
411 pcmk__related_action_t *input);
412
413 G_GNUC_INTERNAL
414 void pcmk__add_rsc_actions_to_graph(pcmk_resource_t *rsc);
415
416 G_GNUC_INTERNAL
417 void pcmk__create_graph(pcmk_scheduler_t *scheduler);
418
419
420
421
422 G_GNUC_INTERNAL
423 void pcmk__order_vs_fence(pcmk_action_t *stonith_op,
424 pcmk_scheduler_t *scheduler);
425
426 G_GNUC_INTERNAL
427 void pcmk__order_vs_unfence(const pcmk_resource_t *rsc, pcmk_node_t *node,
428 pcmk_action_t *action,
429 enum pcmk__action_relation_flags order);
430
431 G_GNUC_INTERNAL
432 void pcmk__fence_guest(pcmk_node_t *node);
433
434 G_GNUC_INTERNAL
435 bool pcmk__node_unfenced(const pcmk_node_t *node);
436
437 G_GNUC_INTERNAL
438 void pcmk__order_restart_vs_unfence(gpointer data, gpointer user_data);
439
440
441
442
443 void pcmk__inject_scheduler_input(pcmk_scheduler_t *scheduler, cib_t *cib,
444 const pcmk_injections_t *injections);
445
446
447
448
449 G_GNUC_INTERNAL
450 pcmk_resource_t *pcmk__find_constraint_resource(GList *rsc_list,
451 const char *id);
452
453 G_GNUC_INTERNAL
454 xmlNode *pcmk__expand_tags_in_sets(xmlNode *xml_obj,
455 const pcmk_scheduler_t *scheduler);
456
457 G_GNUC_INTERNAL
458 bool pcmk__valid_resource_or_tag(const pcmk_scheduler_t *scheduler,
459 const char *id, pcmk_resource_t **rsc,
460 pcmk_tag_t **tag);
461
462 G_GNUC_INTERNAL
463 bool pcmk__tag_to_set(xmlNode *xml_obj, xmlNode **rsc_set, const char *attr,
464 bool convert_rsc, const pcmk_scheduler_t *scheduler);
465
466 G_GNUC_INTERNAL
467 void pcmk__create_internal_constraints(pcmk_scheduler_t *scheduler);
468
469
470
471
472 G_GNUC_INTERNAL
473 void pcmk__unpack_location(xmlNode *xml_obj, pcmk_scheduler_t *scheduler);
474
475 G_GNUC_INTERNAL
476 pcmk__location_t *pcmk__new_location(const char *id, pcmk_resource_t *rsc,
477 int node_score, const char *discover_mode,
478 pcmk_node_t *foo_node);
479
480 G_GNUC_INTERNAL
481 void pcmk__apply_locations(pcmk_scheduler_t *scheduler);
482
483 G_GNUC_INTERNAL
484 void pcmk__apply_location(pcmk_resource_t *rsc, pcmk__location_t *constraint);
485
486
487
488
489 enum pcmk__coloc_affects {
490 pcmk__coloc_affects_nothing = 0,
491 pcmk__coloc_affects_location,
492 pcmk__coloc_affects_role,
493 };
494
495
496
497
498
499
500
501
502
503
504
505 static inline const char *
506 pcmk__colocation_node_attr(const pcmk_node_t *node, const char *attr,
507 const pcmk_resource_t *rsc)
508 {
509 const char *target = NULL;
510
511
512
513
514
515
516 if (pcmk__is_bundle_node(node) && pcmk__is_bundled(rsc)
517 && (pe__const_top_resource(rsc, false) == pe__bundled_resource(rsc))) {
518 target = PCMK_VALUE_HOST;
519
520 } else if (rsc != NULL) {
521 target = g_hash_table_lookup(rsc->meta,
522 PCMK_META_CONTAINER_ATTRIBUTE_TARGET);
523 }
524
525 return pcmk__node_attr(node, attr, target, pcmk__rsc_node_assigned);
526 }
527
528 G_GNUC_INTERNAL
529 enum pcmk__coloc_affects pcmk__colocation_affects(const pcmk_resource_t
530 *dependent,
531 const pcmk_resource_t
532 *primary,
533 const pcmk__colocation_t
534 *colocation,
535 bool preview);
536
537 G_GNUC_INTERNAL
538 void pcmk__apply_coloc_to_scores(pcmk_resource_t *dependent,
539 const pcmk_resource_t *primary,
540 const pcmk__colocation_t *colocation);
541
542 G_GNUC_INTERNAL
543 int pcmk__apply_coloc_to_priority(pcmk_resource_t *dependent,
544 const pcmk_resource_t *primary,
545 const pcmk__colocation_t *colocation);
546
547 G_GNUC_INTERNAL
548 void pcmk__add_colocated_node_scores(pcmk_resource_t *source_rsc,
549 const pcmk_resource_t *target_rsc,
550 const char *log_id, GHashTable **nodes,
551 const pcmk__colocation_t *colocation,
552 float factor, uint32_t flags);
553
554 G_GNUC_INTERNAL
555 void pcmk__add_dependent_scores(gpointer data, gpointer user_data);
556
557 G_GNUC_INTERNAL
558 void pcmk__colocation_intersect_nodes(pcmk_resource_t *dependent,
559 const pcmk_resource_t *primary,
560 const pcmk__colocation_t *colocation,
561 const GList *primary_nodes,
562 bool merge_scores);
563
564 G_GNUC_INTERNAL
565 void pcmk__unpack_colocation(xmlNode *xml_obj, pcmk_scheduler_t *scheduler);
566
567 G_GNUC_INTERNAL
568 void pcmk__add_this_with(GList **list, const pcmk__colocation_t *colocation,
569 const pcmk_resource_t *rsc);
570
571 G_GNUC_INTERNAL
572 void pcmk__add_this_with_list(GList **list, GList *addition,
573 const pcmk_resource_t *rsc);
574
575 G_GNUC_INTERNAL
576 void pcmk__add_with_this(GList **list, const pcmk__colocation_t *colocation,
577 const pcmk_resource_t *rsc);
578
579 G_GNUC_INTERNAL
580 void pcmk__add_with_this_list(GList **list, GList *addition,
581 const pcmk_resource_t *rsc);
582
583 G_GNUC_INTERNAL
584 GList *pcmk__with_this_colocations(const pcmk_resource_t *rsc);
585
586 G_GNUC_INTERNAL
587 GList *pcmk__this_with_colocations(const pcmk_resource_t *rsc);
588
589 G_GNUC_INTERNAL
590 void pcmk__new_colocation(const char *id, const char *node_attr, int score,
591 pcmk_resource_t *dependent, pcmk_resource_t *primary,
592 const char *dependent_role, const char *primary_role,
593 uint32_t flags);
594
595 G_GNUC_INTERNAL
596 void pcmk__block_colocation_dependents(pcmk_action_t *action);
597
598
599
600
601
602
603
604
605
606
607
608
609
610 static inline bool
611 pcmk__colocation_has_influence(const pcmk__colocation_t *colocation,
612 const pcmk_resource_t *rsc)
613 {
614 if (rsc == NULL) {
615 rsc = colocation->primary;
616 }
617
618
619
620
621
622
623
624
625
626
627
628
629
630 if (pcmk_is_set(colocation->dependent->flags,
631 pcmk_rsc_remote_nesting_allowed)
632 && !pcmk_is_set(rsc->flags, pcmk_rsc_failed)
633 && pcmk__list_of_1(rsc->running_on)) {
634 return false;
635 }
636
637
638
639
640 return pcmk_is_set(colocation->flags, pcmk__coloc_influence)
641 || (rsc->running_on == NULL);
642 }
643
644
645
646
647 G_GNUC_INTERNAL
648 void pcmk__new_ordering(pcmk_resource_t *first_rsc, char *first_task,
649 pcmk_action_t *first_action, pcmk_resource_t *then_rsc,
650 char *then_task, pcmk_action_t *then_action,
651 uint32_t flags, pcmk_scheduler_t *sched);
652
653 G_GNUC_INTERNAL
654 void pcmk__unpack_ordering(xmlNode *xml_obj, pcmk_scheduler_t *scheduler);
655
656 G_GNUC_INTERNAL
657 void pcmk__disable_invalid_orderings(pcmk_scheduler_t *scheduler);
658
659 G_GNUC_INTERNAL
660 void pcmk__order_stops_before_shutdown(pcmk_node_t *node,
661 pcmk_action_t *shutdown_op);
662
663 G_GNUC_INTERNAL
664 void pcmk__apply_orderings(pcmk_scheduler_t *sched);
665
666 G_GNUC_INTERNAL
667 void pcmk__order_after_each(pcmk_action_t *after, GList *list);
668
669
670
671
672
673
674
675
676
677
678
679
680 #define pcmk__order_resource_actions(first_rsc, first_task, \
681 then_rsc, then_task, flags) \
682 pcmk__new_ordering((first_rsc), \
683 pcmk__op_key((first_rsc)->id, (first_task), 0), \
684 NULL, \
685 (then_rsc), \
686 pcmk__op_key((then_rsc)->id, (then_task), 0), \
687 NULL, (flags), (first_rsc)->cluster)
688
689 #define pcmk__order_starts(rsc1, rsc2, flags) \
690 pcmk__order_resource_actions((rsc1), PCMK_ACTION_START, \
691 (rsc2), PCMK_ACTION_START, (flags))
692
693 #define pcmk__order_stops(rsc1, rsc2, flags) \
694 pcmk__order_resource_actions((rsc1), PCMK_ACTION_STOP, \
695 (rsc2), PCMK_ACTION_STOP, (flags))
696
697
698
699
700 G_GNUC_INTERNAL
701 void pcmk__unpack_rsc_ticket(xmlNode *xml_obj, pcmk_scheduler_t *scheduler);
702
703
704
705
706 G_GNUC_INTERNAL
707 void pcmk__add_promotion_scores(pcmk_resource_t *rsc);
708
709 G_GNUC_INTERNAL
710 void pcmk__require_promotion_tickets(pcmk_resource_t *rsc);
711
712 G_GNUC_INTERNAL
713 void pcmk__set_instance_roles(pcmk_resource_t *rsc);
714
715 G_GNUC_INTERNAL
716 void pcmk__create_promotable_actions(pcmk_resource_t *clone);
717
718 G_GNUC_INTERNAL
719 void pcmk__promotable_restart_ordering(pcmk_resource_t *rsc);
720
721 G_GNUC_INTERNAL
722 void pcmk__order_promotable_instances(pcmk_resource_t *clone);
723
724 G_GNUC_INTERNAL
725 void pcmk__update_dependent_with_promotable(const pcmk_resource_t *primary,
726 pcmk_resource_t *dependent,
727 const pcmk__colocation_t
728 *colocation);
729
730 G_GNUC_INTERNAL
731 int pcmk__update_promotable_dependent_priority(const pcmk_resource_t *primary,
732 pcmk_resource_t *dependent,
733 const pcmk__colocation_t
734 *colocation);
735
736
737
738
739 G_GNUC_INTERNAL
740 bool pcmk__is_failed_remote_node(const pcmk_node_t *node);
741
742 G_GNUC_INTERNAL
743 void pcmk__order_remote_connection_actions(pcmk_scheduler_t *scheduler);
744
745 G_GNUC_INTERNAL
746 bool pcmk__rsc_corresponds_to_guest(const pcmk_resource_t *rsc,
747 const pcmk_node_t *node);
748
749 G_GNUC_INTERNAL
750 pcmk_node_t *pcmk__connection_host_for_action(const pcmk_action_t *action);
751
752 G_GNUC_INTERNAL
753 void pcmk__substitute_remote_addr(pcmk_resource_t *rsc, GHashTable *params);
754
755 G_GNUC_INTERNAL
756 void pcmk__add_guest_meta_to_xml(xmlNode *args_xml,
757 const pcmk_action_t *action);
758
759
760
761
762 G_GNUC_INTERNAL
763 pcmk_node_t *pcmk__primitive_assign(pcmk_resource_t *rsc,
764 const pcmk_node_t *prefer,
765 bool stop_if_fail);
766
767 G_GNUC_INTERNAL
768 void pcmk__primitive_create_actions(pcmk_resource_t *rsc);
769
770 G_GNUC_INTERNAL
771 void pcmk__primitive_internal_constraints(pcmk_resource_t *rsc);
772
773 G_GNUC_INTERNAL
774 uint32_t pcmk__primitive_action_flags(pcmk_action_t *action,
775 const pcmk_node_t *node);
776
777 G_GNUC_INTERNAL
778 int pcmk__primitive_apply_coloc_score(pcmk_resource_t *dependent,
779 const pcmk_resource_t *primary,
780 const pcmk__colocation_t *colocation,
781 bool for_dependent);
782
783 G_GNUC_INTERNAL
784 void pcmk__with_primitive_colocations(const pcmk_resource_t *rsc,
785 const pcmk_resource_t *orig_rsc,
786 GList **list);
787
788 G_GNUC_INTERNAL
789 void pcmk__primitive_with_colocations(const pcmk_resource_t *rsc,
790 const pcmk_resource_t *orig_rsc,
791 GList **list);
792
793 G_GNUC_INTERNAL
794 void pcmk__schedule_cleanup(pcmk_resource_t *rsc, const pcmk_node_t *node,
795 bool optional);
796
797 G_GNUC_INTERNAL
798 void pcmk__primitive_add_graph_meta(const pcmk_resource_t *rsc, xmlNode *xml);
799
800 G_GNUC_INTERNAL
801 void pcmk__primitive_add_utilization(const pcmk_resource_t *rsc,
802 const pcmk_resource_t *orig_rsc,
803 GList *all_rscs, GHashTable *utilization);
804
805 G_GNUC_INTERNAL
806 void pcmk__primitive_shutdown_lock(pcmk_resource_t *rsc);
807
808
809
810
811 G_GNUC_INTERNAL
812 pcmk_node_t *pcmk__group_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer,
813 bool stop_if_fail);
814
815 G_GNUC_INTERNAL
816 void pcmk__group_create_actions(pcmk_resource_t *rsc);
817
818 G_GNUC_INTERNAL
819 void pcmk__group_internal_constraints(pcmk_resource_t *rsc);
820
821 G_GNUC_INTERNAL
822 int pcmk__group_apply_coloc_score(pcmk_resource_t *dependent,
823 const pcmk_resource_t *primary,
824 const pcmk__colocation_t *colocation,
825 bool for_dependent);
826
827 G_GNUC_INTERNAL
828 void pcmk__with_group_colocations(const pcmk_resource_t *rsc,
829 const pcmk_resource_t *orig_rsc,
830 GList **list);
831
832 G_GNUC_INTERNAL
833 void pcmk__group_with_colocations(const pcmk_resource_t *rsc,
834 const pcmk_resource_t *orig_rsc,
835 GList **list);
836
837 G_GNUC_INTERNAL
838 void pcmk__group_add_colocated_node_scores(pcmk_resource_t *source_rsc,
839 const pcmk_resource_t *target_rsc,
840 const char *log_id,
841 GHashTable **nodes,
842 const pcmk__colocation_t *colocation,
843 float factor, uint32_t flags);
844
845 G_GNUC_INTERNAL
846 void pcmk__group_apply_location(pcmk_resource_t *rsc,
847 pcmk__location_t *location);
848
849 G_GNUC_INTERNAL
850 uint32_t pcmk__group_action_flags(pcmk_action_t *action,
851 const pcmk_node_t *node);
852
853 G_GNUC_INTERNAL
854 uint32_t pcmk__group_update_ordered_actions(pcmk_action_t *first,
855 pcmk_action_t *then,
856 const pcmk_node_t *node,
857 uint32_t flags, uint32_t filter,
858 uint32_t type,
859 pcmk_scheduler_t *scheduler);
860
861 G_GNUC_INTERNAL
862 GList *pcmk__group_colocated_resources(const pcmk_resource_t *rsc,
863 const pcmk_resource_t *orig_rsc,
864 GList *colocated_rscs);
865
866 G_GNUC_INTERNAL
867 void pcmk__group_add_utilization(const pcmk_resource_t *rsc,
868 const pcmk_resource_t *orig_rsc,
869 GList *all_rscs, GHashTable *utilization);
870
871 G_GNUC_INTERNAL
872 void pcmk__group_shutdown_lock(pcmk_resource_t *rsc);
873
874
875
876
877 G_GNUC_INTERNAL
878 pcmk_node_t *pcmk__clone_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer,
879 bool stop_if_fail);
880
881 G_GNUC_INTERNAL
882 void pcmk__clone_create_actions(pcmk_resource_t *rsc);
883
884 G_GNUC_INTERNAL
885 bool pcmk__clone_create_probe(pcmk_resource_t *rsc, pcmk_node_t *node);
886
887 G_GNUC_INTERNAL
888 void pcmk__clone_internal_constraints(pcmk_resource_t *rsc);
889
890 G_GNUC_INTERNAL
891 int pcmk__clone_apply_coloc_score(pcmk_resource_t *dependent,
892 const pcmk_resource_t *primary,
893 const pcmk__colocation_t *colocation,
894 bool for_dependent);
895
896 G_GNUC_INTERNAL
897 void pcmk__with_clone_colocations(const pcmk_resource_t *rsc,
898 const pcmk_resource_t *orig_rsc,
899 GList **list);
900
901 G_GNUC_INTERNAL
902 void pcmk__clone_with_colocations(const pcmk_resource_t *rsc,
903 const pcmk_resource_t *orig_rsc,
904 GList **list);
905
906 G_GNUC_INTERNAL
907 void pcmk__clone_apply_location(pcmk_resource_t *rsc,
908 pcmk__location_t *constraint);
909
910 G_GNUC_INTERNAL
911 uint32_t pcmk__clone_action_flags(pcmk_action_t *action,
912 const pcmk_node_t *node);
913
914 G_GNUC_INTERNAL
915 void pcmk__clone_add_actions_to_graph(pcmk_resource_t *rsc);
916
917 G_GNUC_INTERNAL
918 void pcmk__clone_add_graph_meta(const pcmk_resource_t *rsc, xmlNode *xml);
919
920 G_GNUC_INTERNAL
921 void pcmk__clone_add_utilization(const pcmk_resource_t *rsc,
922 const pcmk_resource_t *orig_rsc,
923 GList *all_rscs, GHashTable *utilization);
924
925 G_GNUC_INTERNAL
926 void pcmk__clone_shutdown_lock(pcmk_resource_t *rsc);
927
928
929
930 G_GNUC_INTERNAL
931 pcmk_node_t *pcmk__bundle_assign(pcmk_resource_t *rsc,
932 const pcmk_node_t *prefer, bool stop_if_fail);
933
934 G_GNUC_INTERNAL
935 void pcmk__bundle_create_actions(pcmk_resource_t *rsc);
936
937 G_GNUC_INTERNAL
938 bool pcmk__bundle_create_probe(pcmk_resource_t *rsc, pcmk_node_t *node);
939
940 G_GNUC_INTERNAL
941 void pcmk__bundle_internal_constraints(pcmk_resource_t *rsc);
942
943 G_GNUC_INTERNAL
944 int pcmk__bundle_apply_coloc_score(pcmk_resource_t *dependent,
945 const pcmk_resource_t *primary,
946 const pcmk__colocation_t *colocation,
947 bool for_dependent);
948
949 G_GNUC_INTERNAL
950 void pcmk__with_bundle_colocations(const pcmk_resource_t *rsc,
951 const pcmk_resource_t *orig_rsc,
952 GList **list);
953
954 G_GNUC_INTERNAL
955 void pcmk__bundle_with_colocations(const pcmk_resource_t *rsc,
956 const pcmk_resource_t *orig_rsc,
957 GList **list);
958
959 G_GNUC_INTERNAL
960 void pcmk__bundle_apply_location(pcmk_resource_t *rsc,
961 pcmk__location_t *constraint);
962
963 G_GNUC_INTERNAL
964 uint32_t pcmk__bundle_action_flags(pcmk_action_t *action,
965 const pcmk_node_t *node);
966
967 G_GNUC_INTERNAL
968 void pcmk__output_bundle_actions(pcmk_resource_t *rsc);
969
970 G_GNUC_INTERNAL
971 void pcmk__bundle_add_actions_to_graph(pcmk_resource_t *rsc);
972
973 G_GNUC_INTERNAL
974 void pcmk__bundle_add_utilization(const pcmk_resource_t *rsc,
975 const pcmk_resource_t *orig_rsc,
976 GList *all_rscs, GHashTable *utilization);
977
978 G_GNUC_INTERNAL
979 void pcmk__bundle_shutdown_lock(pcmk_resource_t *rsc);
980
981
982
983
984 G_GNUC_INTERNAL
985 void pcmk__assign_instances(pcmk_resource_t *collective, GList *instances,
986 int max_total, int max_per_node);
987
988 G_GNUC_INTERNAL
989 void pcmk__create_instance_actions(pcmk_resource_t *rsc, GList *instances);
990
991 G_GNUC_INTERNAL
992 bool pcmk__instance_matches(const pcmk_resource_t *instance,
993 const pcmk_node_t *node, enum rsc_role_e role,
994 bool current);
995
996 G_GNUC_INTERNAL
997 pcmk_resource_t *pcmk__find_compatible_instance(const pcmk_resource_t *match_rsc,
998 const pcmk_resource_t *rsc,
999 enum rsc_role_e role,
1000 bool current);
1001
1002 G_GNUC_INTERNAL
1003 uint32_t pcmk__instance_update_ordered_actions(pcmk_action_t *first,
1004 pcmk_action_t *then,
1005 const pcmk_node_t *node,
1006 uint32_t flags, uint32_t filter,
1007 uint32_t type,
1008 pcmk_scheduler_t *scheduler);
1009
1010 G_GNUC_INTERNAL
1011 uint32_t pcmk__collective_action_flags(pcmk_action_t *action,
1012 const GList *instances,
1013 const pcmk_node_t *node);
1014
1015
1016
1017
1018 G_GNUC_INTERNAL
1019 xmlNode *pcmk__inject_node(cib_t *cib_conn, const char *node, const char *uuid);
1020
1021 G_GNUC_INTERNAL
1022 xmlNode *pcmk__inject_node_state_change(cib_t *cib_conn, const char *node,
1023 bool up);
1024
1025 G_GNUC_INTERNAL
1026 xmlNode *pcmk__inject_resource_history(pcmk__output_t *out, xmlNode *cib_node,
1027 const char *resource,
1028 const char *lrm_name,
1029 const char *rclass,
1030 const char *rtype,
1031 const char *rprovider);
1032
1033 G_GNUC_INTERNAL
1034 void pcmk__inject_failcount(pcmk__output_t *out, cib_t *cib_conn,
1035 xmlNode *cib_node, const char *resource,
1036 const char *task, guint interval_ms, int rc);
1037
1038 G_GNUC_INTERNAL
1039 xmlNode *pcmk__inject_action_result(xmlNode *cib_resource,
1040 lrmd_event_data_t *op, int target_rc);
1041
1042
1043
1044
1045 G_GNUC_INTERNAL
1046 bool pcmk__node_available(const pcmk_node_t *node, bool consider_score,
1047 bool consider_guest);
1048
1049 G_GNUC_INTERNAL
1050 bool pcmk__any_node_available(GHashTable *nodes);
1051
1052 G_GNUC_INTERNAL
1053 GHashTable *pcmk__copy_node_table(GHashTable *nodes);
1054
1055 G_GNUC_INTERNAL
1056 void pcmk__copy_node_tables(const pcmk_resource_t *rsc, GHashTable **copy);
1057
1058 G_GNUC_INTERNAL
1059 void pcmk__restore_node_tables(pcmk_resource_t *rsc, GHashTable *backup);
1060
1061 G_GNUC_INTERNAL
1062 GList *pcmk__sort_nodes(GList *nodes, pcmk_node_t *active_node);
1063
1064 G_GNUC_INTERNAL
1065 void pcmk__apply_node_health(pcmk_scheduler_t *scheduler);
1066
1067 G_GNUC_INTERNAL
1068 pcmk_node_t *pcmk__top_allowed_node(const pcmk_resource_t *rsc,
1069 const pcmk_node_t *node);
1070
1071
1072
1073
1074 G_GNUC_INTERNAL
1075 void pcmk__set_assignment_methods(pcmk_scheduler_t *scheduler);
1076
1077 G_GNUC_INTERNAL
1078 bool pcmk__rsc_agent_changed(pcmk_resource_t *rsc, pcmk_node_t *node,
1079 const xmlNode *rsc_entry, bool active_on_node);
1080
1081 G_GNUC_INTERNAL
1082 GList *pcmk__rscs_matching_id(const char *id,
1083 const pcmk_scheduler_t *scheduler);
1084
1085 G_GNUC_INTERNAL
1086 GList *pcmk__colocated_resources(const pcmk_resource_t *rsc,
1087 const pcmk_resource_t *orig_rsc,
1088 GList *colocated_rscs);
1089
1090 G_GNUC_INTERNAL
1091 void pcmk__noop_add_graph_meta(const pcmk_resource_t *rsc, xmlNode *xml);
1092
1093 G_GNUC_INTERNAL
1094 void pcmk__output_resource_actions(pcmk_resource_t *rsc);
1095
1096 G_GNUC_INTERNAL
1097 bool pcmk__assign_resource(pcmk_resource_t *rsc, pcmk_node_t *node, bool force,
1098 bool stop_if_fail);
1099
1100 G_GNUC_INTERNAL
1101 void pcmk__unassign_resource(pcmk_resource_t *rsc);
1102
1103 G_GNUC_INTERNAL
1104 bool pcmk__threshold_reached(pcmk_resource_t *rsc, const pcmk_node_t *node,
1105 pcmk_resource_t **failed);
1106
1107 G_GNUC_INTERNAL
1108 void pcmk__sort_resources(pcmk_scheduler_t *scheduler);
1109
1110 G_GNUC_INTERNAL
1111 gint pcmk__cmp_instance(gconstpointer a, gconstpointer b);
1112
1113 G_GNUC_INTERNAL
1114 gint pcmk__cmp_instance_number(gconstpointer a, gconstpointer b);
1115
1116
1117
1118
1119 G_GNUC_INTERNAL
1120 bool pcmk__probe_rsc_on_node(pcmk_resource_t *rsc, pcmk_node_t *node);
1121
1122 G_GNUC_INTERNAL
1123 void pcmk__order_probes(pcmk_scheduler_t *scheduler);
1124
1125 G_GNUC_INTERNAL
1126 bool pcmk__probe_resource_list(GList *rscs, pcmk_node_t *node);
1127
1128 G_GNUC_INTERNAL
1129 void pcmk__schedule_probes(pcmk_scheduler_t *scheduler);
1130
1131
1132
1133
1134 void pcmk__create_migration_actions(pcmk_resource_t *rsc,
1135 const pcmk_node_t *current);
1136
1137 void pcmk__abort_dangling_migration(void *data, void *user_data);
1138
1139 bool pcmk__rsc_can_migrate(const pcmk_resource_t *rsc,
1140 const pcmk_node_t *current);
1141
1142 void pcmk__order_migration_equivalents(pcmk__action_relation_t *order);
1143
1144
1145
1146
1147 G_GNUC_INTERNAL
1148 int pcmk__compare_node_capacities(const pcmk_node_t *node1,
1149 const pcmk_node_t *node2);
1150
1151 G_GNUC_INTERNAL
1152 void pcmk__consume_node_capacity(GHashTable *current_utilization,
1153 const pcmk_resource_t *rsc);
1154
1155 G_GNUC_INTERNAL
1156 void pcmk__release_node_capacity(GHashTable *current_utilization,
1157 const pcmk_resource_t *rsc);
1158
1159 G_GNUC_INTERNAL
1160 const pcmk_node_t *pcmk__ban_insufficient_capacity(pcmk_resource_t *rsc);
1161
1162 G_GNUC_INTERNAL
1163 void pcmk__create_utilization_constraints(pcmk_resource_t *rsc,
1164 const GList *allowed_nodes);
1165
1166 G_GNUC_INTERNAL
1167 void pcmk__show_node_capacities(const char *desc, pcmk_scheduler_t *scheduler);
1168
1169
1170
1171
1172 G_GNUC_INTERNAL
1173 int pcmk__init_scheduler(pcmk__output_t *out, xmlNodePtr input, const crm_time_t *date,
1174 pcmk_scheduler_t **scheduler);
1175
1176
1177
1178
1179 G_GNUC_INTERNAL
1180 int pcmk__setup_output_cib_sched(pcmk__output_t **out, cib_t **cib,
1181 pcmk_scheduler_t **scheduler, xmlNode **xml);
1182
1183 #endif