1 /*
2 * Copyright 2021-2024 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 Lesser General Public License
7 * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
8 */
9
10 #ifndef PCMK__PCMKI_PCMKI_SIMULATE__H
11 #define PCMK__PCMKI_PCMKI_SIMULATE__H
12
13 #include <crm/common/output_internal.h>
14 #include <crm/common/scheduler.h>
15 #include <pcmki/pcmki_transition.h>
16 #include <crm/cib.h> // cib_t
17 #include <pacemaker.h>
18 #include <stdbool.h>
19 #include <stdint.h>
20
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24
25 /*!
26 * \internal
27 * \brief Profile the configuration updates and scheduler actions in every
28 * CIB file in a given directory, printing the profiling timings for
29 * each.
30 *
31 * \note \p scheduler->priv->out must have been set to a valid \p pcmk__output_t
32 * object before this function is called.
33 *
34 * \param[in] dir A directory full of CIB files to be profiled
35 * \param[in] repeat Number of times to run on each input file
36 * \param[in,out] scheduler Scheduler data
37 * \param[in] use_date The date to set the cluster's time to (may be NULL)
38 */
39 void pcmk__profile_dir(const char *dir, long long repeat,
40 pcmk_scheduler_t *scheduler, const char *use_date);
41
42 /*!
43 * \internal
44 * \brief Simulate executing a transition
45 *
46 * \param[in,out] scheduler Scheduler data
47 * \param[in,out] cib CIB object for scheduler input
48 * \param[in] op_fail_list List of actions to simulate as failing
49 *
50 * \return Transition status after simulated execution
51 */
52 enum pcmk__graph_status pcmk__simulate_transition(pcmk_scheduler_t *scheduler,
53 cib_t *cib,
54 const GList *op_fail_list);
55
56 /*!
57 * \internal
58 * \brief Simulate a cluster's response to events
59 *
60 * This high-level function essentially implements crm_simulate(8). It operates
61 * on an input CIB file and various lists of events that can be simulated. It
62 * optionally writes out a variety of artifacts to show the results of the
63 * simulation. Output can be modified with various flags.
64 *
65 * \param[in,out] scheduler Scheduler data
66 * \param[in,out] out The output functions structure
67 * \param[in] injections A structure containing cluster events
68 * (node up/down, tickets, injected operations)
69 * and related data
70 * \param[in] flags A bitfield of \p pcmk_sim_flags to modify
71 * operation of the simulation
72 * \param[in] section_opts Which portions of the cluster status output
73 * should be displayed?
74 * \param[in] use_date The date to set the cluster's time to
75 * (may be NULL)
76 * \param[in] input_file The source CIB file, which may be overwritten by
77 * this function (may be NULL)
78 * \param[in] graph_file Where to write the XML-formatted transition graph
79 * (may be NULL, in which case no file will be
80 * written)
81 * \param[in] dot_file Where to write the dot(1) formatted transition
82 * graph (may be NULL, in which case no file will
83 * be written; see \p pcmk__write_sim_dotfile())
84 *
85 * \return Standard Pacemaker return code
86 */
87 int pcmk__simulate(pcmk_scheduler_t *scheduler, pcmk__output_t *out,
88 const pcmk_injections_t *injections, unsigned int flags,
89 uint32_t section_opts, const char *use_date,
90 const char *input_file, const char *graph_file,
91 const char *dot_file);
92
93 /*!
94 * \internal
95 *
96 * If this global is set to true, simulations will add nodes to the
97 * CIB configuration section, as well as the status section.
98 */
99 extern bool pcmk__simulate_node_config;
100
101 #ifdef __cplusplus
102 }
103 #endif
104
105 #endif // PCMK__PCMKI_PCMKI_SIMULATE__H