diff --git a/pkg/hostlist/hostlist.go b/pkg/hostlist/hostlist.go deleted file mode 100644 index 6ed5ae0..0000000 --- a/pkg/hostlist/hostlist.go +++ /dev/null @@ -1,125 +0,0 @@ -package hostlist - -import ( - "fmt" - "regexp" - "sort" - "strconv" - "strings" -) - -func Expand(in string) (result []string, err error) { - - // Create ranges regular expression - reStNumber := "[[:digit:]]+" - reStRange := reStNumber + "-" + reStNumber - reStOptionalNumberOrRange := "(" + reStNumber + ",|" + reStRange + ",)*" - reStNumberOrRange := "(" + reStNumber + "|" + reStRange + ")" - reStBraceLeft := "[[]" - reStBraceRight := "[]]" - reStRanges := reStBraceLeft + - reStOptionalNumberOrRange + - reStNumberOrRange + - reStBraceRight - reRanges := regexp.MustCompile(reStRanges) - - // Create host list regular expression - reStDNSChars := "[a-zA-Z0-9-]+" - reStPrefix := "^(" + reStDNSChars + ")" - reStOptionalSuffix := "(" + reStDNSChars + ")?" - re := regexp.MustCompile(reStPrefix + "([[][0-9,-]+[]])?" + reStOptionalSuffix) - - // Remove all delimiters from the input - in = strings.TrimLeft(in, ", ") - - for len(in) > 0 { - if v := re.FindStringSubmatch(in); v != nil { - - // Remove matched part from the input - lenPrefix := len(v[0]) - in = in[lenPrefix:] - - // Remove all delimiters from the input - in = strings.TrimLeft(in, ", ") - - // matched prefix, range and suffix - hlPrefix := v[1] - hlRanges := v[2] - hlSuffix := v[3] - - // Single node without ranges - if hlRanges == "" { - result = append(result, hlPrefix) - continue - } - - // Node with ranges - if v := reRanges.FindStringSubmatch(hlRanges); v != nil { - - // Remove braces - hlRanges = hlRanges[1 : len(hlRanges)-1] - - // Split host ranges at , - for _, hlRange := range strings.Split(hlRanges, ",") { - - // Split host range at - - RangeStartEnd := strings.Split(hlRange, "-") - - // Range is only a single number - if len(RangeStartEnd) == 1 { - result = append(result, hlPrefix+RangeStartEnd[0]+hlSuffix) - continue - } - - // Range has a start and an end - widthRangeStart := len(RangeStartEnd[0]) - widthRangeEnd := len(RangeStartEnd[1]) - iStart, _ := strconv.ParseUint(RangeStartEnd[0], 10, 64) - iEnd, _ := strconv.ParseUint(RangeStartEnd[1], 10, 64) - if iStart > iEnd { - return nil, fmt.Errorf("single range start is greater than end: %s", hlRange) - } - - // Create print format string for range numbers - doPadding := widthRangeStart == widthRangeEnd - widthPadding := widthRangeStart - var formatString string - if doPadding { - formatString = "%0" + fmt.Sprint(widthPadding) + "d" - } else { - formatString = "%d" - } - formatString = hlPrefix + formatString + hlSuffix - - // Add nodes from this range - for i := iStart; i <= iEnd; i++ { - result = append(result, fmt.Sprintf(formatString, i)) - } - } - } else { - return nil, fmt.Errorf("not at hostlist range: %s", hlRanges) - } - } else { - return nil, fmt.Errorf("not a hostlist: %s", in) - } - } - - if result != nil { - // sort - sort.Strings(result) - - // uniq - previous := 1 - for current := 1; current < len(result); current++ { - if result[current-1] != result[current] { - if previous != current { - result[previous] = result[current] - } - previous++ - } - } - result = result[:previous] - } - - return -} diff --git a/pkg/hostlist/hostlist_test.go b/pkg/hostlist/hostlist_test.go deleted file mode 100644 index d5c57ad..0000000 --- a/pkg/hostlist/hostlist_test.go +++ /dev/null @@ -1,126 +0,0 @@ -package hostlist - -import ( - "testing" -) - -func TestExpand(t *testing.T) { - - // Compare two slices of strings - equal := func(a, b []string) bool { - if len(a) != len(b) { - return false - } - for i, v := range a { - if v != b[i] { - return false - } - } - return true - } - - type testDefinition struct { - input string - resultExpected []string - errorExpected bool - } - - expandTests := []testDefinition{ - { - // Single node - input: "n1", - resultExpected: []string{"n1"}, - errorExpected: false, - }, - { - // Single node, duplicated - input: "n1,n1", - resultExpected: []string{"n1"}, - errorExpected: false, - }, - { - // Single node with padding - input: "n[01]", - resultExpected: []string{"n01"}, - errorExpected: false, - }, - { - // Single node with suffix - input: "n[01]-p", - resultExpected: []string{"n01-p"}, - errorExpected: false, - }, - { - // Multiple nodes with a single range - input: "n[1-2]", - resultExpected: []string{"n1", "n2"}, - errorExpected: false, - }, - { - // Multiple nodes with a single range and a single index - input: "n[1-2,3]", - resultExpected: []string{"n1", "n2", "n3"}, - errorExpected: false, - }, - { - // Multiple nodes with different prefixes - input: "n[1-2],m[1,2]", - resultExpected: []string{"m1", "m2", "n1", "n2"}, - errorExpected: false, - }, - { - // Multiple nodes with different suffixes - input: "n[1-2]-p,n[1,2]-q", - resultExpected: []string{"n1-p", "n1-q", "n2-p", "n2-q"}, - errorExpected: false, - }, - { - // Multiple nodes with and without node ranges - input: " n09, n[01-04,06-07,09] , , n10,n04", - resultExpected: []string{"n01", "n02", "n03", "n04", "n06", "n07", "n09", "n10"}, - errorExpected: false, - }, - { - // Forbidden DNS character - input: "n@", - resultExpected: []string{}, - errorExpected: true, - }, - { - // Forbidden range - input: "n[1-2-2,3]", - resultExpected: []string{}, - errorExpected: true, - }, - { - // Forbidden range limits - input: "n[2-1]", - resultExpected: []string{}, - errorExpected: true, - }, - } - - for _, expandTest := range expandTests { - result, err := Expand(expandTest.input) - - hasError := err != nil - if hasError != expandTest.errorExpected && hasError { - t.Errorf("Expand('%s') failed: unexpected error '%v'", - expandTest.input, err) - continue - } - if hasError != expandTest.errorExpected && !hasError { - t.Errorf("Expand('%s') did not fail as expected: got result '%+v'", - expandTest.input, result) - continue - } - if !hasError && !equal(result, expandTest.resultExpected) { - t.Errorf("Expand('%s') failed: got result '%+v', expected result '%v'", - expandTest.input, result, expandTest.resultExpected) - continue - } - - t.Logf("Checked hostlist.Expand('%s'): result = '%+v', err = '%v'", - expandTest.input, result, err) - } -}