From facc009ca070085bb1c32f146f77c2a0a62090b0 Mon Sep 17 00:00:00 2001
From: Valentin Rothberg <vrothberg@redhat.com>
Date: Tue, 26 Apr 2022 13:31:10 +0200
Subject: benchmarks: add more image benchmarks

Add more benchmarks for the most common and performance-critical image
commands.  Benchmarks for `podman build` should go into a separate
section.

Signed-off-by: Valentin Rothberg <vrothberg@redhat.com>
---
 test/e2e/benchmarks_test.go | 79 ++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 74 insertions(+), 5 deletions(-)

(limited to 'test')

diff --git a/test/e2e/benchmarks_test.go b/test/e2e/benchmarks_test.go
index c631b06ee..9653cee3b 100644
--- a/test/e2e/benchmarks_test.go
+++ b/test/e2e/benchmarks_test.go
@@ -11,10 +11,12 @@ import (
 	"strconv"
 	"strings"
 
+	podmanRegistry "github.com/containers/podman/v4/hack/podman-registry-go"
 	. "github.com/containers/podman/v4/test/utils"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
 	. "github.com/onsi/gomega/gexec"
+	"github.com/sirupsen/logrus"
 )
 
 var (
@@ -30,21 +32,23 @@ type benchmark struct {
 	name string
 	// The function to execute.
 	main func()
-	// Function is run before `main`.
-	init func()
+	// Allows for extending a benchmark.
+	options newBenchmarkOptions
 }
 
 // Allows for customizing the benchnmark in an easy to extend way.
 type newBenchmarkOptions struct {
 	// Sets the benchmark's init function.
 	init func()
+	// Run a local registry for this benchmark.
+	needsRegistry bool
 }
 
 // Queue a new benchmark.
 func newBenchmark(name string, main func(), options *newBenchmarkOptions) {
 	bm := benchmark{name: name, main: main}
 	if options != nil {
-		bm.init = options.init
+		bm.options = *options
 	}
 	allBenchmarks = append(allBenchmarks, bm)
 }
@@ -109,8 +113,23 @@ var _ = Describe("Podman Benchmark Suite", func() {
 		for i := range allBenchmarks {
 			setup()
 			bm := allBenchmarks[i]
-			if bm.init != nil {
-				bm.init()
+
+			// Start a local registry if requested.
+			var registry *podmanRegistry.Registry
+			if bm.options.needsRegistry {
+				reg, err := podmanRegistry.Start()
+				if err != nil {
+					logrus.Errorf("Error starting registry: %v", err)
+					os.Exit(1)
+				}
+				registry = reg
+				os.Setenv(podmanRegistry.UserKey, reg.User)
+				os.Setenv(podmanRegistry.PassKey, reg.Password)
+				os.Setenv(podmanRegistry.PortKey, reg.Port)
+			}
+
+			if bm.options.init != nil {
+				bm.options.init()
 			}
 
 			// Set the time dir only for the main() function.
@@ -120,6 +139,18 @@ var _ = Describe("Podman Benchmark Suite", func() {
 
 			mem := totalMemoryInKb()
 			b.RecordValueWithPrecision("[MEM] "+bm.name, float64(mem), "KB", 1)
+
+			// Stop the local registry.
+			if bm.options.needsRegistry {
+				os.Unsetenv(podmanRegistry.UserKey)
+				os.Unsetenv(podmanRegistry.PassKey)
+				os.Unsetenv(podmanRegistry.PortKey)
+				if err := registry.Stop(); err != nil {
+					logrus.Errorf("Error stopping registry: %v", err)
+					os.Exit(1)
+				}
+			}
+
 			cleanup()
 		}
 	}, numBenchmarkSamples)
@@ -142,6 +173,44 @@ var _ = Describe("Podman Benchmark Suite", func() {
 			Expect(session).Should(Exit(0))
 		}, nil)
 
+		newBenchmark("podman load [docker]", func() {
+			session := podmanTest.Podman([]string{"load", "-i", "./testdata/docker-two-images.tar.xz"})
+			session.WaitWithDefaultTimeout()
+			Expect(session).Should(Exit(0))
+		}, nil)
+
+		newBenchmark("podman load [oci]", func() {
+			session := podmanTest.Podman([]string{"load", "-i", "./testdata/oci-registry-name.tar.gz"})
+			session.WaitWithDefaultTimeout()
+			Expect(session).Should(Exit(0))
+		}, nil)
+
+		newBenchmark("podman save", func() {
+			session := podmanTest.Podman([]string{"save", ALPINE, "-o", path.Join(podmanTest.TempDir, "alpine.tar")})
+			session.WaitWithDefaultTimeout()
+			Expect(session).Should(Exit(0))
+		}, nil)
+
+		newBenchmark("podman image inspect", func() {
+			session := podmanTest.Podman([]string{"inspect", ALPINE})
+			session.WaitWithDefaultTimeout()
+			Expect(session).Should(Exit(0))
+		}, nil)
+
+		newBenchmark("podman login + logout", func() {
+			user := os.Getenv(podmanRegistry.UserKey)
+			pass := os.Getenv(podmanRegistry.PassKey)
+			port := os.Getenv(podmanRegistry.PortKey)
+
+			session := podmanTest.Podman([]string{"login", "-u", user, "-p", pass, "--tls-verify=false", "localhost:" + port})
+			session.WaitWithDefaultTimeout()
+			Expect(session).Should(Exit(0))
+
+			session = podmanTest.Podman([]string{"logout", "localhost:" + port})
+			session.WaitWithDefaultTimeout()
+			Expect(session).Should(Exit(0))
+		}, &newBenchmarkOptions{needsRegistry: true})
+
 		// --------------------------------------------------------------------------
 		// CONTAINER BENCHMARKS
 		// --------------------------------------------------------------------------
-- 
cgit v1.2.3-54-g00ecf