| 844 | } |
| 845 | |
| 846 | void |
| 847 | clone_internal_constraints(resource_t * rsc, pe_working_set_t * data_set) |
| 848 | { |
| 849 | resource_t *last_rsc = NULL; |
| 850 | GListPtr gIter = rsc->children; |
| 851 | clone_variant_data_t *clone_data = NULL; |
| 852 | |
| 853 | get_clone_variant_data(clone_data, rsc); |
| 854 | |
| 855 | pe_rsc_trace(rsc, "Internal constraints for %s", rsc->id); |
| 856 | new_rsc_order(rsc, RSC_STOPPED, rsc, RSC_START, pe_order_optional, data_set); |
| 857 | new_rsc_order(rsc, RSC_START, rsc, RSC_STARTED, pe_order_runnable_left, data_set); |
| 858 | new_rsc_order(rsc, RSC_STOP, rsc, RSC_STOPPED, pe_order_runnable_left, data_set); |
| 859 | |
| 860 | if (rsc->variant == pe_master) { |
| 861 | new_rsc_order(rsc, RSC_DEMOTED, rsc, RSC_STOP, pe_order_optional, data_set); |
| 862 | new_rsc_order(rsc, RSC_STARTED, rsc, RSC_PROMOTE, pe_order_runnable_left, data_set); |
| 863 | } |
| 864 | |
| 865 | for (; gIter != NULL; gIter = gIter->next) { |
| 866 | resource_t *child_rsc = (resource_t *) gIter->data; |
| 867 | |
| 868 | child_rsc->cmds->internal_constraints(child_rsc, data_set); |
| 869 | |
| 870 | order_start_start(rsc, child_rsc, pe_order_runnable_left | pe_order_implies_first_printed); |
| 871 | new_rsc_order(child_rsc, RSC_START, rsc, RSC_STARTED, pe_order_implies_then_printed, |
| 872 | data_set); |
| 873 | if (clone_data->ordered && last_rsc) { |
| 874 | order_start_start(last_rsc, child_rsc, pe_order_optional); |
| 875 | } |
| 876 | |
| 877 | order_stop_stop(rsc, child_rsc, pe_order_implies_first_printed); |
| 878 | new_rsc_order(child_rsc, RSC_STOP, rsc, RSC_STOPPED, pe_order_implies_then_printed, |
| 879 | data_set); |
| 880 | if (clone_data->ordered && last_rsc) { |
| 881 | order_stop_stop(child_rsc, last_rsc, pe_order_optional); |
| 882 | } |
| 883 | |
| 884 | last_rsc = child_rsc; |
| 885 | } |
| 886 | } |
| 887 | |
| 888 | static void |
| 889 | assign_node(resource_t * rsc, node_t * node, gboolean force) |
no test coverage detected