github.com/kubeshop/testkube@v1.17.23/contrib/executor/jmeterd/pkg/slaves/utils.go (about) 1 package slaves 2 3 import ( 4 "context" 5 "fmt" 6 "strconv" 7 8 "github.com/pkg/errors" 9 10 v1 "k8s.io/api/core/v1" 11 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 12 "k8s.io/apimachinery/pkg/util/wait" 13 "k8s.io/client-go/kubernetes" 14 15 "github.com/kubeshop/testkube/pkg/api/v1/testkube" 16 ) 17 18 const ( 19 defaultSlavesCount = 0 20 serverPort = 1099 21 localPort = 60001 22 ) 23 24 func getSlaveRunnerEnv(envs map[string]string, runnerExecution testkube.Execution) []v1.EnvVar { 25 var gitEnvs []v1.EnvVar 26 if runnerExecution.Content.Type_ == "git" && runnerExecution.Content.Repository.UsernameSecret != nil && runnerExecution.Content.Repository.TokenSecret != nil { 27 gitEnvs = append(gitEnvs, v1.EnvVar{ 28 Name: "RUNNER_GITUSERNAME", 29 ValueFrom: &v1.EnvVarSource{ 30 SecretKeyRef: &v1.SecretKeySelector{ 31 LocalObjectReference: v1.LocalObjectReference{ 32 Name: runnerExecution.Content.Repository.UsernameSecret.Name, 33 }, 34 Key: runnerExecution.Content.Repository.UsernameSecret.Key, 35 }, 36 }, 37 }, v1.EnvVar{ 38 Name: "RUNNER_GITTOKEN", 39 ValueFrom: &v1.EnvVarSource{ 40 SecretKeyRef: &v1.SecretKeySelector{ 41 LocalObjectReference: v1.LocalObjectReference{ 42 Name: runnerExecution.Content.Repository.TokenSecret.Name, 43 }, 44 Key: runnerExecution.Content.Repository.TokenSecret.Key, 45 }, 46 }, 47 }, 48 ) 49 } 50 51 var runnerEnvVars []v1.EnvVar 52 for key, value := range envs { 53 runnerEnvVars = append(runnerEnvVars, v1.EnvVar{Name: key, Value: value}) 54 } 55 56 return append(runnerEnvVars, gitEnvs...) 57 } 58 59 func getSlaveConfigurationEnv(slaveEnv map[string]testkube.Variable, slavesPodNumber int) []v1.EnvVar { 60 var envVars []v1.EnvVar 61 for envKey, t := range slaveEnv { 62 envVars = append(envVars, v1.EnvVar{Name: envKey, Value: t.Value}) 63 } 64 65 envVars = append(envVars, v1.EnvVar{Name: "SLAVE_POD_NUMBER", Value: strconv.Itoa(slavesPodNumber)}) 66 return envVars 67 } 68 69 func isPodReady(c kubernetes.Interface, podName, namespace string) wait.ConditionWithContextFunc { 70 return func(ctx context.Context) (bool, error) { 71 pod, err := c.CoreV1().Pods(namespace).Get(ctx, podName, metav1.GetOptions{}) 72 if err != nil { 73 return false, err 74 } 75 76 for _, condition := range pod.Status.Conditions { 77 isReadyType := condition.Type == v1.PodReady 78 isConditionTrue := condition.Status == v1.ConditionTrue 79 isRunningPhase := pod.Status.Phase == v1.PodRunning 80 ipNotEmpty := pod.Status.PodIP != "" 81 if isReadyType && isConditionTrue && isRunningPhase && ipNotEmpty { 82 return true, nil 83 } 84 } 85 return false, nil 86 } 87 } 88 89 func GetSlavesCount(vars map[string]testkube.Variable) (int, error) { 90 count := vars[SlavesCount] 91 if count.Value == "" { 92 return defaultSlavesCount, nil 93 } 94 95 slavesCount, err := strconv.Atoi(count.Value) 96 if err != nil { 97 return 0, errors.Errorf("invalid SLAVES_COUNT value, expected integer, got: %v", count.Value) 98 } 99 if slavesCount < 0 { 100 return 0, errors.Errorf("SLAVES_COUNT cannot be less than 0, got: %v", count.Value) 101 } 102 return slavesCount, err 103 } 104 105 func validateAndGetSlavePodName(testName string, executionId string, currentSlaveCount int) string { 106 slavePodName := fmt.Sprintf("%s-slave-%v-%s", testName, currentSlaveCount, executionId) 107 if len(slavePodName) > 64 { 108 //Get first 20 chars from testName name if pod name > 64 109 shortExecutionName := testName[:20] 110 slavePodName = fmt.Sprintf("%s-slave-%v-%s", shortExecutionName, currentSlaveCount, executionId) 111 } 112 return slavePodName 113 }