@@ -18,14 +18,12 @@ import (
18
18
"github.com/pkg/errors"
19
19
log "github.com/sirupsen/logrus"
20
20
corev1 "k8s.io/api/core/v1"
21
- k8serrors "k8s.io/apimachinery/pkg/api/errors"
22
21
"k8s.io/apimachinery/pkg/apis/meta/v1"
23
22
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
24
23
"k8s.io/apimachinery/pkg/fields"
25
24
"k8s.io/apimachinery/pkg/runtime/schema"
26
25
"k8s.io/apimachinery/pkg/util/httpstream"
27
26
"k8s.io/apimachinery/pkg/util/sets"
28
- "k8s.io/apimachinery/pkg/util/wait"
29
27
"k8s.io/apimachinery/pkg/watch"
30
28
"k8s.io/cli-runtime/pkg/genericiooptions"
31
29
"k8s.io/cli-runtime/pkg/resource"
@@ -171,11 +169,20 @@ func PortForwardPod(config *rest.Config, clientset *rest.RESTClient, podName, na
171
169
return err
172
170
}
173
171
174
- if err = forwarder .ForwardPorts (); err != nil {
175
- log .Debugf ("Forward port error: %s" , err .Error ())
172
+ defer forwarder .Close ()
173
+
174
+ var errChan = make (chan error , 1 )
175
+ go func () {
176
+ errChan <- forwarder .ForwardPorts ()
177
+ }()
178
+
179
+ select {
180
+ case err = <- errChan :
181
+ log .Debugf ("Forward port error: %v" , err )
176
182
return err
183
+ case <- stopChan :
184
+ return nil
177
185
}
178
- return nil
179
186
}
180
187
181
188
func GetTopOwnerReference (factory util.Factory , ns , workload string ) (* resource.Info , error ) {
@@ -330,36 +337,42 @@ func FindContainerByName(pod *corev1.Pod, name string) (*corev1.Container, int)
330
337
}
331
338
332
339
func CheckPodStatus (ctx context.Context , cancelFunc context.CancelFunc , podName string , podInterface v12.PodInterface ) {
340
+ var verifyAPIServerConnection = func () {
341
+ err := retry .OnError (
342
+ retry .DefaultBackoff ,
343
+ func (err error ) bool {
344
+ return err != nil
345
+ },
346
+ func () error {
347
+ ctx1 , cancelFunc1 := context .WithTimeout (ctx , time .Second * 10 )
348
+ defer cancelFunc1 ()
349
+ _ , err := podInterface .Get (ctx1 , podName , v1.GetOptions {})
350
+ return err
351
+ })
352
+ if err != nil {
353
+ log .Debugf ("Failed to get Pod %s: %v" , podName , err )
354
+ cancelFunc ()
355
+ }
356
+ }
357
+
333
358
for ctx .Err () == nil {
334
359
func () {
335
- defer time .Sleep (time .Millisecond * 200 )
360
+ defer time .Sleep (time .Second * 5 )
336
361
337
362
w , err := podInterface .Watch (ctx , v1.ListOptions {
338
363
FieldSelector : fields .OneTermEqualSelector ("metadata.name" , podName ).String (),
339
364
})
340
365
if err != nil {
341
- if ! k8serrors .IsForbidden (err ) && ! errors .Is (err , context .Canceled ) {
342
- log .Debugf ("Failed to watch Pod %s: %v" , podName , err )
343
- }
366
+ log .Debugf ("Failed to watch Pod %s: %v" , podName , err )
344
367
return
345
368
}
346
369
defer w .Stop ()
347
370
348
- _ , err = podInterface .Get (ctx , podName , v1.GetOptions {})
349
- if err != nil {
350
- if ! k8serrors .IsForbidden (err ) && ! errors .Is (err , context .Canceled ) {
351
- log .Debugf ("Failed to get Pod %s: %v" , podName , err )
352
- }
353
- return
354
- }
371
+ verifyAPIServerConnection ()
355
372
select {
356
373
case e , ok := <- w .ResultChan ():
357
374
if ! ok {
358
- _ , err = podInterface .Get (ctx , podName , v1.GetOptions {})
359
- if err != nil && ! errors .Is (err , context .Canceled ) {
360
- log .Debugf ("Failed to get Pod %s: %v" , podName , err )
361
- cancelFunc ()
362
- }
375
+ verifyAPIServerConnection ()
363
376
return
364
377
}
365
378
switch e .Type {
@@ -368,11 +381,7 @@ func CheckPodStatus(ctx context.Context, cancelFunc context.CancelFunc, podName
368
381
cancelFunc ()
369
382
return
370
383
case watch .Error :
371
- _ , err = podInterface .Get (ctx , podName , v1.GetOptions {})
372
- if err != nil && ! errors .Is (err , context .Canceled ) {
373
- log .Debugf ("Failed to get Pod %s: %v" , podName , err )
374
- cancelFunc ()
375
- }
384
+ verifyAPIServerConnection ()
376
385
return
377
386
case watch .Added , watch .Modified , watch .Bookmark :
378
387
// do nothing
@@ -397,25 +406,14 @@ func CheckPortStatus(ctx context.Context, cancelFunc context.CancelFunc, readyCh
397
406
}
398
407
399
408
for ctx .Err () == nil {
400
- err := retry .OnError (wait.Backoff {
401
- Steps : 6 ,
402
- Duration : time .Second ,
403
- }, func (err error ) bool {
404
- return err != nil
405
- }, func () error {
406
- var lc net.ListenConfig
407
- conn , err := lc .Listen (ctx , "tcp" , net .JoinHostPort ("127.0.0.1" , localGvisorTCPPort ))
408
- if err == nil {
409
- _ = conn .Close ()
410
- return errors .New ("port is free" )
411
- }
412
- return nil
413
- })
414
- if err != nil {
415
- log .Debugf ("Can not dial local port: %s: %v" , localGvisorTCPPort , err )
409
+ var lc net.ListenConfig
410
+ conn , err := lc .Listen (ctx , "tcp" , net .JoinHostPort ("127.0.0.1" , localGvisorTCPPort ))
411
+ if err == nil {
412
+ _ = conn .Close ()
413
+ log .Debugf ("Local port: %s is free" , localGvisorTCPPort )
416
414
return
417
415
}
418
- time .Sleep (time .Second * 5 )
416
+ time .Sleep (time .Second * 1 )
419
417
}
420
418
}
421
419
0 commit comments