From 5ffc0e85915c3f54e3547cfaec7349d42c212ee0 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 13 Mar 2026 23:45:12 +0530 Subject: [PATCH] SEC-9872 --- server/e2e_tests.go | 47 ++++++++++++++++++++++++++++++------------ server/push_events.go | 40 ++++++++++++----------------------- server/workflow_run.go | 42 ++++++++++--------------------------- 3 files changed, 58 insertions(+), 71 deletions(-) diff --git a/server/e2e_tests.go b/server/e2e_tests.go index bfd1f75..d6ad805 100644 --- a/server/e2e_tests.go +++ b/server/e2e_tests.go @@ -33,6 +33,34 @@ type E2EInstance struct { ServerVersion string `json:"server_version"` } +// e2eUniqueSuffix returns an 8-character hex timestamp for instance name uniqueness. +func e2eUniqueSuffix() string { + return fmt.Sprintf("%08x", time.Now().Unix()) +} + +// sanitizeForDNS lowercases and replaces non-DNS characters with hyphens. +func sanitizeForDNS(s string) string { + s = strings.ToLower(s) + s = strings.ReplaceAll(s, "_", "-") + s = strings.ReplaceAll(s, ".", "-") + s = strings.ReplaceAll(s, "/", "-") + return s +} + +// e2eInstanceName builds a DNS-safe instance name and truncates if needed. +// parts are joined with "-". The total name + dnsSuffix must be <= 62. +func e2eInstanceName(dnsSuffix string, parts ...string) string { + name := strings.Join(parts, "-") + maxLen := 62 - len(dnsSuffix) + if maxLen < 1 { + maxLen = 1 + } + if len(name) > maxLen { + name = strings.TrimRight(name[:maxLen], "-") + } + return name +} + // handleE2ETestRequest is the main orchestrator for E2E test requests func (s *Server) handleE2ETestRequest(pr *model.PullRequest, label string) { logger := s.Logger.WithFields(logrus.Fields{ @@ -149,21 +177,14 @@ func (s *Server) createMultipleE2EInstances(pr *model.PullRequest, instanceType // Get password from environment or generate one password = s.getE2EPassword(instanceType) - sanitizedRepo := strings.ToLower(pr.RepoName) - sanitizedRepo = strings.ReplaceAll(sanitizedRepo, "_", "-") - sanitizedRepo = strings.ReplaceAll(sanitizedRepo, ".", "-") + // Name format: {type}-pr-{pr}-{platform}-{hex6} + uid := e2eUniqueSuffix() for _, platform := range platforms { - suffix := fmt.Sprintf("-e2e-%d-%s", pr.Number, platform) - maxRepoLen := 63 - len(s.Config.DNSNameTestServer) - len(suffix) - if maxRepoLen < 1 { - maxRepoLen = 1 - } - repo := sanitizedRepo - if len(repo) > maxRepoLen { - repo = strings.TrimRight(repo[:maxRepoLen], "-") - } - instanceName := repo + suffix + instanceName := e2eInstanceName( + s.Config.DNSNameTestServer, + instanceType, fmt.Sprintf("pr-%d", pr.Number), platform, uid, + ) logger.WithField("instance", instanceName).Info("Creating E2E instance") diff --git a/server/push_events.go b/server/push_events.go index 85bb344..1c58484 100644 --- a/server/push_events.go +++ b/server/push_events.go @@ -153,36 +153,22 @@ func (s *Server) createMultipleE2EInstancesForPushEvent(repoName, instanceType, "platformCount": len(platforms), }) - sanitizedRepoName := strings.ToLower(repoName) - sanitizedRepoName = strings.ReplaceAll(sanitizedRepoName, "_", "-") - sanitizedRepoName = strings.ReplaceAll(sanitizedRepoName, ".", "-") + // Name format: {type}-{version}-{platform}-{hex6} + serverVersion := s.Config.E2EServerVersion + if version != "" { + serverVersion = version + } + sanitizedVersion := sanitizeForDNS(serverVersion) + uid := e2eUniqueSuffix() - sanitizedBranch := strings.ToLower(branch) - sanitizedBranch = strings.ReplaceAll(sanitizedBranch, "/", "-") - sanitizedBranch = strings.ReplaceAll(sanitizedBranch, "_", "-") - sanitizedBranch = strings.ReplaceAll(sanitizedBranch, ".", "-") + username := s.Config.E2EUsername + password := s.getE2EPassword(instanceType) for _, platform := range platforms { - suffix := fmt.Sprintf("-e2e-%s-%s", sanitizedBranch, platform) - repoPrefix := sanitizedRepoName - if maxLen := 63 - len(s.Config.DNSNameTestServer) - len(suffix); len(repoPrefix) > maxLen { - if maxLen < 1 { - maxLen = 1 - } - repoPrefix = strings.TrimRight(repoPrefix[:maxLen], "-") - } - name := repoPrefix + suffix - - // Use version if provided, otherwise use server version from config - serverVersion := s.Config.E2EServerVersion - if version != "" { - serverVersion = version - } - - username := s.Config.E2EUsername - - // Get password from config or org-level secrets - password := s.getE2EPassword(instanceType) + name := e2eInstanceName( + s.Config.DNSNameTestServer, + instanceType, sanitizedVersion, platform, uid, + ) instance, err := s.createCloudInstallation(name, serverVersion, username, password, instanceType, logger) if err != nil { diff --git a/server/workflow_run.go b/server/workflow_run.go index be41666..8cdc102 100644 --- a/server/workflow_run.go +++ b/server/workflow_run.go @@ -353,22 +353,10 @@ func (s *Server) handleCMTWithServerVersions(repoOwner, repoName, instanceType, // Unlike createCMTInstancesForVersion (which creates 3 platform-specific instances for // nightly runs), CMT only needs one server — the matrix handles parallelism. func (s *Server) createSingleCMTInstance(repoName, instanceType, version string, logger logrus.FieldLogger) (*E2EInstance, error) { - sanitizedRepoName := strings.ToLower(repoName) - sanitizedRepoName = strings.ReplaceAll(sanitizedRepoName, "_", "-") - sanitizedRepoName = strings.ReplaceAll(sanitizedRepoName, ".", "-") - - sanitizedVersion := strings.ToLower(version) - sanitizedVersion = strings.ReplaceAll(sanitizedVersion, ".", "-") - - suffix := fmt.Sprintf("-cmt-%s", sanitizedVersion) - repoPrefix := sanitizedRepoName - if maxLen := 63 - len(s.Config.DNSNameTestServer) - len(suffix); len(repoPrefix) > maxLen { - if maxLen < 1 { - maxLen = 1 - } - repoPrefix = strings.TrimRight(repoPrefix[:maxLen], "-") - } - name := repoPrefix + suffix + // Name format: {type}-{version}-{hex6} + sanitizedVersion := sanitizeForDNS(version) + uid := e2eUniqueSuffix() + name := e2eInstanceName(s.Config.DNSNameTestServer, instanceType, sanitizedVersion, uid) username := s.Config.E2EUsername password := s.getE2EPassword(instanceType) @@ -517,11 +505,9 @@ func (s *Server) createCMTInstancesForVersion(repoName, instanceType, version, p platforms = []string{"site-1", "site-2", "site-3"} } - sanitizedRepoName := strings.ToLower(repoName) - sanitizedRepoName = strings.ReplaceAll(sanitizedRepoName, "_", "-") - sanitizedRepoName = strings.ReplaceAll(sanitizedRepoName, ".", "-") - - sanitizedVersion := strings.ReplaceAll(version, ".", "-") + // Name format: {type}-{version}-{platform}-{hex6} + sanitizedVersion := sanitizeForDNS(version) + uid := e2eUniqueSuffix() logger := s.Logger.WithFields(logrus.Fields{ "repo": repoName, @@ -529,20 +515,14 @@ func (s *Server) createCMTInstancesForVersion(repoName, instanceType, version, p "version": version, }) - // Get credentials username := s.Config.E2EUsername password := s.getE2EPassword(instanceType) for _, platform := range platforms { - suffix := fmt.Sprintf("-%s-%s-%s", purpose, sanitizedVersion, platform) - repoPrefix := sanitizedRepoName - if maxLen := 63 - len(s.Config.DNSNameTestServer) - len(suffix); len(repoPrefix) > maxLen { - if maxLen < 1 { - maxLen = 1 - } - repoPrefix = strings.TrimRight(repoPrefix[:maxLen], "-") - } - name := repoPrefix + suffix + name := e2eInstanceName( + s.Config.DNSNameTestServer, + instanceType, sanitizedVersion, platform, uid, + ) instance, err := s.createCloudInstallation(name, version, username, password, instanceType, logger) if err != nil {