@@ -6,17 +6,20 @@ import (
6
6
"time"
7
7
8
8
kapi "k8s.io/kubernetes/pkg/api"
9
+ "k8s.io/kubernetes/pkg/api/unversioned"
9
10
kcoreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
10
11
"k8s.io/kubernetes/pkg/fields"
11
12
"k8s.io/kubernetes/pkg/watch"
12
13
14
+ "github.com/golang/glog"
13
15
"github.com/openshift/origin/pkg/deploy/api"
14
16
deployutil "github.com/openshift/origin/pkg/deploy/util"
15
17
)
16
18
17
19
var (
18
20
// ErrUnknownDeploymentPhase is returned for WaitForRunningDeployment if an unknown phase is returned.
19
21
ErrUnknownDeploymentPhase = errors .New ("unknown deployment phase" )
22
+ ErrTooOldResourceVersion = errors .New ("too old resource version" )
20
23
)
21
24
22
25
// WaitForRunningDeployment waits until the specified deployment is no longer New or Pending. Returns true if
@@ -33,6 +36,15 @@ func WaitForRunningDeployment(rn kcoreclient.ReplicationControllersGetter, obser
33
36
34
37
if _ , err := watch .Until (timeout , w , func (e watch.Event ) (bool , error ) {
35
38
if e .Type == watch .Error {
39
+ // When we send too old resource version in observed replication controller to
40
+ // watcher, restart the watch with latest available controller.
41
+ switch t := e .Object .(type ) {
42
+ case * unversioned.Status :
43
+ if t .Reason == unversioned .StatusReasonGone {
44
+ glog .V (5 ).Infof ("encountered error while watching for replication controller: %v (retrying)" , t )
45
+ return false , ErrTooOldResourceVersion
46
+ }
47
+ }
36
48
return false , fmt .Errorf ("encountered error while watching for replication controller: %v" , e .Object )
37
49
}
38
50
obj , isController := e .Object .(* kapi.ReplicationController )
@@ -49,6 +61,13 @@ func WaitForRunningDeployment(rn kcoreclient.ReplicationControllersGetter, obser
49
61
return false , ErrUnknownDeploymentPhase
50
62
}
51
63
}); err != nil {
64
+ if err == ErrTooOldResourceVersion {
65
+ latestRC , err := rn .ReplicationControllers (observed .Namespace ).Get (observed .Name )
66
+ if err != nil {
67
+ return observed , false , err
68
+ }
69
+ return WaitForRunningDeployment (rn , latestRC , timeout )
70
+ }
52
71
return observed , false , err
53
72
}
54
73
0 commit comments