* - Populate NoIPTakover tunable in IP allocation state
* - Populate NoIPHost in IP allocation state, derived from node flags
* and NoIPHostOnAllDisabled tunable
- * - Retrieve and populate known and available IP lists in IP
- * allocation state
+ * - Retrieve known and available IP addresses (done separately so
+ * values can be faked in unit testing)
+ * - Use ipalloc_set_public_ips() to set known and available IP
+ addresses for allocation
* - If no available IP addresses then early exit
* - Build list of (known IPs, currently assigned node)
* - Populate list of nodes to force rebalance - internal structure,
return -1;
}
- ipalloc_state->known_public_ips = known_ips;
- ipalloc_state->available_public_ips = available_ips;
+ if (! ipalloc_set_public_ips(ipalloc_state, known_ips, available_ips)) {
+ DEBUG(DEBUG_ERR, ("Failed to set public IPs\n"));
+ talloc_free(tmp_ctx);
+ return -1;
+ }
/* Short-circuit IP allocation if no node has available IPs */
can_host_ips = false;
#include "server/ipalloc_private.h"
+bool ipalloc_set_public_ips(struct ipalloc_state *ipalloc_state,
+ struct ctdb_public_ip_list *known_ips,
+ struct ctdb_public_ip_list *available_ips)
+{
+ ipalloc_state->known_public_ips = known_ips;
+ ipalloc_state->available_public_ips = available_ips;
+
+ return true;
+}
+
/* The calculation part of the IP allocation algorithm. */
bool ipalloc(struct ipalloc_state *ipalloc_state)
{
uint32_t *force_rebalance_nodes;
};
+bool ipalloc_set_public_ips(struct ipalloc_state *ipalloc_state,
+ struct ctdb_public_ip_list *known_ips,
+ struct ctdb_public_ip_list *available_ips);
+
bool ipalloc(struct ipalloc_state *ipalloc_state);
#endif /* __CTDB_IPALLOC_H__ */
(*ctdb)->nodes[i]->flags = nodemap->nodes[i].flags;
}
- (*ipalloc_state)->available_public_ips = avail;
- (*ipalloc_state)->known_public_ips = known;
+ if (! ipalloc_set_public_ips(*ipalloc_state, known, avail)) {
+ DEBUG(DEBUG_ERR, ("Failed to set public IPs\n"));
+ exit(1);
+ }
set_ipflags_internal(*ipalloc_state, nodemap,
tval_noiptakeover,