1 /* 2 * Copyright 2019-2022 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__PACEMAKER__H 11 # define PCMK__PACEMAKER__H 12 13 # include <glib.h> 14 # include <libxml/tree.h> 15 # include <crm/cib/cib_types.h> 16 # include <crm/pengine/pe_types.h> 17 18 # include <crm/stonith-ng.h> 19 20 #ifdef __cplusplus 21 extern "C" { 22 #endif 23 24 /** 25 * \file 26 * \brief High Level API 27 * \ingroup pacemaker 28 */ 29 30 31 /*! 32 * \brief Modify operation of running a cluster simulation. 33 */ 34 enum pcmk_sim_flags { 35 pcmk_sim_none = 0, 36 pcmk_sim_all_actions = 1 << 0, 37 pcmk_sim_show_pending = 1 << 1, 38 pcmk_sim_process = 1 << 2, 39 pcmk_sim_show_scores = 1 << 3, 40 pcmk_sim_show_utilization = 1 << 4, 41 pcmk_sim_simulate = 1 << 5, 42 pcmk_sim_sanitized = 1 << 6, 43 pcmk_sim_verbose = 1 << 7, 44 }; 45 46 /*! 47 * \brief Synthetic cluster events that can be injected into the cluster 48 * for running simulations. 49 */ 50 typedef struct { 51 /*! A list of node names (gchar *) to simulate bringing online */ 52 GList *node_up; 53 /*! A list of node names (gchar *) to simulate bringing offline */ 54 GList *node_down; 55 /*! A list of node names (gchar *) to simulate failing */ 56 GList *node_fail; 57 /*! A list of operations (gchar *) to inject. The format of these strings 58 * is described in the "Operation Specification" section of crm_simulate 59 * help output. 60 */ 61 GList *op_inject; 62 /*! A list of operations (gchar *) that should return a given error code 63 * if they fail. The format of these strings is described in the 64 * "Operation Specification" section of crm_simulate help output. 65 */ 66 GList *op_fail; 67 /*! A list of tickets (gchar *) to simulate granting */ 68 GList *ticket_grant; 69 /*! A list of tickets (gchar *) to simulate revoking */ 70 GList *ticket_revoke; 71 /*! A list of tickets (gchar *) to simulate putting on standby */ 72 GList *ticket_standby; 73 /*! A list of tickets (gchar *) to simulate activating */ 74 GList *ticket_activate; 75 /*! Does the cluster have an active watchdog device? */ 76 char *watchdog; 77 /*! Does the cluster have quorum? */ 78 char *quorum; 79 } pcmk_injections_t; 80 81 /*! 82 * \brief Get controller status 83 * 84 * \param[in,out] xml The destination for the result, as an XML tree. 85 * \param[in] dest_node Destination node for request 86 * \param[in] message_timeout_ms Message timeout 87 * 88 * \return Standard Pacemaker return code 89 */ 90 int pcmk_controller_status(xmlNodePtr *xml, char *dest_node, unsigned int message_timeout_ms); 91 92 /*! 93 * \brief Get designated controller 94 * 95 * \param[in,out] xml The destination for the result, as an XML tree. 96 * \param[in] message_timeout_ms Message timeout 97 * 98 * \return Standard Pacemaker return code 99 */ 100 int pcmk_designated_controller(xmlNodePtr *xml, unsigned int message_timeout_ms); 101 102 /*! 103 * \brief Free a :pcmk_injections_t structure 104 * 105 * \param[in,out] injections The structure to be freed 106 */ 107 void pcmk_free_injections(pcmk_injections_t *injections); 108 109 /*! 110 * \brief Get pacemakerd status 111 * 112 * \param[in,out] xml The destination for the result, as an XML tree. 113 * \param[in] ipc_name IPC name for request 114 * \param[in] message_timeout_ms Message timeout 115 * 116 * \return Standard Pacemaker return code 117 */ 118 int pcmk_pacemakerd_status(xmlNodePtr *xml, char *ipc_name, unsigned int message_timeout_ms); 119 120 /*! 121 * \brief Calculate and output resource operation digests 122 * 123 * \param[out] xml Where to store XML with result 124 * \param[in] rsc Resource to calculate digests for 125 * \param[in] node Node whose operation history should be used 126 * \param[in] overrides Hash table of configuration parameters to override 127 * \param[in] data_set Cluster working set (with status) 128 * 129 * \return Standard Pacemaker return code 130 */ 131 int pcmk_resource_digests(xmlNodePtr *xml, pe_resource_t *rsc, 132 pe_node_t *node, GHashTable *overrides, 133 pe_working_set_t *data_set); 134 135 /** 136 * \brief Simulate a cluster's response to events. 137 * 138 * This high-level function essentially implements crm_simulate(8). It operates 139 * on an input CIB file and various lists of events that can be simulated. It 140 * optionally writes out a variety of artifacts to show the results of the 141 * simulation. Output can be modified with various flags. 142 * 143 * \param[in,out] xml The destination for the result, as an XML tree. 144 * \param[in,out] data_set Working set for the cluster. 145 * \param[in] events A structure containing cluster events 146 * (node up/down, tickets, injected operations) 147 * \param[in] flags A bitfield of :pcmk_sim_flags to modify 148 * operation of the simulation. 149 * \param[in] section_opts Which portions of the cluster status output 150 * should be displayed? 151 * \param[in] use_date The date to set the cluster's time to 152 * (may be NULL). 153 * \param[in] input_file The source CIB file, which may be overwritten by 154 * this function (may be NULL). 155 * \param[in] graph_file Where to write the XML-formatted transition graph 156 * (may be NULL, in which case no file will be 157 * written). 158 * \param[in] dot_file Where to write the dot(1) formatted transition 159 * graph (may be NULL, in which case no file will 160 * be written). See \p pcmk__write_sim_dotfile(). 161 * 162 * \return Standard Pacemaker return code 163 */ 164 int pcmk_simulate(xmlNodePtr *xml, pe_working_set_t *data_set, 165 pcmk_injections_t *injections, unsigned int flags, 166 unsigned int section_opts, char *use_date, char *input_file, 167 char *graph_file, char *dot_file); 168 169 /*! 170 * \brief Get nodes list 171 * 172 * \param[in,out] xml The destination for the result, as an XML tree. 173 * \param[in] node_types Node type(s) to return (default: all) 174 * 175 * \return Standard Pacemaker return code 176 */ 177 int pcmk_list_nodes(xmlNodePtr *xml, char *node_types); 178 179 /*! 180 * \brief Output the current status of the cluster, formatted in the same way 181 * that `crm_mon --output-as=xml` would. 182 * 183 * \param[in,out] xml The destination for the result, as an XML tree. 184 * 185 * \return Standard Pacemaker return code 186 */ 187 int pcmk_status(xmlNodePtr *xml); 188 189 #ifdef BUILD_PUBLIC_LIBPACEMAKER 190 191 /*! 192 * \brief Ask the cluster to perform fencing 193 * 194 * \param[in] st A connection to the fencer API 195 * \param[in] target The node that should be fenced 196 * \param[in] action The fencing action (on, off, reboot) to perform 197 * \param[in] name Who requested the fence action? 198 * \param[in] timeout How long to wait for the operation to complete (in ms) 199 * \param[in] tolerance If a successful action for \p target happened within 200 * this many ms, return 0 without performing the action 201 * again 202 * \param[in] delay Apply this delay (in milliseconds) before initiating the 203 * fencing action (a value of -1 applies no delay and also 204 * disables any fencing delay from pcmk_delay_base and 205 * pcmk_delay_max) 206 * \param[out] reason If not NULL, where to put descriptive failure reason 207 * 208 * \return Standard Pacemaker return code 209 * \note If \p reason is not NULL, the caller is responsible for freeing its 210 * returned value. 211 */ 212 int pcmk_request_fencing(stonith_t *st, const char *target, const char *action, 213 const char *name, unsigned int timeout, 214 unsigned int tolerance, int delay, char **reason); 215 216 /*! 217 * \brief List the fencing operations that have occurred for a specific node. 218 * 219 * \note If \p xml is not NULL, it will be freed first and the previous 220 * contents lost. 221 * 222 * \param[in,out] xml The destination for the result, as an XML tree. 223 * \param[in] st A connection to the STONITH API. 224 * \param[in] target The node to get history for. 225 * \param[in] timeout How long to wait for the operation to complete (in ms). 226 * \param[in] quiet Suppress most output. 227 * \param[in] verbose Include additional output. 228 * \param[in] broadcast Gather fencing history from all nodes. 229 * \param[in] cleanup Clean up fencing history after listing. 230 * 231 * \return Standard Pacemaker return code 232 */ 233 int pcmk_fence_history(xmlNodePtr *xml, stonith_t *st, char *target, 234 unsigned int timeout, bool quiet, int verbose, 235 bool broadcast, bool cleanup); 236 237 /*! 238 * \brief List all installed STONITH agents. 239 * 240 * \note If \p xml is not NULL, it will be freed first and the previous 241 * contents lost. 242 * 243 * \param[in,out] xml The destination for the result, as an XML tree. 244 * \param[in] st A connection to the STONITH API. 245 * \param[in] timeout How long to wait for the operation to complete (in ms). 246 * 247 * \return Standard Pacemaker return code 248 */ 249 int pcmk_fence_installed(xmlNodePtr *xml, stonith_t *st, unsigned int timeout); 250 251 /*! 252 * \brief When was a device last fenced? 253 * 254 * \note If \p xml is not NULL, it will be freed first and the previous 255 * contents lost. 256 * 257 * \param[in,out] xml The destination for the result, as an XML tree. 258 * \param[in] target The node that was fenced. 259 * \param[in] as_nodeid 260 * 261 * \return Standard Pacemaker return code 262 */ 263 int pcmk_fence_last(xmlNodePtr *xml, const char *target, bool as_nodeid); 264 265 /*! 266 * \brief List nodes that can be fenced. 267 * 268 * \note If \p xml is not NULL, it will be freed first and the previous 269 * contents lost. 270 * 271 * \param[in,out] xml The destination for the result, as an XML tree 272 * \param[in] st A connection to the STONITH API 273 * \param[in] device_id Resource ID of fence device to check 274 * \param[in] timeout How long to wait for the operation to complete (in ms) 275 * 276 * \return Standard Pacemaker return code 277 */ 278 int pcmk_fence_list_targets(xmlNodePtr *xml, stonith_t *st, 279 const char *device_id, unsigned int timeout); 280 281 /*! 282 * \brief Get metadata for a resource. 283 * 284 * \note If \p xml is not NULL, it will be freed first and the previous 285 * contents lost. 286 * 287 * \param[in,out] xml The destination for the result, as an XML tree. 288 * \param[in] st A connection to the STONITH API. 289 * \param[in] agent The fence agent to get metadata for. 290 * \param[in] timeout How long to wait for the operation to complete (in ms). 291 * 292 * \return Standard Pacemaker return code 293 */ 294 int pcmk_fence_metadata(xmlNodePtr *xml, stonith_t *st, char *agent, 295 unsigned int timeout); 296 297 /*! 298 * \brief List registered fence devices. 299 * 300 * \note If \p xml is not NULL, it will be freed first and the previous 301 * contents lost. 302 * 303 * \param[in,out] xml The destination for the result, as an XML tree. 304 * \param[in] st A connection to the STONITH API. 305 * \param[in] target If not NULL, only return devices that can fence 306 * this node. 307 * \param[in] timeout How long to wait for the operation to complete (in ms). 308 * 309 * \return Standard Pacemaker return code 310 */ 311 int pcmk_fence_registered(xmlNodePtr *xml, stonith_t *st, char *target, 312 unsigned int timeout); 313 314 /*! 315 * \brief Register a fencing level for a specific node, node regex, or attribute. 316 * 317 * \p target can take three different forms: 318 * - name=value, in which case \p target is an attribute. 319 * - @pattern, in which case \p target is a node regex. 320 * - Otherwise, \p target is a node name. 321 * 322 * \param[in] st A connection to the STONITH API. 323 * \param[in] target The object to register a fencing level for. 324 * \param[in] fence_level Index number of level to add. 325 * \param[in] devices Devices to use in level. 326 * 327 * \return Standard Pacemaker return code 328 */ 329 int pcmk_fence_register_level(stonith_t *st, char *target, int fence_level, 330 stonith_key_value_t *devices); 331 332 /*! 333 * \brief Unregister a fencing level for a specific node, node regex, or attribute. 334 * 335 * \p target can take three different forms: 336 * - name=value, in which case \p target is an attribute. 337 * - @pattern, in which case \p target is a node regex. 338 * - Otherwise, \p target is a node name. 339 * 340 * \param[in] st A connection to the STONITH API. 341 * \param[in] target The object to unregister a fencing level for. 342 * \param[in] fence_level Index number of level to remove. 343 * 344 * \return Standard Pacemaker return code 345 */ 346 int pcmk_fence_unregister_level(stonith_t *st, char *target, int fence_level); 347 348 /*! 349 * \brief Validate a STONITH device configuration. 350 * 351 * \note If \p xml is not NULL, it will be freed first and the previous 352 * contents lost. 353 * 354 * \param[in,out] xml The destination for the result, as an XML tree. 355 * \param[in] st A connection to the STONITH API. 356 * \param[in] agent The agent to validate (for example, "fence_xvm"). 357 * \param[in] id STONITH device ID (may be NULL). 358 * \param[in] params STONITH device configuration parameters. 359 * \param[in] timeout How long to wait for the operation to complete (in ms). 360 * 361 * \return Standard Pacemaker return code 362 */ 363 int pcmk_fence_validate(xmlNodePtr *xml, stonith_t *st, const char *agent, 364 const char *id, stonith_key_value_t *params, 365 unsigned int timeout); 366 #endif 367 368 #ifdef __cplusplus 369 } 370 #endif 371 372 #endif