diff --git a/dashboard/src/translation/en.json b/dashboard/src/translation/en.json index 2d622eb82..c80444a86 100644 --- a/dashboard/src/translation/en.json +++ b/dashboard/src/translation/en.json @@ -1476,7 +1476,8 @@ "description": "If the server is running out of disk space, use this to move the app's data to a volume. Any data here is part of the app's backup.", "dataDirPlaceholder": "Leave empty to use platform default", "moveAction": "Move Data", - "diskUsage": "The app is currently using {{ size }} of storage (as of {{ date }})." + "diskUsage": "The app is currently using {{ size }} of storage (as of {{ date }}).", + "mountTypeWarning": "The destination file system must support file permissions and ownership for the move to work" }, "mounts": { "title": "Mounts", diff --git a/dashboard/src/views/app.html b/dashboard/src/views/app.html index ecd51fba8..e96b28f8c 100644 --- a/dashboard/src/views/app.html +++ b/dashboard/src/views/app.html @@ -973,6 +973,7 @@

+


@@ -985,6 +986,7 @@
+
diff --git a/dashboard/src/views/app.js b/dashboard/src/views/app.js index a42a46936..f8c3eceae 100644 --- a/dashboard/src/views/app.js +++ b/dashboard/src/views/app.js @@ -613,7 +613,7 @@ angular.module('Application').controller('AppController', ['$scope', '$location' ]; $scope.volumes.forEach(function (volume) { - $scope.storage.locationOptions.push({ id: volume.id, type: 'volume', value: volume.id, displayName: 'Volume - ' + volume.name }); + $scope.storage.locationOptions.push({ id: volume.id, type: 'volume', value: volume.id, displayName: 'Volume - ' + volume.name, mountType: volume.mountType }); }); $scope.storage.location = $scope.storage.locationOptions.find(function (l) { return l.id === (app.storageVolumeId || 'default'); }); diff --git a/src/apps.js b/src/apps.js index 220dd749e..ff74f4405 100644 --- a/src/apps.js +++ b/src/apps.js @@ -515,6 +515,9 @@ async function checkStorage(app, volumeId, prefix) { const volume = await volumes.get(volumeId); if (volume === null) throw new BoxError(BoxError.BAD_FIELD, 'Storage volume not found'); + // lack of file perms makes these unsupported + if (volume.mountType === 'cifs' || volume.mountType === 'sshfs') throw new BoxError(BoxError.BAD_FIELD, `${volume.mountType} volumes cannot be used as data directory`); + const status = await volumes.getStatus(volume); if (status.state !== 'active') throw new BoxError(BoxError.BAD_FIELD, 'Volume is not active');