@@ -23,6 +23,7 @@ import (
23
23
24
24
"google.golang.org/protobuf/proto"
25
25
corev1 "k8s.io/api/core/v1"
26
+ "k8s.io/apimachinery/pkg/api/errors"
26
27
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27
28
"k8s.io/apimachinery/pkg/types"
28
29
"k8s.io/apimachinery/pkg/util/wait"
@@ -119,14 +120,18 @@ func (wsc *WorkspaceController) Reconcile(ctx context.Context, req ctrl.Request)
119
120
return ctrl.Result {}, client .IgnoreNotFound (err )
120
121
}
121
122
123
+ if ! wsc .isRecent (ctx , & workspace ) {
124
+ return ctrl.Result {Requeue : true }, nil
125
+ }
126
+
122
127
glog .WithField ("workspaceID" , workspace .Name ).WithField ("phase" , workspace .Status .Phase ).Debug ("Reconcile workspace" )
123
128
124
129
glog .Info ("RECONCILE" )
125
130
if workspace .Status .Phase == workspacev1 .WorkspacePhaseCreating ||
126
- workspace .Status .Phase == workspacev1 .WorkspacePhaseInitializing ||
127
- workspace .Status .Phase == workspacev1 .WorkspacePhaseRunning {
131
+ workspace .Status .Phase == workspacev1 .WorkspacePhaseInitializing {
128
132
129
133
result , err = wsc .handleWorkspaceInit (ctx , & workspace , req )
134
+ glog .Infof ("RETURNING FROM INIT WITH STATUS %v" , workspace .Status )
130
135
return result , err
131
136
}
132
137
@@ -138,63 +143,76 @@ func (wsc *WorkspaceController) Reconcile(ctx context.Context, req ctrl.Request)
138
143
return ctrl.Result {}, nil
139
144
}
140
145
146
+ func (wsc * WorkspaceController ) isRecent (ctx context.Context , ws * workspacev1.Workspace ) bool {
147
+ ws .Status .Conditions = wsk8s .AddUniqueCondition (ws .Status .Conditions , metav1.Condition {
148
+ Type : "Refresh" ,
149
+ Status : metav1 .ConditionFalse ,
150
+ LastTransitionTime : metav1 .Now (),
151
+ })
152
+
153
+ err := wsc .Client .Status ().Update (ctx , ws )
154
+ return ! errors .IsConflict (err )
155
+ }
156
+
141
157
func (wsc * WorkspaceController ) handleWorkspaceInit (ctx context.Context , ws * workspacev1.Workspace , req ctrl.Request ) (result ctrl.Result , err error ) {
142
158
log := log .FromContext (ctx )
143
159
span , ctx := opentracing .StartSpanFromContext (ctx , "handleWorkspaceInit" )
144
160
defer tracing .FinishSpan (span , & err )
145
161
146
- if c := wsk8s .GetCondition (ws .Status .Conditions , string (workspacev1 .WorkspaceConditionContentReady )); c == nil {
147
- init , err := wsc .prepareInitializer (ctx , ws )
148
- if err != nil {
149
- return ctrl.Result {}, err
150
- }
162
+ if c := wsk8s .GetCondition (ws .Status .Conditions , string (workspacev1 .WorkspaceConditionContentReady )); c != nil {
163
+ return ctrl.Result {}, nil
164
+ }
151
165
152
- glog .Info ("START WORKSPACE INIT" )
153
- initStart := time .Now ()
154
- failure , initErr := wsc .operations .InitWorkspaceContent (ctx , InitContentOptions {
155
- Meta : WorkspaceMeta {
156
- Owner : ws .Spec .Ownership .Owner ,
157
- WorkspaceId : ws .Spec .Ownership .WorkspaceID ,
158
- InstanceId : ws .Name ,
159
- },
160
- Initializer : init ,
161
- Headless : ws .IsHeadless (),
162
- })
166
+ log .Info ("workspace status" , "status" , ws )
163
167
164
- err = retry . RetryOnConflict ( retryParams , func () error {
165
- if err := wsc . Get ( ctx , req . NamespacedName , ws ); err != nil {
166
- return err
167
- }
168
+ init , err := wsc . prepareInitializer ( ctx , ws )
169
+ if err != nil {
170
+ return ctrl. Result {}, err
171
+ }
168
172
169
- if failure != "" {
170
- log .Error (initErr , "could not initialize workspace" , "name" , ws .Name )
171
- ws .Status .Conditions = wsk8s .AddUniqueCondition (ws .Status .Conditions , metav1.Condition {
172
- Type : string (workspacev1 .WorkspaceConditionContentReady ),
173
- Status : metav1 .ConditionFalse ,
174
- Message : failure ,
175
- Reason : "InitializationFailure" ,
176
- LastTransitionTime : metav1 .Now (),
177
- })
178
- } else {
179
- ws .Status .Conditions = wsk8s .AddUniqueCondition (ws .Status .Conditions , metav1.Condition {
180
- Type : string (workspacev1 .WorkspaceConditionContentReady ),
181
- Status : metav1 .ConditionTrue ,
182
- Reason : "InitializationSuccess" ,
183
- LastTransitionTime : metav1 .Now (),
184
- })
185
- }
173
+ glog .Info ("START WORKSPACE INIT" )
174
+ initStart := time .Now ()
175
+ failure , initErr := wsc .operations .InitWorkspaceContent (ctx , InitContentOptions {
176
+ Meta : WorkspaceMeta {
177
+ Owner : ws .Spec .Ownership .Owner ,
178
+ WorkspaceId : ws .Spec .Ownership .WorkspaceID ,
179
+ InstanceId : ws .Name ,
180
+ },
181
+ Initializer : init ,
182
+ Headless : ws .IsHeadless (),
183
+ })
186
184
187
- return wsc .Status ().Update (ctx , ws )
188
- })
185
+ err = retry .RetryOnConflict (retryParams , func () error {
186
+ if err := wsc .Get (ctx , req .NamespacedName , ws ); err != nil {
187
+ return err
188
+ }
189
189
190
- if err == nil {
191
- wsc .metrics .recordInitializeTime (time .Since (initStart ).Seconds (), ws )
190
+ if failure != "" {
191
+ log .Error (initErr , "could not initialize workspace" , "name" , ws .Name )
192
+ ws .Status .Conditions = wsk8s .AddUniqueCondition (ws .Status .Conditions , metav1.Condition {
193
+ Type : string (workspacev1 .WorkspaceConditionContentReady ),
194
+ Status : metav1 .ConditionFalse ,
195
+ Message : failure ,
196
+ Reason : "InitializationFailure" ,
197
+ LastTransitionTime : metav1 .Now (),
198
+ })
199
+ } else {
200
+ ws .Status .Conditions = wsk8s .AddUniqueCondition (ws .Status .Conditions , metav1.Condition {
201
+ Type : string (workspacev1 .WorkspaceConditionContentReady ),
202
+ Status : metav1 .ConditionTrue ,
203
+ Reason : "InitializationSuccess" ,
204
+ LastTransitionTime : metav1 .Now (),
205
+ })
192
206
}
193
207
194
- return ctrl.Result {}, err
208
+ return wsc .Status ().Update (ctx , ws )
209
+ })
210
+
211
+ if err == nil {
212
+ wsc .metrics .recordInitializeTime (time .Since (initStart ).Seconds (), ws )
195
213
}
196
214
197
- return ctrl.Result {}, nil
215
+ return ctrl.Result {}, err
198
216
}
199
217
200
218
func (wsc * WorkspaceController ) handleWorkspaceStop (ctx context.Context , ws * workspacev1.Workspace , req ctrl.Request ) (result ctrl.Result , err error ) {
0 commit comments