root/lib/pacemaker/pcmk_sched_messages.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. log_resource_details
  2. pcmk__schedule_actions

   1 /*
   2  * Copyright 2004-2020 the Pacemaker project contributors
   3  *
   4  * The version control history for this file may have further details.
   5  *
   6  * This source code is licensed under the GNU General Public License version 2
   7  * or later (GPLv2+) WITHOUT ANY WARRANTY.
   8  */
   9 
  10 #include <crm_internal.h>
  11 
  12 #include <sys/param.h>
  13 
  14 #include <crm/crm.h>
  15 #include <crm/cib.h>
  16 #include <crm/msg_xml.h>
  17 #include <crm/common/xml.h>
  18 
  19 #include <glib.h>
  20 
  21 #include <crm/pengine/status.h>
  22 #include <pacemaker-internal.h>
  23 #include <crm/common/ipc_internal.h>
  24 
  25 gboolean show_scores = FALSE;
  26 gboolean show_utilization = FALSE;
  27 
  28 static void
  29 log_resource_details(pe_working_set_t *data_set)
     /* [previous][next][first][last][top][bottom][index][help] */
  30 {
  31     int rc = pcmk_rc_ok;
  32     pcmk__output_t *out = NULL;
  33     const char* argv[] = { "", NULL };
  34     GListPtr all = NULL;
  35     pcmk__supported_format_t formats[] = {
  36         PCMK__SUPPORTED_FORMAT_LOG,
  37         { NULL, NULL, NULL }
  38     };
  39 
  40     /* We need a list of nodes that we are allowed to output information for.
  41      * This is necessary because out->message for all the resource-related
  42      * messages expects such a list, due to the `crm_mon --node=` feature.  Here,
  43      * we just make it a list of all the nodes.
  44      */
  45     all = g_list_prepend(all, strdup("*"));
  46 
  47     pcmk__register_formats(NULL, formats);
  48     rc = pcmk__output_new(&out, "log", NULL, (char**)argv);
  49     if ((rc != pcmk_rc_ok) || (out == NULL)) {
  50         crm_err("Can't log resource details due to internal error: %s\n",
  51                 pcmk_rc_str(rc));
  52         return;
  53     }
  54     pe__register_messages(out);
  55 
  56     for (GList *item = data_set->resources; item != NULL; item = item->next) {
  57         pe_resource_t *rsc = (pe_resource_t *) item->data;
  58 
  59         // Log all resources except inactive orphans
  60         if (!pcmk_is_set(rsc->flags, pe_rsc_orphan)
  61             || (rsc->role != RSC_ROLE_STOPPED)) {
  62             out->message(out, crm_map_element_name(rsc->xml), 0, rsc, all, all);
  63         }
  64     }
  65 
  66     pcmk__output_free(out);
  67     g_list_free_full(all, free);
  68 }
  69 
  70 /*!
  71  * \internal
  72  * \brief Run the scheduler for a given CIB
  73  *
  74  * \param[in,out] data_set  Cluster working set
  75  * \param[in]     xml_input CIB XML to use as scheduler input
  76  * \param[in]     now       Time to use for rule evaluation (or NULL for now)
  77  */
  78 xmlNode *
  79 pcmk__schedule_actions(pe_working_set_t *data_set, xmlNode *xml_input,
     /* [previous][next][first][last][top][bottom][index][help] */
  80                        crm_time_t *now)
  81 {
  82     GListPtr gIter = NULL;
  83 
  84 /*      pe_debug_on(); */
  85 
  86     CRM_ASSERT(xml_input || pcmk_is_set(data_set->flags, pe_flag_have_status));
  87 
  88     if (!pcmk_is_set(data_set->flags, pe_flag_have_status)) {
  89         set_working_set_defaults(data_set);
  90         data_set->input = xml_input;
  91         data_set->now = now;
  92 
  93     } else {
  94         crm_trace("Already have status - reusing");
  95     }
  96 
  97     if (data_set->now == NULL) {
  98         data_set->now = crm_time_new(NULL);
  99     }
 100 
 101     crm_trace("Calculate cluster status");
 102     stage0(data_set);
 103     if (!pcmk_is_set(data_set->flags, pe_flag_quick_location)) {
 104         log_resource_details(data_set);
 105     }
 106 
 107     crm_trace("Applying location constraints");
 108     stage2(data_set);
 109 
 110     if (pcmk_is_set(data_set->flags, pe_flag_quick_location)) {
 111         return NULL;
 112     }
 113 
 114     crm_trace("Create internal constraints");
 115     stage3(data_set);
 116 
 117     crm_trace("Check actions");
 118     stage4(data_set);
 119 
 120     crm_trace("Allocate resources");
 121     stage5(data_set);
 122 
 123     crm_trace("Processing fencing and shutdown cases");
 124     stage6(data_set);
 125 
 126     crm_trace("Applying ordering constraints");
 127     stage7(data_set);
 128 
 129     crm_trace("Create transition graph");
 130     stage8(data_set);
 131 
 132     crm_trace("=#=#=#=#= Summary =#=#=#=#=");
 133     crm_trace("\t========= Set %d (Un-runnable) =========", -1);
 134     if (get_crm_log_level() == LOG_TRACE) {
 135         gIter = data_set->actions;
 136         for (; gIter != NULL; gIter = gIter->next) {
 137             pe_action_t *action = (pe_action_t *) gIter->data;
 138 
 139             if (!pcmk_any_flags_set(action->flags,
 140                                     pe_action_optional
 141                                     |pe_action_runnable
 142                                     |pe_action_pseudo)) {
 143                 log_action(LOG_TRACE, "\t", action, TRUE);
 144             }
 145         }
 146     }
 147 
 148     return data_set->graph;
 149 }

/* [previous][next][first][last][top][bottom][index][help] */