Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 24 additions & 3 deletions pkg/asset/installconfig/clusterid.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@ package installconfig

import (
"fmt"
"os"
"regexp"
"strings"

"github.com/pborman/uuid"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
utilrand "k8s.io/apimachinery/pkg/util/rand"

"github.com/openshift/installer/pkg/asset"
Expand Down Expand Up @@ -44,7 +47,11 @@ func (a *ClusterID) Generate(dep asset.Parents) error {
maxLen := 27

// add random chars to the end to randomize
a.InfraID = generateInfraID(ica.Config.ObjectMeta.Name, maxLen)
infraID, err := generateInfraID(ica.Config.ObjectMeta.Name, maxLen)
if err != nil {
return err
}
a.InfraID = infraID
a.UUID = uuid.New()
return nil
}
Expand All @@ -57,8 +64,9 @@ func (a *ClusterID) Name() string {
// generateInfraID take base and returns a ID that
// - is of length maxLen
// - only contains `alphanum` or `-`
func generateInfraID(base string, maxLen int) string {
func generateInfraID(base string, maxLen int) (string, error) {
maxBaseLen := maxLen - (randomLen + 1)
random := utilrand.String(randomLen)

// replace all characters that are not `alphanum` or `-` with `-`
re := regexp.MustCompile("[^A-Za-z0-9-]")
Expand All @@ -74,6 +82,19 @@ func generateInfraID(base string, maxLen int) string {
}
base = strings.TrimRight(base, "-")

// Use the value provided by the "OPENSHIFT_INSTALL_INFRA_ID_OVERRIDE" environment variable
// as the random part if it contains a string with 5 ('randomLen') lowercase characters and no vowels.
// This will match the possible values currently generated by 'utilrand.String(randomLen)'
if envInfraID, ok := os.LookupEnv("OPENSHIFT_INSTALL_INFRA_ID_OVERRIDE"); ok && envInfraID != "" {
logrus.Warn("Found override for 'InfraID'. Please be warned, this is not advised")
validInfraIDPattern := fmt.Sprintf("^([b-df-hj-np-tv-z0-9]){%d}$", randomLen)
validInfraIDRegex := regexp.MustCompile(validInfraIDPattern)
if !validInfraIDRegex.MatchString(envInfraID) {
return "", errors.Errorf("Invalid 'OPENSHIFT_INSTALL_INFRA_ID_OVERRIDE': '%s'", envInfraID)
}
random = envInfraID
}

// add random chars to the end to randomize
return fmt.Sprintf("%s-%s", base, utilrand.String(randomLen))
return fmt.Sprintf("%s-%s", base, random), nil
}
44 changes: 38 additions & 6 deletions pkg/asset/installconfig/clusterid_test.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
package installconfig

import (
"fmt"
"os"
"regexp"
"testing"

"github.com/stretchr/testify/assert"
)

func Test_generateInfraID(t *testing.T) {
tests := []struct {
input string

input string
envInfraID string
expLen int
expNonRand string
}{{
Expand All @@ -31,10 +34,39 @@ func Test_generateInfraID(t *testing.T) {
}}
for _, test := range tests {
t.Run("", func(t *testing.T) {
got := generateInfraID(test.input, 27)
t.Log("InfraID", got)
assert.Equal(t, test.expLen, len(got))
assert.Equal(t, test.expNonRand, got[:len(got)-randomLen-1])
for _, expRand := range []string{"", "xxxx", "xxxxx", "xxxxa", "xxXxx", "xxxxxx"} {
envInfraID := ""
if expRand != "" {
envInfraID = fmt.Sprintf("%s", expRand)
}
os.Setenv("OPENSHIFT_INSTALL_INFRA_ID_OVERRIDE", envInfraID)
t.Log("OPENSHIFT_INSTALL_INFRA_ID_OVERRIDE", envInfraID)

got, err := generateInfraID(test.input, 27)
t.Log("InfraID", got)

randomIDPattern := fmt.Sprintf("^([b-df-hj-np-tv-z0-9]){%d}$", randomLen)
randomIDRegexp := regexp.MustCompile(randomIDPattern)

// Invalid "OPENSHIFT_INSTALL_INFRA_ID_OVERRIDE" configured
if envInfraID != "" && !randomIDRegexp.MatchString(envInfraID) {
assert.Error(t, err, "Invalid 'OPENSHIFT_INSTALL_INFRA_ID_OVERRIDE': '%s'", envInfraID)
} else {
infraIDPattern := fmt.Sprintf("^%s-([b-df-hj-np-tv-z0-9]){%d}$", test.expNonRand, randomLen)
infraIDRegexp := regexp.MustCompile(infraIDPattern)
// No "OPENSHIFT_INSTALL_INFRA_ID_OVERRIDE" env var configured (normal flow)
if envInfraID == "" {
assert.Regexp(t, infraIDRegexp, got)
}
// Valid "OPENSHIFT_INSTALL_INFRA_ID_OVERRIDE" configured
if infraIDRegexp.MatchString(envInfraID) {
assert.Equal(t, test.expNonRand+"-"+envInfraID, got)

}
assert.Equal(t, test.expLen, len(got))
assert.Equal(t, test.expNonRand, got[:len(got)-randomLen-1])
}
}
})
}
}