@@ -26,6 +26,7 @@ import (
2626 "github.com/codefresh-io/cli-v2/pkg/store"
2727
2828 "github.com/argoproj-labs/argocd-autopilot/pkg/kube"
29+ platmodel "github.com/codefresh-io/go-sdk/pkg/codefresh/model"
2930 authv1 "k8s.io/api/authorization/v1"
3031 batchv1 "k8s.io/api/batch/v1"
3132 v1 "k8s.io/api/core/v1"
@@ -37,6 +38,14 @@ import (
3738)
3839
3940type (
41+ RuntimeInstallOptions struct {
42+ KubeFactory kube.Factory
43+ Namespace string
44+ ContextUrl string
45+ AccessMode platmodel.AccessMode
46+ TunnelRegisterHost string
47+ }
48+
4049 rbacValidation struct {
4150 Namespace string
4251 Resource string
@@ -53,16 +62,19 @@ type (
5362 LaunchJobOptions struct {
5463 Client kubernetes.Interface
5564 Namespace string
56- JobName * string
57- Image * string
65+ ContainerName string
66+ GenerateName string
67+ Image string
5868 Env []v1.EnvVar
5969 RestartPolicy v1.RestartPolicy
6070 BackOffLimit int32
6171 }
6272)
6373
64- func EnsureClusterRequirements (ctx context.Context , kubeFactory kube. Factory , namespace string , contextUrl string ) error {
74+ func EnsureClusterRequirements (ctx context.Context , runtimeInstallOptions RuntimeInstallOptions ) error {
6575 requirementsValidationErrorMessage := "cluster does not meet minimum requirements"
76+ namespace := runtimeInstallOptions .Namespace
77+ kubeFactory := runtimeInstallOptions .KubeFactory
6678 var specificErrorMessages []string
6779
6880 client , err := kubeFactory .KubernetesClientSet ()
@@ -173,16 +185,67 @@ func EnsureClusterRequirements(ctx context.Context, kubeFactory kube.Factory, na
173185 return fmt .Errorf ("%s: %v" , requirementsValidationErrorMessage , specificErrorMessages )
174186 }
175187
176- err = runNetworkTest (ctx , kubeFactory , contextUrl )
188+ err = runNetworkTest (ctx , kubeFactory , runtimeInstallOptions . ContextUrl )
177189 if err != nil {
178190 return fmt .Errorf ("cluster network tests failed: %w " , err )
179191 }
180192
181193 log .G (ctx ).Info ("Network test finished successfully" )
182194
195+ if runtimeInstallOptions .AccessMode == platmodel .AccessModeTunnel {
196+ err = runTCPConnectionTest (ctx , & runtimeInstallOptions )
197+ if err != nil {
198+ return fmt .Errorf ("cluster TCP connection tests failed: %w " , err )
199+ }
200+
201+ log .G (ctx ).Info ("TCP connection test finished successfully" )
202+ }
183203 return nil
184204}
185205
206+ func runTCPConnectionTest (ctx context.Context , runtimeInstallOptions * RuntimeInstallOptions ) error {
207+ const tcpConnectionTestsTimeout = 120 * time .Second
208+ envVars := map [string ]string {
209+ "TUNNEL_REGISTER_HOST" : runtimeInstallOptions .TunnelRegisterHost ,
210+ }
211+ env := prepareEnvVars (envVars )
212+
213+ client , err := runtimeInstallOptions .KubeFactory .KubernetesClientSet ()
214+ if err != nil {
215+ return fmt .Errorf ("failed to create kubernetes client: %w" , err )
216+ }
217+
218+ job , err := launchJob (ctx , client , LaunchJobOptions {
219+ Namespace : store .Get ().DefaultNamespace ,
220+ ContainerName : store .Get ().TCPConnectionTesterName ,
221+ GenerateName : store .Get ().TCPConnectionTesterGenerateName ,
222+ Image : store .Get ().NetworkTesterImage ,
223+ Env : env ,
224+ RestartPolicy : v1 .RestartPolicyNever ,
225+ BackOffLimit : 0 ,
226+ })
227+ if err != nil {
228+ return err
229+ }
230+
231+ defer func () {
232+ err := deleteJob (ctx , client , job )
233+ if err != nil {
234+ log .G (ctx ).Errorf ("fail to delete tester pod: %s" , err .Error ())
235+ }
236+ }()
237+
238+ log .G (ctx ).Info ("Running TCP connection test..." )
239+ ticker := time .NewTicker (5 * time .Second )
240+ defer ticker .Stop ()
241+ timeoutChan := time .After (tcpConnectionTestsTimeout )
242+ podLastState , err := handleJobPodStates (ctx , client , job , ticker , timeoutChan )
243+ if err != nil {
244+ return err
245+ }
246+ return checkPodLastState (ctx , client , podLastState )
247+ }
248+
186249func GetClusterSecret (ctx context.Context , kubeFactory kube.Factory , namespace string , name string ) (* v1.Secret , error ) {
187250 client , err := kubeFactory .KubernetesClientSet ()
188251 if err != nil {
@@ -295,8 +358,9 @@ func runNetworkTest(ctx context.Context, kubeFactory kube.Factory, urls ...strin
295358
296359 job , err := launchJob (ctx , client , LaunchJobOptions {
297360 Namespace : store .Get ().DefaultNamespace ,
298- JobName : & store .Get ().NetworkTesterName ,
299- Image : & store .Get ().NetworkTesterImage ,
361+ ContainerName : store .Get ().NetworkTesterName ,
362+ GenerateName : store .Get ().NetworkTesterGenerateName ,
363+ Image : store .Get ().NetworkTesterImage ,
300364 Env : env ,
301365 RestartPolicy : v1 .RestartPolicyNever ,
302366 BackOffLimit : 0 ,
@@ -315,17 +379,24 @@ func runNetworkTest(ctx context.Context, kubeFactory kube.Factory, urls ...strin
315379 log .G (ctx ).Info ("Running network test..." )
316380 ticker := time .NewTicker (5 * time .Second )
317381 defer ticker .Stop ()
318- var podLastState * v1.Pod
319382 timeoutChan := time .After (networkTestsTimeout )
383+ podLastState , err := handleJobPodStates (ctx , client , job , ticker , timeoutChan )
384+ if err != nil {
385+ return err
386+ }
387+ return checkPodLastState (ctx , client , podLastState )
388+ }
320389
390+ func handleJobPodStates (ctx context.Context , client kubernetes.Interface , job * batchv1.Job , ticker * time.Ticker , timeoutChan <- chan time.Time ) (* v1.Pod , error ) {
391+ var podLastState * v1.Pod
321392Loop:
322393 for {
323394 select {
324395 case <- ticker .C :
325396 log .G (ctx ).Debug ("Waiting for network tester to finish" )
326397 currentPod , err := getPodByJob (ctx , client , job )
327398 if err != nil {
328- return err
399+ return nil , err
329400 }
330401
331402 if currentPod == nil {
@@ -353,11 +424,10 @@ Loop:
353424 break Loop
354425 }
355426 case <- timeoutChan :
356- return fmt .Errorf ("network test timeout reached!" )
427+ return nil , fmt .Errorf ("network test timeout reached!" )
357428 }
358429 }
359-
360- return checkPodLastState (ctx , client , podLastState )
430+ return podLastState , nil
361431}
362432
363433func prepareEnvVars (vars map [string ]string ) []v1.EnvVar {
@@ -368,7 +438,6 @@ func prepareEnvVars(vars map[string]string) []v1.EnvVar {
368438 Value : value ,
369439 })
370440 }
371-
372441 return env
373442}
374443
@@ -449,16 +518,16 @@ func testNode(n v1.Node, req validationRequest) []string {
449518func launchJob (ctx context.Context , client kubernetes.Interface , opts LaunchJobOptions ) (* batchv1.Job , error ) {
450519 jobSpec := & batchv1.Job {
451520 ObjectMeta : metav1.ObjectMeta {
452- Name : * opts .JobName ,
453- Namespace : opts .Namespace ,
521+ GenerateName : opts .GenerateName ,
522+ Namespace : opts .Namespace ,
454523 },
455524 Spec : batchv1.JobSpec {
456525 Template : v1.PodTemplateSpec {
457526 Spec : v1.PodSpec {
458527 Containers : []v1.Container {
459528 {
460- Name : * opts .JobName ,
461- Image : * opts .Image ,
529+ Name : opts .ContainerName ,
530+ Image : opts .Image ,
462531 Env : opts .Env ,
463532 },
464533 },
0 commit comments