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