From 221e3023f6ebb26b6f34bb419a21b6e1612cd82f Mon Sep 17 00:00:00 2001 From: Chris Evich Date: Tue, 25 Apr 2023 10:49:47 -0400 Subject: [PATCH] Fix rand.Seed() deprecation in golang 1.20 Ref: https://pkg.go.dev/math/rand@go1.20#Seed Note: For `runtime_test.go`, this test-case was never actually doing what appears as it's intent . Fixing it to work as intended would be require incredibly libpod-invasive changes. Do the least-worse thing and simply confirm that consecutive generated names are different. Signed-off-by: Chris Evich --- libpod/runtime.go | 8 -------- libpod/runtime_pre_go1.20.go | 18 ++++++++++++++++++ libpod/runtime_test.go | 5 +---- test/e2e/common_test.go | 6 +++--- 4 files changed, 22 insertions(+), 15 deletions(-) create mode 100644 libpod/runtime_pre_go1.20.go diff --git a/libpod/runtime.go b/libpod/runtime.go index 83c5a1eba1..98956a5e16 100644 --- a/libpod/runtime.go +++ b/libpod/runtime.go @@ -5,7 +5,6 @@ import ( "context" "errors" "fmt" - "math/rand" "os" "path/filepath" "strings" @@ -118,13 +117,6 @@ type Runtime struct { secretsManager *secrets.SecretsManager } -func init() { - // generateName calls namesgenerator.GetRandomName which the - // global RNG from math/rand. Seed it here to make sure we - // don't get the same name every time. - rand.Seed(time.Now().UnixNano()) -} - // SetXdgDirs ensures the XDG_RUNTIME_DIR env and XDG_CONFIG_HOME variables are set. // containers/image uses XDG_RUNTIME_DIR to locate the auth file, XDG_CONFIG_HOME is // use for the containers.conf configuration file. diff --git a/libpod/runtime_pre_go1.20.go b/libpod/runtime_pre_go1.20.go new file mode 100644 index 0000000000..1c73043de4 --- /dev/null +++ b/libpod/runtime_pre_go1.20.go @@ -0,0 +1,18 @@ +// In go 1.20 and later, the global RNG is automatically initialized. +// Ref: https://pkg.go.dev/math/rand@go1.20#Seed +//go:build !go1.20 +// +build !go1.20 + +package libpod + +import ( + "math/rand" + "time" +) + +func init() { + // generateName calls namesgenerator.GetRandomName which the + // global RNG from math/rand. Seed it here to make sure we + // don't get the same name every time. + rand.Seed(time.Now().UnixNano()) +} diff --git a/libpod/runtime_test.go b/libpod/runtime_test.go index 2e16c7fcd3..7468d34938 100644 --- a/libpod/runtime_test.go +++ b/libpod/runtime_test.go @@ -1,7 +1,6 @@ package libpod import ( - "math/rand" "os" "testing" @@ -19,10 +18,8 @@ func Test_generateName(t *testing.T) { } // Test that (*Runtime).generateName returns different names - // if called twice, even if the global RNG has the default - // seed. + // if called twice. n1, _ := r.generateName() - rand.Seed(1) n2, _ := r.generateName() assert.NotEqual(t, n1, n2) } diff --git a/test/e2e/common_test.go b/test/e2e/common_test.go index 82d6bce297..946b973b27 100644 --- a/test/e2e/common_test.go +++ b/test/e2e/common_test.go @@ -430,11 +430,11 @@ func GetPortLock(port string) *lockfile.LockFile { // collisions during parallel tests func GetRandomIPAddress() string { // To avoid IP collisions of initialize random seed for random IP addresses - rand.Seed(time.Now().UnixNano()) + rng := rand.New(rand.NewSource(time.Now().UnixNano())) // Add GinkgoParallelProcess() on top of the IP address // in case of the same random seed - ip3 := strconv.Itoa(rand.Intn(230) + GinkgoParallelProcess()) - ip4 := strconv.Itoa(rand.Intn(230) + GinkgoParallelProcess()) + ip3 := strconv.Itoa(rng.Intn(230) + GinkgoParallelProcess()) + ip4 := strconv.Itoa(rng.Intn(230) + GinkgoParallelProcess()) return "10.88." + ip3 + "." + ip4 }