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