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  }