=head1 Name

B<noderange> - syntax for compactly expressing a list of node names

=head1 B<Synopsis>

I<Examples:>

node1,node2,node8,node20,group1

node14-node56,node70-node203,group1-group10

node1,node2,node8,node20,node14-node56,node70-node203

node[14-56]

all,-node129-node256,-frame01-frame03

/node.*

^/tmp/nodes

node10+5

10-15,-13

group1@group2

=head1 B<Description>

B<noderange> is a syntax that can be used in most xCAT commands to conve-
niently specify a list of nodes.  The result is that the  command  will
be applied to a range of nodes, often in parallel.

B<noderange>  is  a comma-separated list.  Each token (text between commas)
in the list can be any of the forms listed below:

Individual node or group:

I<node01>
I<group1>

A range of nodes or groups:

I<node01-node10> (equivalent to: node01,node02,node03,...node10)
I<group1-group3> (equivalent to: group1,group2,group3)

A regular expression match of nodes or groups:

I</node[345].*>  (will match any nodes that start with  node3,  node4,  or
node5)
I</group[12].*>  (will match any groups that start with group1 or group2)

An incremented range of nodes:

I<node10+3> (equivalent to: node10,node11,node12,node13)

The full path of a file containing noderanges of nodes or groups:

I<^/tmp/nodelist>

A node shorthand range of nodes:

I<10-20>      (if      prefix      is      `node',      equivalent     to:
node10,node11,node12,...node20)
I<10+3> (if prefix is `node', equivalent to: node10,node11,node12,node13)

Or any combination:

I<node01-node30,node40,^/tmp/nodes,/node[13].*,2-10,node50+5>

Any individual B<noderange> may be prefixed  with  an  exclusion  operator
(default -) with the exception of the file operator (default ^).

The intersection operator @ calculates the intersection of the left and
right sides:

I<group1@group2> (will result in the list of nodes group1 and group2  have
in common)

Any  combination  or  multiple  combinations of inclusive and exclusive
ranges of nodes and groups is legal.  There is no precedence implied in
the  order  of  the  arguments.   Exclusive ranges have precedence over
inclusive.

Nodes have precedence over groups.  If a node range match is made  then
no group range match will be attempted.

All node names are validated against the nodelist table.  Invalid nodes
are ignored and return nothing.

All group names are validated against the nodelist and nodetype  table.
Invalid groups are ignored and return nothing.

Throughout this man page the term I<xCAT> I<Node> I<Format> will be used.

I<xCAT> I<Node> I<Format> is defined by the following regex:

^([A-Za-z-]+)([0-9]+)(([A-Za-z-]+[A-Za-z0-9-]*)*)

In  plain  english  a  node or group is in I<xCAT> I<Node> I<Format> if starting
from the begining there are one or more alpha characters  of  any  case
and  any  number  of - in any combination, followed by one or more num-
bers, then optionally followed by one alpha character of  any  case  or
the  -  followed by any combination of case mixed alphanumerics and the
-.

B<noderange> supports node/group names in I<any> format.  I<xCAT> I<Node> I<Format> is
B<not>  required,  however some node range methods used to determine range
will not be used.  E.g. If using a B<noderange> of  I<node1a-node9a>  with  a
B<nodelist>  table only listing I<node1a> through I<node5a>, B<noderange> will enu-
merate then validate and return a proper range.  If using a node  range
of  I<aa-az>  with  a B<nodelist> table only listing I<aa> through I<ay,> B<noderange>
will fail to return any values.

Example of I<xCAT> I<Node> I<Format> node/group names:

B< nodename			prefix	number	suffix>
 node1			node		1
 node001			node		001
 node-001			node-	001
 node-foo-001-bar	node-foo-	001		-bar
 node-foo-1bar		node-foo-	1		bar
 foo1bar2			foo		1		bar2
 rack01unit34		rack		01		unit34
 unit34rack01		unit		34		rack01
 pos0134			pos		0134

Example of non-I<xCAT> I<Node> I<Format> node/group names, but still valid:

aa
yellow
red
12foo


The supported B<noderange> syntaxes are checked for, and processed,  in  a
specific order.  First B<noderange> checks for the multiple range operator
(default ,).  Each range is also processed by B<noderange>.

Next B<noderange> checks for the file operator (default ^).  If  the  file
exists  (must  be  a  full  path name) each line will be processed as a
B<noderange>.  Lines starting with I<#> or the file operator (default ^)  are
ignored.   Only  one  B<noderange>  per  line is read.  All characters are
ignored after the first white space.

e.g.

^/tmp/nodes

where

cat /tmp/nodes outputs:

 #my node list (this line ignored)
 ^/tmp/foo #ignored
 node01    #node comment
 node02
 node03
 node10-node20
 /group[456].*
 -node50

Next B<noderange> checks for the exclusion operator (default -) then  con-
tinues.   This  operator supports nodes and groups.  B<noderange> will not
confuse the exclusion or range operators with the - character in names.

Next  B<noderange>  checks  for  a numeric only range (e.g. 10-20, 5+3, or
just  10),  then  uses  I<$XCAT>B<_>I<NODE>B<_>I<PREFIX>  (default  is   `node')   and
I<$XCAT>B<_>I<NODE>B<_>I<SUFFIX>  (optional)  as  the  defaults  to  complete the node
names.  B<nodeRange> tries to be intelligent about detecting  padding,  so
you  can specify `node001-node200' and it will add the proper number of
zeroes to make all numbers  3  digits.   Noderange  shorthand  supports
nodes  only.  Noderange shorthand can be mixed with all other operators
except regex.  i.e.  exclusion, increment, range, and file may be used.

Next  B<noderange>  checks  for  the  for  the regular expression operator
(default /).  Regular expressions offer the most flexibility.   If  you
are  interested  in  learning  regex  read  the  book I<Mastering> I<Regular>
I<Expressions>.  This operator supports nodes and groups.

Next B<noderange> checks for the increment  range  operator  (default  +).
Increment range operator noderanges are in the format:

I<valid>B<_>I<node>B<_>I<name>B<+>I<number>B<_>I<of>B<_>I<sequential>B<_>I<nodes>

e.g.

I<node10+5>

would yield node10 plus the next I<5> nodes.

This   action   is   performed   using   two   different  methods.   If
I<valid>B<_>I<node>B<_>I<name> is in I<xCAT> I<Node> I<Format> then the range is enumerated  to
I<number>B<_>I<of>B<_>I<sequential>B<_>I<nodes>.   If  not in I<xCAT> I<Node> I<Format> then a sorted
B<nodelist> table is used to return the node range.   This  operator  sup-
ports nodes only.

Next B<noderange> checks for a single node name or group name.

Next  B<noderange>  checks for the range operator (default -).  Ranges are
performed first by validating that both the  start  and  end  nodes  or
groups  defining  the range exist and if so the range is returned based
on the content of the B<nodelist> and B<nodetype> tables.  If the  start  and
end  nodes or groups defined in the range do not exist, I<and> if both are
in I<xCAT> I<Node> I<Format>, I<and> if both the prefix and suffix match, then  the
range   is  enumerated  and  each  node/group  validated.   Only  valid
nodes/groups will be returned.  B<noderange> will not confuse  the  exclu-
sion or range operators with the - character in names.

Last B<noderange> returns nothing if no match can be found.

B<noderange>  uses  the  smallest  integer  to  determine  padding.   e.g.
I<node1-node10> will generate a list of nodes with numbers 1, 2, 3, 4,  5,
6,  7,  8,  9,  10.  I<node001-node010> will generate a list of nodes with
numbers 001, 002, 003, 004, 005, 006, 007, 008, 009, 010.

Multiple instances of a node name are treated as  one  instance.   e.g.
I<node1-node10,node4,node4,node4> will generate a list of nodes numbered 1
through 10, the number 4 will only be listed once.

=head1 B<Examples>

I<all,-node5-node10>

Generates a list of all nodes (assuming all is a group) listed  in  the
B<nodelist> table less node5 through node10.

I<node1-node10,-node3-node5,node4>

Generates  a  list  of  nodes 1 through 10 less nodes 3,4,5.  Note that
node4 is listed twice, first in the range and then at the end.  Because
exclusion has precedence node4 will be excluded.

I<node1-node10,-node3,-node5>

Generates a list of nodes 1 through 10 less nodes 3 and 5.

I<-node17-node32,all>

Generates  a  list  of  all  (assuming  `all'  is a group) nodes in the
B<nodelist> table less 17 through 32.

I<node1-node128,user1-user4>

Generates a list of nodes 1 through 128, and user nodes 1 through 4.

I<all,-rack1-rack3,-node100-node200,node150,-storage>

Generates a list of all nodes (assuming `all' is a group),  less  nodes
in  groups rack1 through rack3 (assuming groups rack1, rack2, and rack3
are defined), less nodes 100 through 200, less  nodes  in  the  storage
group.  Note that node150 is listed but is excluded.

I</node[23].*>

Generates  a  list of nodes matching the regex I<node[23].*>.  That is all
nodes that start with node2 or node3 and end in  anything  or  nothing.
E.g. node2, node3, node20, node30, node21234 all match.

=head1 B<SEE ALSO>

nodels(1)
