29/Hostlist Format

This specification describes a compact form for expressing a list of hostnames which contain an optional numerical part.

Name

github.com/flux-framework/rfc/spec_29.rst

Editor

Mark A. Grondona <mgrondona@llnl.gov>

State

raw

Language

The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119.

Background

The hostlist is a somewhat well known format supported by existing HPC tools such as pdsh, powerman, and genders. The format is designed as a convenience on systems where hostnames are assigned with a common prefix, a numeric part, and an optional suffix. The result is a compact way to represent a possibly large list of hosts by name, e.g. prefix[0-1024].

This RFC details the Flux implementation of the hostlist format.

Implementation

A hostlist SHALL represent an ordered list of strings.

A hostlist string SHALL be a list of comma separated hostlist expressions.

A hostlist expression SHALL be a string of the form prefix[idlist]suffix, where all components prefix, [idlist], and suffix are OPTIONAL.

An empty hostlist expression, "", SHALL represent an empty list.

The prefix and suffix components of a hostlist expression SHALL consist of any printable, non-whitespace ASCII character besides the special characters including square brackets: “[ ]”, and comma: “,”.

An idlist SHALL represent an ordered list of non-negative integer ids.

An idlist MAY be a simple comma-separated list, e.g. 5,4,10,11,12,13.

Consecutive ids in an idlist MAY be compressed into hyphenated ranges, e.g. 5,4,11-13.

Leading zeros in the first element of an idlist SHALL be preserved across all ids in the list, e.g. 005,4,11-13 represents the list 005,004,011,012,013.

An idlist MAY contain repeated numbers, e.g. 2,2,2 is a valid list.

Within a hostlist expression, an idlist SHALL be enclosed in square brackets, e.g. host[0-10,12].

Test Vectors

  • "" = ""

  • "foox,fooy,fooz" = "foox,fooy,fooz"

  • "[1-3,5-6]" = "1,2,3,5,6"

  • "foo[1-5]" = "foo1,foo2,foo3,foo4,foo5"

  • "foo[0-4]-eth2" = "foo0-eth2,foo1-eth2,foo2-eth2,foo3-eth2,foo4-eth2"

  • "foo1,foo1,foo1" = "foo1,foo1,foo1"

  • "[00-02]" = "00,01,02"

  • "[00-2]" = "00,01,02"

  • "foo[1,1,2,1]" = "foo1,foo1,foo2,foo1"