| /*****************************************************************************\ |
| * hostlist.h |
| ***************************************************************************** |
| * Copyright (C) 2002 The Regents of the University of California. |
| * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). |
| * Written by Mark Grondona <mgrondona@llnl.gov> |
| * CODE-OCEC-09-009. All rights reserved. |
| * |
| * This file is part of Slurm, a resource management program. |
| * For details, see <https://slurm.schedmd.com/>. |
| * Please also read the included file: DISCLAIMER. |
| * |
| * Slurm is free software; you can redistribute it and/or modify it under |
| * the terms of the GNU General Public License as published by the Free |
| * Software Foundation; either version 2 of the License, or (at your option) |
| * any later version. |
| * |
| * In addition, as a special exception, the copyright holders give permission |
| * to link the code of portions of this program with the OpenSSL library under |
| * certain conditions as described in each individual source file, and |
| * distribute linked combinations including the two. You must obey the GNU |
| * General Public License in all respects for all of the code used other than |
| * OpenSSL. If you modify file(s) with this exception, you may extend this |
| * exception to your version of the file(s), but you are not obligated to do |
| * so. If you do not wish to do so, delete this exception statement from your |
| * version. If you delete this exception statement from all source files in |
| * the program, then also delete it here. |
| * |
| * Slurm is distributed in the hope that it will be useful, but WITHOUT ANY |
| * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more |
| * details. |
| * |
| * You should have received a copy of the GNU General Public License along |
| * with Slurm; if not, write to the Free Software Foundation, Inc., |
| * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| \*****************************************************************************/ |
| |
| #ifndef _HOSTLIST_H |
| #define _HOSTLIST_H |
| |
| #include "config.h" |
| |
| #include <stdint.h> |
| #include <unistd.h> /* load ssize_t definition */ |
| |
| /* Since users can specify a numeric range in the prefix, we need to prevent |
| * expressions that can consume all of the memory on a system and crash the |
| * daemons (e.g. "a[0-999999999].b[0-9]", which generates 1 billion distinct |
| * prefix records in the hostlist) */ |
| #define MAX_PREFIX_CNT 64*1024 |
| |
| /* max host range: anything larger will be assumed to be an error */ |
| #define MAX_RANGE MAX_SLURM_NODES /* 64K Hosts */ |
| |
| /* largest configured system dimensions */ |
| #ifndef HIGHEST_DIMENSIONS |
| # define HIGHEST_DIMENSIONS 5 |
| #endif |
| #define HIGHEST_BASE 36 |
| |
| #define FREE_NULL_HOSTLIST(_X) \ |
| do { \ |
| if (_X) hostlist_destroy (_X); \ |
| _X = NULL; \ |
| } while (0) |
| |
| #define FREE_NULL_HOSTSET(_X) \ |
| do { \ |
| if (_X) hostset_destroy (_X); \ |
| _X = NULL; \ |
| } while (0) |
| |
| /* The hostlist opaque data type |
| * |
| * A hostlist is a list of hostnames optimized for a prefixXXXX style |
| * naming convention, where XXXX is a decimal, numeric suffix. |
| */ |
| #ifndef __hostlist_t_defined |
| # define __hostlist_t_defined |
| typedef struct hostlist hostlist_t; |
| #endif |
| |
| /* A hostset is a special case of a hostlist. It: |
| * |
| * 1. never contains duplicates |
| * 2. is always sorted |
| * (Note: sort occurs first on alphanumeric prefix -- where prefix |
| * matches, numeric suffixes will be sorted *by value*) |
| */ |
| typedef struct hostset hostset_t; |
| |
| /* The hostlist iterator type (may be used with a hostset as well) |
| * used for non-destructive access to hostlist members. |
| * |
| */ |
| typedef struct hostlist_iterator hostlist_iterator_t; |
| |
| /* ----[ hostlist_t functions: ]---- */ |
| |
| /* ----[ hostlist creation and destruction ]---- */ |
| |
| int set_grid(int start, int end, int count); |
| /* |
| * hostlist_create(): |
| * |
| * Create a new hostlist from a string representation. |
| * |
| * The string representation may contain one or more hostnames or |
| * bracketed hostlists separated by either `,' or whitespace (e.g. |
| * "alpha,beta,gamma"). A bracketed hostlist is denoted by a common |
| * prefix followed by a list of numeric ranges contained within brackets |
| * (e.g. "tux[0-5,12,20-25]"). Note that the numeric ranges can include |
| * one or more leading zeros to indicate the numeric portion has a |
| * fixed number of digits (e.g. "linux[0000-1023]"). |
| * |
| * To support the BlueGene system's 3-D topology, a node name prefix |
| * is followed by three digits identifying the node's position in |
| * the X, Y and Z positions respectively. For example "bgl123" represents |
| * the node or midplane with an X position of 1, Y of 2, and Z of 3. |
| * A rectangular prism may be described using two endpoint locations |
| * separated by "x" (e.g. "bgl[123x456]" selects all nodes with X |
| * positions between 1 and 4 inclusive, Y between 2 and 5, and Z between |
| * 3 and 6 for a total of 4*4*4=64 nodes). Two or more rectangular |
| * prisms may be specified using comma separators within the brackets |
| * (e.g. "bgl[000x133,400x533]"). |
| * |
| * Note: if this module is compiled with WANT_RECKLESS_HOSTRANGE_EXPANSION |
| * defined, a much more loose interpretation of host ranges is used. |
| * Reckless hostrange expansion allows all of the following (in addition to |
| * bracketed hostlists): |
| * |
| * o tux0-5,tux12,tux20-25 |
| * o tux0-tux5,tux12,tux20-tux25 |
| * o tux0-5,12,20-25 |
| * |
| * If str is NULL, an empty hostlist is created and returned. |
| * |
| * If the create fails, hostlist_create() returns NULL. |
| * |
| * The returned hostlist must be freed with hostlist_destroy() |
| * |
| */ |
| hostlist_t *hostlist_create_dims(const char *hostlist, int dims); |
| hostlist_t *hostlist_create(const char *hostlist); |
| extern hostlist_t *hostlist_create_client(const char *hostlist); |
| |
| /* hostlist_copy(): |
| * |
| * Allocate a copy of a hostlist object. Returned hostlist must be freed |
| * with hostlist_destroy. |
| */ |
| hostlist_t *hostlist_copy(hostlist_t *hl); |
| |
| /* hostlist_destroy(): |
| * |
| * Destroy a hostlist object. Frees all memory allocated to the hostlist. |
| */ |
| void hostlist_destroy(hostlist_t *hl); |
| |
| |
| /* ----[ hostlist list operations ]---- */ |
| |
| /* hostlist_push(): |
| * |
| * push a string representation of hostnames onto a hostlist. |
| * |
| * The hosts argument may take the same form as in hostlist_create() |
| * |
| * Returns the number of hostnames inserted into the list, |
| * or 0 on failure. |
| */ |
| int hostlist_push(hostlist_t *hl, const char *hosts); |
| |
| |
| /* hostlist_push_host(): |
| * |
| * Push a single host onto the hostlist hl. |
| * This function is more efficient than hostlist_push() for a single |
| * hostname, since the argument does not need to be checked for ranges. |
| * |
| * return value is 1 for success, 0 for failure. |
| */ |
| int hostlist_push_host_dims(hostlist_t *hl, const char *str, int dims); |
| int hostlist_push_host(hostlist_t *hl, const char *host); |
| |
| |
| /* hostlist_push_list(): |
| * |
| * Push a hostlist (hl2) onto another list (hl1) |
| * |
| * Returns 1 for success, 0 for failure. |
| * |
| */ |
| int hostlist_push_list(hostlist_t *hl1, hostlist_t *hl2); |
| |
| |
| /* hostlist_pop(): |
| * |
| * Returns the string representation of the last host pushed onto the list |
| * or NULL if hostlist is empty or there was an error allocating memory. |
| * The host is removed from the hostlist. |
| * |
| * Note: Caller is responsible for freeing the returned memory. |
| */ |
| char *hostlist_pop(hostlist_t *hl); |
| |
| /* |
| * Return n-th element from hostlist |
| * Release memory using free() |
| */ |
| char *hostlist_nth(hostlist_t *hl, int n); |
| |
| /* hostlist_shift(): |
| * |
| * Returns the string representation of the first host in the hostlist |
| * or NULL if the hostlist is empty or there was an error allocating memory. |
| * The host is removed from the hostlist. |
| * |
| * Note: Caller is responsible for freeing the returned memory. |
| */ |
| char *hostlist_shift_dims(hostlist_t *hl, int dims); |
| char *hostlist_shift(hostlist_t *hl); |
| |
| /* |
| * Compares the first hostrange of two hostlists. |
| */ |
| int hostlist_cmp_first(hostlist_t *hl1, hostlist_t *hl2); |
| |
| /* hostlist_find(): |
| * |
| * Searches hostlist hl for the first host matching hostname |
| * and returns position in list if found. |
| * |
| * Returns -1 if host is not found. |
| * |
| */ |
| int hostlist_find_dims(hostlist_t *hl, const char *hostname, int dims); |
| int hostlist_find(hostlist_t *hl, const char *hostname); |
| |
| /* hostlist_delete(): |
| * |
| * Deletes all hosts in the list represented by `hosts' |
| * |
| * Returns the number of hosts successfully deleted |
| */ |
| int hostlist_delete(hostlist_t *hl, const char *hosts); |
| |
| |
| /* hostlist_delete_host(): |
| * |
| * Deletes the first host that matches `hostname' from the hostlist hl. |
| * Note: "hostname" argument cannot contain a range of hosts |
| * (see hostlist_delete() for this functionality.) |
| * |
| * Returns 1 if successful, 0 if hostname is not found in list. |
| */ |
| int hostlist_delete_host(hostlist_t *hl, const char *hostname); |
| |
| |
| /* hostlist_delete_nth(): |
| * |
| * Deletes the host from position n in the hostlist. |
| * |
| * Returns 1 if successful 0 on error. |
| * |
| */ |
| int hostlist_delete_nth(hostlist_t *hl, int n); |
| |
| |
| /* hostlist_count(): |
| * |
| * Return the number of hosts in hostlist hl. |
| */ |
| int hostlist_count(hostlist_t *hl); |
| |
| /* hostlist_is_empty(): return true if hostlist is empty. */ |
| #define hostlist_is_empty(__hl) ( hostlist_count(__hl) == 0 ) |
| |
| /* ----[ Other hostlist operations ]---- */ |
| |
| /* hostlist_sort(): |
| * |
| * Sort the hostlist hl. |
| * |
| */ |
| void hostlist_sort(hostlist_t *hl); |
| |
| /* hostlist_uniq(): |
| * |
| * Sort the hostlist hl and remove duplicate entries. |
| * |
| */ |
| void hostlist_uniq(hostlist_t *hl); |
| |
| /* Return the base used for encoding numeric hostlist suffixes */ |
| #define hostlist_get_base(_dimensions) ((_dimensions) > 1 ? 36 : 10) |
| |
| /* given a int will parse it into sizes in each dimension */ |
| void hostlist_parse_int_to_array(int in, int *out, int dims, int hostlist_base); |
| |
| /* Split a hostlist into a fanout tree */ |
| extern int hostlist_split_treewidth(hostlist_t *hl, hostlist_t ***sp_hl, |
| int *count, uint16_t tree_width); |
| |
| /* ----[ hostlist print functions ]---- */ |
| |
| /* hostlist_ranged_string_dims(): |
| * |
| * do the same thing as hostlist_ranged_string, but provide the |
| * dimensions you are looking for. |
| */ |
| ssize_t hostlist_ranged_string_dims(hostlist_t *hl, size_t n, |
| char *buf, int dims, int brackets); |
| /* hostlist_ranged_string(): |
| * |
| * Write the string representation of the hostlist hl into buf, |
| * writing at most n chars. Returns the number of bytes written, |
| * or -1 if truncation occurred. |
| * |
| * On multi-dimension systems like bluegene this function can only |
| * return a unique list back. For instance if your hostlist contains |
| * bgl[000,000] bgl000 will be returned. On other systems this is not |
| * the case, and duplicate entries will be returned in the order of |
| * the list. |
| * |
| * The result will be NULL terminated. |
| * |
| * hostlist_ranged_string() will write a bracketed hostlist representation |
| * where possible. |
| */ |
| ssize_t hostlist_ranged_string(hostlist_t *hl, size_t n, char *buf); |
| |
| /* Variant of hostlist_ranged_string(). |
| * Returns the buffer which must be released using free() or NULL on failure. |
| */ |
| char *hostlist_ranged_string_malloc(hostlist_t *hl); |
| |
| /* Variant of hostlist_ranged_string(). |
| * Returns the buffer which must be released using xfree(). |
| */ |
| char *hostlist_ranged_string_xmalloc_dims(hostlist_t *hl, int dims, |
| int brackets); |
| char *hostlist_ranged_string_xmalloc(hostlist_t *hl); |
| |
| /* hostlist_deranged_string(): |
| * |
| * Writes the string representation of the hostlist hl into buf, |
| * writing at most n chars. Returns the number of bytes written, |
| * or -1 if truncation occurred. |
| * |
| * hostlist_deranged_string() will not attempt to write a bracketed |
| * hostlist representation. Every hostname will be explicitly written. |
| */ |
| ssize_t hostlist_deranged_string_dims(hostlist_t *hl, size_t n, char *buf, |
| int dims); |
| ssize_t hostlist_deranged_string(hostlist_t *hl, size_t n, char *buf); |
| |
| /* Variant of hostlist_deranged_string(). |
| * Returns the buffer which must be released using xfree(). |
| */ |
| char *hostlist_deranged_string_xmalloc_dims(hostlist_t *hl, int dims); |
| char *hostlist_deranged_string_xmalloc(hostlist_t *hl); |
| |
| /* ----[ hostlist utility functions ]---- */ |
| |
| /* hostlist_nranges(): |
| * |
| * Return the number of ranges currently held in hostlist hl. |
| */ |
| int hostlist_nranges(hostlist_t *hl); |
| |
| |
| /* ----[ hostlist iterator functions ]---- */ |
| |
| /* hostlist_iterator_create(): |
| * |
| * Creates and returns a hostlist iterator used for non destructive |
| * access to a hostlist or hostset. Returns NULL on failure. |
| */ |
| hostlist_iterator_t *hostlist_iterator_create(hostlist_t *hl); |
| |
| /* hostset_iterator_create(): |
| * |
| * Same as hostlist_iterator_create(), but creates a hostlist_iterator |
| * from a hostset. |
| */ |
| hostlist_iterator_t *hostset_iterator_create(hostset_t *set); |
| |
| /* hostlist_iterator_destroy(): |
| * |
| * Destroys a hostlist iterator. |
| */ |
| void hostlist_iterator_destroy(hostlist_iterator_t *i); |
| |
| /* hostlist_iterator_reset(): |
| * |
| * Reset an iterator to the beginning of the list. |
| */ |
| void hostlist_iterator_reset(hostlist_iterator_t *i); |
| |
| /* hostlist_next(): |
| * |
| * Returns a pointer to the next hostname on the hostlist |
| * or NULL at the end of the list |
| * |
| * The caller is responsible for freeing the returned memory. |
| */ |
| char *hostlist_next_dims(hostlist_iterator_t *i, int dims); |
| char *hostlist_next(hostlist_iterator_t *i); |
| |
| /* hostlist_remove(): |
| * Removes the last host returned by hostlist iterator i |
| * |
| * Returns 1 for success, 0 for failure. |
| */ |
| int hostlist_remove(hostlist_iterator_t *i); |
| |
| |
| /* ----[ hostset operations ]---- */ |
| |
| /* hostset_create(): |
| * |
| * Create a new hostset object from a string representation of a list of |
| * hosts. See hostlist_create() for valid hostlist forms. |
| */ |
| hostset_t *hostset_create(const char *hostlist); |
| |
| /* hostset_destroy(): |
| */ |
| void hostset_destroy(hostset_t *set); |
| |
| /* hostset_insert(): |
| * Add a host or list of hosts into hostset "set." |
| * |
| * Returns number of hosts successfully added to "set" |
| * (insertion of a duplicate is not considered successful) |
| */ |
| int hostset_insert(hostset_t *set, const char *hosts); |
| |
| /* hostset_delete(): |
| * Delete a host or list of hosts from hostset "set." |
| * Returns number of hosts deleted from set. |
| */ |
| int hostset_delete(hostset_t *set, const char *hosts); |
| |
| /* hostset_intersects(): |
| * Return 1 if any of the hosts specified by "hosts" are within the hostset "set" |
| * Return 0 if all host in "hosts" is not in the hostset "set" |
| */ |
| int hostset_intersects(hostset_t *set, const char *hosts); |
| |
| /* hostset_within(): |
| * Return 1 if all hosts specified by "hosts" are within the hostset "set" |
| * Return 0 if every host in "hosts" is not in the hostset "set" |
| */ |
| int hostset_within(hostset_t *set, const char *hosts); |
| |
| /* hostset_shift(): |
| * hostset equivalent to hostlist_shift() |
| */ |
| char *hostset_shift(hostset_t *set); |
| |
| /* hostset_pop(): |
| * hostset equivalent to hostlist_pop() |
| */ |
| char *hostset_pop(hostset_t *set); |
| |
| /* hostset_count(): |
| * Count the number of hosts currently in hostset |
| */ |
| int hostset_count(hostset_t *set); |
| |
| /* hostset_find(): |
| * |
| * Searches hostset set for a host matching hostname |
| * and returns position in list if found. |
| * |
| * Returns -1 if host is not found. |
| */ |
| int hostset_find(hostset_t *set, const char *hostname); |
| |
| /* |
| * Return n-th element from hostset |
| * Release memory using free() |
| */ |
| char *hostset_nth(hostset_t *set, int n); |
| |
| /* hostset_ranged_string(): |
| * hostset equivalent to hostlist_ranged_string(); |
| */ |
| ssize_t hostset_ranged_string(hostset_t *set, size_t n, char *buf); |
| |
| /* |
| * hostset equivalent to hostlist_deranged_string_xmalloc() |
| * Caller must use xfree() to release memory |
| */ |
| char *hostset_deranged_string_xmalloc(hostset_t *set); |
| |
| /* |
| * hostset equivalent to hostlist_ranged_string_xmalloc() |
| * Caller must use xfree() to release memory |
| */ |
| char *hostset_ranged_string_xmalloc(hostset_t *set); |
| |
| #endif /* !_HOSTLIST_H */ |