Skip to content

Commit cb9e902

Browse files
committed
ws-manager: return error if restore volume snapshot to smaller PVC size
Signed-off-by: JenTing Hsiao <[email protected]>
1 parent 35a2760 commit cb9e902

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

components/ws-manager/pkg/manager/create.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ func mergeProbe(dst, src reflect.Value) (err error) {
245245
return nil
246246
}
247247

248-
func (m *Manager) createPVCForWorkspacePod(startContext *startWorkspaceContext) (*corev1.PersistentVolumeClaim, error) {
248+
func (m *Manager) createPVCForWorkspacePod(ctx context.Context, startContext *startWorkspaceContext) (*corev1.PersistentVolumeClaim, error) {
249249
req := startContext.Request
250250
var prefix string
251251
switch req.Type {

components/ws-manager/pkg/manager/create_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ func TestCreatePVCForWorkspacePod(t *testing.T) {
289289
fixture.Context = ctx
290290
}
291291

292-
pvc, serr := manager.createPVCForWorkspacePod(fixture.Context)
292+
pvc, serr := manager.createPVCForWorkspacePod(context.Background(), fixture.Context)
293293
result := gold{}
294294
if serr != nil {
295295
result.Error = serr.Error()

components/ws-manager/pkg/manager/manager.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,8 +263,8 @@ func (m *Manager) StartWorkspace(ctx context.Context, req *api.StartWorkspaceReq
263263
_, createPVC = pod.Labels[pvcWorkspaceFeatureLabel]
264264

265265
if createPVC {
266+
var volumeSnapshot volumesnapshotv1.VolumeSnapshot
266267
if startContext.VolumeSnapshot != nil && startContext.VolumeSnapshot.VolumeSnapshotName != "" {
267-
var volumeSnapshot volumesnapshotv1.VolumeSnapshot
268268
err = m.Clientset.Get(ctx, types.NamespacedName{Namespace: m.Config.Namespace, Name: startContext.VolumeSnapshot.VolumeSnapshotName}, &volumeSnapshot)
269269
if k8serr.IsNotFound(err) {
270270
// restore volume snapshot from handle
@@ -273,12 +273,31 @@ func (m *Manager) StartWorkspace(ctx context.Context, req *api.StartWorkspaceReq
273273
clog.WithError(err).Error("was unable to restore volume snapshot")
274274
return nil, err
275275
}
276+
277+
// update the volumeSnapshot variable
278+
if err := m.Clientset.Get(ctx, types.NamespacedName{Namespace: m.Config.Namespace, Name: startContext.VolumeSnapshot.VolumeSnapshotName}, &volumeSnapshot); err != nil {
279+
return nil, err
280+
}
276281
} else if err != nil {
277282
clog.WithError(err).Error("was unable to get volume snapshot")
278283
return nil, err
279284
}
285+
286+
// check the PVC size is not less than the volume snapshot size
287+
PVCConfig := m.Config.WorkspaceClasses[config.DefaultWorkspaceClass].PVC
288+
if startContext.Class != nil {
289+
PVCConfig = startContext.Class.PVC
290+
}
291+
292+
if volumeSnapshot.Status != nil &&
293+
volumeSnapshot.Status.RestoreSize != nil &&
294+
PVCConfig.Size.Cmp(*volumeSnapshot.Status.RestoreSize) == -1 {
295+
return nil, xerrors.Errorf("cannot restore volume snapshot from size %s to pvc size %s", volumeSnapshot.Status.RestoreSize.String(), PVCConfig.Size.String())
296+
}
280297
}
281-
pvc, err = m.createPVCForWorkspacePod(startContext)
298+
299+
// create PVC object
300+
pvc, err = m.createPVCForWorkspacePod(ctx, startContext)
282301
if err != nil {
283302
return nil, xerrors.Errorf("cannot create pvc for workspace pod: %w", err)
284303
}

0 commit comments

Comments
 (0)