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 #ifndef PCMK__PCMKI_PCMKI_FENCE__H 10 # define PCMK__PCMKI_PCMKI_FENCE__H 11 12 # include <crm/stonith-ng.h> 13 # include <crm/common/output_internal.h> 14 15 /*! 16 * \brief Control how much of the fencing history is output. 17 */ 18 enum pcmk__fence_history { 19 pcmk__fence_history_none, 20 pcmk__fence_history_reduced, 21 pcmk__fence_history_full 22 }; 23 24 /*! 25 * \brief Ask the cluster to perform fencing 26 * 27 * \note This is the internal version of pcmk_request_fencing(). External users 28 * of the pacemaker API should use that function instead. 29 * 30 * \param[in] st A connection to the fencer API 31 * \param[in] target The node that should be fenced 32 * \param[in] action The fencing action (on, off, reboot) to perform 33 * \param[in] name Who requested the fence action? 34 * \param[in] timeout How long to wait for the operation to complete (in ms) 35 * \param[in] tolerance If a successful action for \p target happened within 36 * this many milliseconds, return success without 37 * performing the action again 38 * \param[in] delay Apply this delay (in milliseconds) before initiating the 39 * fencing action (a value of -1 applies no delay and also 40 * disables any fencing delay from pcmk_delay_base and 41 * pcmk_delay_max) 42 * \param[out] reason If not NULL, where to put descriptive failure reason 43 * 44 * \return Standard Pacemaker return code 45 * \note If \p reason is not NULL, the caller is responsible for freeing its 46 * returned value. 47 * \todo delay is eventually used with g_timeout_add() and should be guint 48 */ 49 int pcmk__request_fencing(stonith_t *st, const char *target, const char *action, 50 const char *name, unsigned int timeout, 51 unsigned int tolerance, int delay, char **reason); 52 53 /*! 54 * \brief List the fencing operations that have occurred for a specific node. 55 * 56 * \note This is the internal version of pcmk_fence_history(). External users 57 * of the pacemaker API should use that function instead. 58 * 59 * \note \p out should be initialized with pcmk__output_new() before calling this 60 * function and destroyed with out->finish and pcmk__output_free() before 61 * reusing it with any other functions in this library. 62 * 63 * \param[in,out] out The output functions structure. 64 * \param[in] st A connection to the STONITH API. 65 * \param[in] target The node to get history for. 66 * \param[in] timeout How long to wait for the operation to complete (in ms). 67 * \param[in] verbose Include additional output. 68 * \param[in] broadcast Gather fencing history from all nodes. 69 * \param[in] cleanup Clean up fencing history after listing. 70 * 71 * \return Standard Pacemaker return code 72 */ 73 int pcmk__fence_history(pcmk__output_t *out, stonith_t *st, char *target, 74 unsigned int timeout, int verbose, bool broadcast, 75 bool cleanup); 76 77 /** 78 * \brief List all installed STONITH agents. 79 * 80 * \note This is the internal version of pcmk_fence_installed(). External users 81 * of the pacemaker API should use that function instead. 82 * 83 * \note \p out should be initialized with pcmk__output_new() before calling this 84 * function and destroyed with out->finish and pcmk__output_free() before 85 * reusing it with any other functions in this library. 86 * 87 * \param[in,out] out The output functions structure. 88 * \param[in] st A connection to the STONITH API. 89 * \param[in] timeout How long to wait for the operation to complete (in ms). 90 * 91 * \return Standard Pacemaker return code 92 */ 93 int pcmk__fence_installed(pcmk__output_t *out, stonith_t *st, unsigned int timeout); 94 95 /*! 96 * \brief When was a device last fenced? 97 * 98 * \note This is the internal version of pcmk_fence_last(). External users 99 * of the pacemaker API should use that function instead. 100 * 101 * \note \p out should be initialized with pcmk__output_new() before calling this 102 * function and destroyed with out->finish and pcmk__output_free() before 103 * reusing it with any other functions in this library. 104 * 105 * \param[in,out] out The output functions structure. 106 * \param[in] target The node that was fenced. 107 * \param[in] as_nodeid 108 * 109 * \return Standard Pacemaker return code 110 */ 111 int pcmk__fence_last(pcmk__output_t *out, const char *target, bool as_nodeid); 112 113 /*! 114 * \brief List nodes that can be fenced. 115 * 116 * \note This is the internal version of pcmk_fence_list_targets(). External users 117 * of the pacemaker API should use that function instead. 118 * 119 * \note \p out should be initialized with pcmk__output_new() before calling this 120 * function and destroyed with out->finish and pcmk__output_free() before 121 * reusing it with any other functions in this library. 122 * 123 * \param[in,out] out The output functions structure 124 * \param[in] st A connection to the STONITH API 125 * \param[in] device_id Resource ID of fence device to check 126 * \param[in] timeout How long to wait for the operation to complete (in ms) 127 * 128 * \return Standard Pacemaker return code 129 */ 130 int pcmk__fence_list_targets(pcmk__output_t *out, stonith_t *st, 131 const char *device_id, unsigned int timeout); 132 133 /*! 134 * \brief Get metadata for a resource. 135 * 136 * \note This is the internal version of pcmk_fence_metadata(). External users 137 * of the pacemaker API should use that function instead. 138 * 139 * \note \p out should be initialized with pcmk__output_new() before calling this 140 * function and destroyed with out->finish and pcmk__output_free() before 141 * reusing it with any other functions in this library. 142 * 143 * \param[in,out] out The output functions structure. 144 * \param[in] st A connection to the STONITH API. 145 * \param[in] agent The fence agent to get metadata for. 146 * \param[in] timeout How long to wait for the operation to complete (in ms). 147 * 148 * \return Standard Pacemaker return code 149 */ 150 int pcmk__fence_metadata(pcmk__output_t *out, stonith_t *st, char *agent, 151 unsigned int timeout); 152 153 /*! 154 * \brief List registered fence devices. 155 * 156 * \note This is the internal version of pcmk_fence_metadata(). External users 157 * of the pacemaker API should use that function instead. 158 * 159 * \note \p out should be initialized with pcmk__output_new() before calling this 160 * function and destroyed with out->finish and pcmk__output_free() before 161 * reusing it with any other functions in this library. 162 * 163 * \param[in,out] out The output functions structure. 164 * \param[in] st A connection to the STONITH API. 165 * \param[in] target If not NULL, only return devices that can fence 166 * this node. 167 * \param[in] timeout How long to wait for the operation to complete (in ms). 168 * 169 * \return Standard Pacemaker return code 170 */ 171 int pcmk__fence_registered(pcmk__output_t *out, stonith_t *st, char *target, 172 unsigned int timeout); 173 174 /*! 175 * \brief Register a fencing level for a specific node, node regex, or attribute. 176 * 177 * \note This is the internal version of pcmk_fence_register_level(). External users 178 * of the pacemaker API should use that function instead. 179 * 180 * \p target can take three different forms: 181 * - name=value, in which case \p target is an attribute. 182 * - @pattern, in which case \p target is a node regex. 183 * - Otherwise, \p target is a node name. 184 * 185 * \param[in] st A connection to the STONITH API. 186 * \param[in] target The object to register a fencing level for. 187 * \param[in] fence_level Index number of level to add. 188 * \param[in] devices Devices to use in level. 189 * 190 * \return Standard Pacemaker return code 191 */ 192 int pcmk__fence_register_level(stonith_t *st, char *target, int fence_level, 193 stonith_key_value_t *devices); 194 195 /*! 196 * \brief Unregister a fencing level for a specific node, node regex, or attribute. 197 * 198 * \note This is the internal version of pcmk_fence_unregister_level(). External users 199 * of the pacemaker API should use that function instead. 200 * 201 * \p target can take three different forms: 202 * - name=value, in which case \p target is an attribute. 203 * - @pattern, in which case \p target is a node regex. 204 * - Otherwise, \p target is a node name. 205 * 206 * \param[in] st A connection to the STONITH API. 207 * \param[in] target The object to unregister a fencing level for. 208 * \param[in] fence_level Index number of level to remove. 209 * 210 * \return Standard Pacemaker return code 211 */ 212 int pcmk__fence_unregister_level(stonith_t *st, char *target, int fence_level); 213 214 /** 215 * \brief Validate a STONITH device configuration. 216 * 217 * \note This is the internal version of pcmk_stonith_validate(). External users 218 * of the pacemaker API should use that function instead. 219 * 220 * \note \p out should be initialized with pcmk__output_new() before calling this 221 * function and destroyed with out->finish and pcmk__output_free() before 222 * reusing it with any other functions in this library. 223 * 224 * \param[in,out] out The output functions structure. 225 * \param[in] st A connection to the STONITH API. 226 * \param[in] agent The agent to validate (for example, "fence_xvm"). 227 * \param[in] id STONITH device ID (may be NULL). 228 * \param[in] params STONITH device configuration parameters. 229 * \param[in] timeout How long to wait for the operation to complete (in ms). 230 * 231 * \return Standard Pacemaker return code 232 */ 233 int pcmk__fence_validate(pcmk__output_t *out, stonith_t *st, const char *agent, 234 const char *id, stonith_key_value_t *params, 235 unsigned int timeout); 236 237 /** 238 * \brief Fetch STONITH history, optionally reducing it. 239 * 240 * \param[in] st The STONITH API object 241 * \param[out] stonith_history Destination for storing the history 242 * \param[in] fence_history How much of the fencing history to display? 243 * 244 * \return Standard Pacemaker return code 245 */ 246 int 247 pcmk__get_fencing_history(stonith_t *st, stonith_history_t **stonith_history, 248 enum pcmk__fence_history fence_history); 249 #endif