@@ -26,6 +26,7 @@ import (
26
26
"github.com/codefresh-io/cli-v2/pkg/store"
27
27
28
28
"github.com/argoproj-labs/argocd-autopilot/pkg/kube"
29
+ platmodel "github.com/codefresh-io/go-sdk/pkg/codefresh/model"
29
30
authv1 "k8s.io/api/authorization/v1"
30
31
batchv1 "k8s.io/api/batch/v1"
31
32
v1 "k8s.io/api/core/v1"
@@ -37,6 +38,14 @@ import (
37
38
)
38
39
39
40
type (
41
+ RuntimeInstallOptions struct {
42
+ KubeFactory kube.Factory
43
+ Namespace string
44
+ ContextUrl string
45
+ AccessMode platmodel.AccessMode
46
+ TunnelRegisterHost string
47
+ }
48
+
40
49
rbacValidation struct {
41
50
Namespace string
42
51
Resource string
@@ -53,16 +62,19 @@ type (
53
62
LaunchJobOptions struct {
54
63
Client kubernetes.Interface
55
64
Namespace string
56
- JobName * string
57
- Image * string
65
+ ContainerName string
66
+ GenerateName string
67
+ Image string
58
68
Env []v1.EnvVar
59
69
RestartPolicy v1.RestartPolicy
60
70
BackOffLimit int32
61
71
}
62
72
)
63
73
64
- func EnsureClusterRequirements (ctx context.Context , kubeFactory kube. Factory , namespace string , contextUrl string ) error {
74
+ func EnsureClusterRequirements (ctx context.Context , runtimeInstallOptions RuntimeInstallOptions ) error {
65
75
requirementsValidationErrorMessage := "cluster does not meet minimum requirements"
76
+ namespace := runtimeInstallOptions .Namespace
77
+ kubeFactory := runtimeInstallOptions .KubeFactory
66
78
var specificErrorMessages []string
67
79
68
80
client , err := kubeFactory .KubernetesClientSet ()
@@ -173,16 +185,67 @@ func EnsureClusterRequirements(ctx context.Context, kubeFactory kube.Factory, na
173
185
return fmt .Errorf ("%s: %v" , requirementsValidationErrorMessage , specificErrorMessages )
174
186
}
175
187
176
- err = runNetworkTest (ctx , kubeFactory , contextUrl )
188
+ err = runNetworkTest (ctx , kubeFactory , runtimeInstallOptions . ContextUrl )
177
189
if err != nil {
178
190
return fmt .Errorf ("cluster network tests failed: %w " , err )
179
191
}
180
192
181
193
log .G (ctx ).Info ("Network test finished successfully" )
182
194
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
+ }
183
203
return nil
184
204
}
185
205
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
+
186
249
func GetClusterSecret (ctx context.Context , kubeFactory kube.Factory , namespace string , name string ) (* v1.Secret , error ) {
187
250
client , err := kubeFactory .KubernetesClientSet ()
188
251
if err != nil {
@@ -295,8 +358,9 @@ func runNetworkTest(ctx context.Context, kubeFactory kube.Factory, urls ...strin
295
358
296
359
job , err := launchJob (ctx , client , LaunchJobOptions {
297
360
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 ,
300
364
Env : env ,
301
365
RestartPolicy : v1 .RestartPolicyNever ,
302
366
BackOffLimit : 0 ,
@@ -315,17 +379,24 @@ func runNetworkTest(ctx context.Context, kubeFactory kube.Factory, urls ...strin
315
379
log .G (ctx ).Info ("Running network test..." )
316
380
ticker := time .NewTicker (5 * time .Second )
317
381
defer ticker .Stop ()
318
- var podLastState * v1.Pod
319
382
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
+ }
320
389
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
321
392
Loop:
322
393
for {
323
394
select {
324
395
case <- ticker .C :
325
396
log .G (ctx ).Debug ("Waiting for network tester to finish" )
326
397
currentPod , err := getPodByJob (ctx , client , job )
327
398
if err != nil {
328
- return err
399
+ return nil , err
329
400
}
330
401
331
402
if currentPod == nil {
@@ -353,11 +424,10 @@ Loop:
353
424
break Loop
354
425
}
355
426
case <- timeoutChan :
356
- return fmt .Errorf ("network test timeout reached!" )
427
+ return nil , fmt .Errorf ("network test timeout reached!" )
357
428
}
358
429
}
359
-
360
- return checkPodLastState (ctx , client , podLastState )
430
+ return podLastState , nil
361
431
}
362
432
363
433
func prepareEnvVars (vars map [string ]string ) []v1.EnvVar {
@@ -368,7 +438,6 @@ func prepareEnvVars(vars map[string]string) []v1.EnvVar {
368
438
Value : value ,
369
439
})
370
440
}
371
-
372
441
return env
373
442
}
374
443
@@ -449,16 +518,16 @@ func testNode(n v1.Node, req validationRequest) []string {
449
518
func launchJob (ctx context.Context , client kubernetes.Interface , opts LaunchJobOptions ) (* batchv1.Job , error ) {
450
519
jobSpec := & batchv1.Job {
451
520
ObjectMeta : metav1.ObjectMeta {
452
- Name : * opts .JobName ,
453
- Namespace : opts .Namespace ,
521
+ GenerateName : opts .GenerateName ,
522
+ Namespace : opts .Namespace ,
454
523
},
455
524
Spec : batchv1.JobSpec {
456
525
Template : v1.PodTemplateSpec {
457
526
Spec : v1.PodSpec {
458
527
Containers : []v1.Container {
459
528
{
460
- Name : * opts .JobName ,
461
- Image : * opts .Image ,
529
+ Name : opts .ContainerName ,
530
+ Image : opts .Image ,
462
531
Env : opts .Env ,
463
532
},
464
533
},
0 commit comments