mirror of
https://github.com/portainer/portainer.git
synced 2026-06-23 06:20:12 +00:00
106 lines
2.7 KiB
Go
106 lines
2.7 KiB
Go
package libkubectl
|
|
|
|
import (
|
|
"os"
|
|
"runtime"
|
|
"testing"
|
|
|
|
"github.com/portainer/portainer/api/filesystem"
|
|
)
|
|
|
|
// BenchmarkApply tests require a Kubernetes cluster.
|
|
// BenchmarkApply measures the performance and memory allocation of the Apply function
|
|
func BenchmarkApply(b *testing.B) {
|
|
kubeconfig := skipIfNoKubeconfig(b)
|
|
|
|
client, err := NewClient(&ClientAccess{}, "default", kubeconfig, false)
|
|
if err != nil {
|
|
b.Fatalf("Failed to create client: %v", err)
|
|
}
|
|
|
|
// Apply expects file paths, so create a temp file
|
|
tmpDir := b.TempDir()
|
|
manifestFile := filesystem.JoinPaths(tmpDir, "manifest.yaml")
|
|
manifestContent := `apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: benchmark-test-config
|
|
namespace: default
|
|
data:
|
|
key: value`
|
|
|
|
if err := os.WriteFile(manifestFile, []byte(manifestContent), 0644); err != nil {
|
|
b.Fatalf("Failed to create manifest file: %v", err)
|
|
}
|
|
|
|
manifests := []string{manifestFile}
|
|
|
|
// Force GC and measure memory before benchmark
|
|
runtime.GC()
|
|
var memBefore runtime.MemStats
|
|
runtime.ReadMemStats(&memBefore)
|
|
|
|
for b.Loop() {
|
|
_, err := client.Apply(b.Context(), manifests)
|
|
if err != nil {
|
|
b.Errorf("Failed to apply manifests: %v", err)
|
|
}
|
|
}
|
|
|
|
// Force GC and measure memory after benchmark
|
|
runtime.GC()
|
|
var memAfter runtime.MemStats
|
|
runtime.ReadMemStats(&memAfter)
|
|
|
|
// Report retained memory (key metric for leak detection)
|
|
retained := int64(memAfter.Alloc) - int64(memBefore.Alloc)
|
|
retainedMB := float64(retained) / 1024 / 1024
|
|
b.ReportMetric(float64(retained), "B-retained")
|
|
b.ReportMetric(retainedMB, "MB-retained")
|
|
}
|
|
|
|
// BenchmarkApplyDynamic tests require a Kubernetes cluster.
|
|
// BenchmarkApplyDynamic measures the performance and memory allocation of the ApplyDynamic function
|
|
func BenchmarkApplyDynamic(b *testing.B) {
|
|
kubeconfig := skipIfNoKubeconfig(b)
|
|
client, err := NewClient(&ClientAccess{}, "default", kubeconfig, false)
|
|
if err != nil {
|
|
b.Fatalf("Failed to create client: %v", err)
|
|
}
|
|
|
|
manifests := []string{
|
|
`apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: benchmark-test-config
|
|
namespace: default
|
|
data:
|
|
key: value`,
|
|
}
|
|
|
|
ctx := b.Context()
|
|
|
|
// Force GC and measure memory before benchmark
|
|
runtime.GC()
|
|
var memBefore runtime.MemStats
|
|
runtime.ReadMemStats(&memBefore)
|
|
|
|
for b.Loop() {
|
|
_, err := client.ApplyDynamic(ctx, manifests)
|
|
if err != nil {
|
|
b.Errorf("Failed to apply dynamic manifests: %v", err)
|
|
}
|
|
}
|
|
|
|
// Force GC and measure memory after benchmark
|
|
runtime.GC()
|
|
var memAfter runtime.MemStats
|
|
runtime.ReadMemStats(&memAfter)
|
|
|
|
// Report retained memory (key metric for leak detection)
|
|
retained := int64(memAfter.Alloc) - int64(memBefore.Alloc)
|
|
retainedMB := float64(retained) / 1024 / 1024
|
|
b.ReportMetric(float64(retained), "B-retained")
|
|
b.ReportMetric(retainedMB, "MB-retained")
|
|
}
|