mirror of
https://github.com/portainer/portainer.git
synced 2025-07-22 06:49:40 +02:00
feat(volume-creation): retrieve available drivers from the engine (#751)
This commit is contained in:
parent
53f31ba3b8
commit
50305e0eee
5 changed files with 104 additions and 80 deletions
|
@ -1,15 +1,13 @@
|
||||||
angular.module('createVolume', [])
|
angular.module('createVolume', [])
|
||||||
.controller('CreateVolumeController', ['$scope', '$state', 'Volume', 'ResourceControlService', 'Authentication', 'Messages',
|
.controller('CreateVolumeController', ['$scope', '$state', 'VolumeService', 'InfoService', 'ResourceControlService', 'Authentication', 'Messages',
|
||||||
function ($scope, $state, Volume, ResourceControlService, Authentication, Messages) {
|
function ($scope, $state, VolumeService, InfoService, ResourceControlService, Authentication, Messages) {
|
||||||
|
|
||||||
$scope.formValues = {
|
$scope.formValues = {
|
||||||
Ownership: $scope.applicationState.application.authentication ? 'private' : '',
|
Ownership: $scope.applicationState.application.authentication ? 'private' : '',
|
||||||
|
Driver: 'local',
|
||||||
DriverOptions: []
|
DriverOptions: []
|
||||||
};
|
};
|
||||||
|
$scope.availableVolumeDrivers = [];
|
||||||
$scope.config = {
|
|
||||||
Driver: 'local'
|
|
||||||
};
|
|
||||||
|
|
||||||
$scope.addDriverOption = function() {
|
$scope.addDriverOption = function() {
|
||||||
$scope.formValues.DriverOptions.push({ name: '', value: '' });
|
$scope.formValues.DriverOptions.push({ name: '', value: '' });
|
||||||
|
@ -19,52 +17,51 @@ function ($scope, $state, Volume, ResourceControlService, Authentication, Messag
|
||||||
$scope.formValues.DriverOptions.splice(index, 1);
|
$scope.formValues.DriverOptions.splice(index, 1);
|
||||||
};
|
};
|
||||||
|
|
||||||
function createVolume(config) {
|
$scope.create = function () {
|
||||||
$('#createVolumeSpinner').show();
|
$('#createVolumeSpinner').show();
|
||||||
Volume.create(config, function (d) {
|
|
||||||
if (d.message) {
|
var name = $scope.formValues.Name;
|
||||||
$('#createVolumeSpinner').hide();
|
var driver = $scope.formValues.Driver;
|
||||||
Messages.error('Unable to create volume', {}, d.message);
|
var driverOptions = $scope.formValues.DriverOptions;
|
||||||
} else {
|
var volumeConfiguration = VolumeService.createVolumeConfiguration(name, driver, driverOptions);
|
||||||
|
|
||||||
|
VolumeService.createVolume(volumeConfiguration)
|
||||||
|
.then(function success(data) {
|
||||||
if ($scope.formValues.Ownership === 'private') {
|
if ($scope.formValues.Ownership === 'private') {
|
||||||
ResourceControlService.setVolumeResourceControl(Authentication.getUserDetails().ID, d.Name)
|
ResourceControlService.setVolumeResourceControl(Authentication.getUserDetails().ID, data.Name)
|
||||||
.then(function success() {
|
.then(function success() {
|
||||||
Messages.send("Volume created", d.Name);
|
Messages.send("Volume created", data.Name);
|
||||||
$('#createVolumeSpinner').hide();
|
|
||||||
$state.go('volumes', {}, {reload: true});
|
$state.go('volumes', {}, {reload: true});
|
||||||
})
|
})
|
||||||
.catch(function error(err) {
|
.catch(function error(err) {
|
||||||
$('#createVolumeSpinner').hide();
|
|
||||||
Messages.error("Failure", err, 'Unable to apply resource control on volume');
|
Messages.error("Failure", err, 'Unable to apply resource control on volume');
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
Messages.send("Volume created", d.Name);
|
Messages.send("Volume created", data.Name);
|
||||||
$('#createVolumeSpinner').hide();
|
|
||||||
$state.go('volumes', {}, {reload: true});
|
$state.go('volumes', {}, {reload: true});
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
}, function (e) {
|
.catch(function error(err) {
|
||||||
|
Messages.error('Failure', err, 'Unable to create volume');
|
||||||
|
})
|
||||||
|
.finally(function final() {
|
||||||
$('#createVolumeSpinner').hide();
|
$('#createVolumeSpinner').hide();
|
||||||
Messages.error("Failure", e, 'Unable to create volume');
|
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
function prepareDriverOptions(config) {
|
|
||||||
var options = {};
|
|
||||||
$scope.formValues.DriverOptions.forEach(function (option) {
|
|
||||||
options[option.name] = option.value;
|
|
||||||
});
|
|
||||||
config.DriverOpts = options;
|
|
||||||
}
|
|
||||||
|
|
||||||
function prepareConfiguration() {
|
|
||||||
var config = angular.copy($scope.config);
|
|
||||||
prepareDriverOptions(config);
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
|
|
||||||
$scope.create = function () {
|
|
||||||
var config = prepareConfiguration();
|
|
||||||
createVolume(config);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function initView() {
|
||||||
|
$('#loadingViewSpinner').show();
|
||||||
|
InfoService.getVolumePlugins()
|
||||||
|
.then(function success(data) {
|
||||||
|
$scope.availableVolumeDrivers = data;
|
||||||
|
})
|
||||||
|
.catch(function error(err) {
|
||||||
|
Messages.error("Failure", err, 'Unable to retrieve volume plugin information');
|
||||||
|
})
|
||||||
|
.finally(function final() {
|
||||||
|
$('#loadingViewSpinner').hide();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
initView();
|
||||||
}]);
|
}]);
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<rd-header>
|
<rd-header>
|
||||||
<rd-header-title title="Create volume"></rd-header-title>
|
<rd-header-title title="Create volume">
|
||||||
|
<i id="loadingViewSpinner" class="fa fa-cog fa-spin"></i>
|
||||||
|
</rd-header-title>
|
||||||
<rd-header-content>
|
<rd-header-content>
|
||||||
<a ui-sref="volumes">Volumes</a> > Add volume
|
<a ui-sref="volumes">Volumes</a> > Add volume
|
||||||
</rd-header-content>
|
</rd-header-content>
|
||||||
|
@ -14,7 +16,7 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="volume_name" class="col-sm-1 control-label text-left">Name</label>
|
<label for="volume_name" class="col-sm-1 control-label text-left">Name</label>
|
||||||
<div class="col-sm-11">
|
<div class="col-sm-11">
|
||||||
<input type="text" class="form-control" ng-model="config.Name" id="volume_name" placeholder="e.g. myVolume">
|
<input type="text" class="form-control" ng-model="formValues.Name" id="volume_name" placeholder="e.g. myVolume">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- !name-input -->
|
<!-- !name-input -->
|
||||||
|
@ -25,7 +27,10 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="volume_driver" class="col-sm-1 control-label text-left">Driver</label>
|
<label for="volume_driver" class="col-sm-1 control-label text-left">Driver</label>
|
||||||
<div class="col-sm-11">
|
<div class="col-sm-11">
|
||||||
<input type="text" class="form-control" ng-model="config.Driver" id="volume_driver" placeholder="e.g. driverName">
|
<select class="form-control" ng-options="driver for driver in availableVolumeDrivers" ng-model="formValues.Driver" ng-if="availableVolumeDrivers.length > 0">
|
||||||
|
<option disabled hidden value="">Select a driver</option>
|
||||||
|
</select>
|
||||||
|
<input type="text" class="form-control" ng-model="formValues.Driver" id="volume_driver" placeholder="e.g. driverName" ng-if="availableVolumeDrivers.length === 0">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- !driver-input -->
|
<!-- !driver-input -->
|
||||||
|
|
15
app/helpers/volumeHelper.js
Normal file
15
app/helpers/volumeHelper.js
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
angular.module('portainer.helpers')
|
||||||
|
.factory('VolumeHelper', [function VolumeHelperFactory() {
|
||||||
|
'use strict';
|
||||||
|
var helper = {};
|
||||||
|
|
||||||
|
helper.createDriverOptions = function(optionArray) {
|
||||||
|
var options = {};
|
||||||
|
optionArray.forEach(function (option) {
|
||||||
|
options[option.name] = option.value;
|
||||||
|
});
|
||||||
|
return options;
|
||||||
|
};
|
||||||
|
|
||||||
|
return helper;
|
||||||
|
}]);
|
20
app/services/infoService.js
Normal file
20
app/services/infoService.js
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
angular.module('portainer.services')
|
||||||
|
.factory('InfoService', ['$q', 'Info', function InfoServiceFactory($q, Info) {
|
||||||
|
'use strict';
|
||||||
|
var service = {};
|
||||||
|
|
||||||
|
service.getVolumePlugins = function() {
|
||||||
|
var deferred = $q.defer();
|
||||||
|
Info.get({}).$promise
|
||||||
|
.then(function success(data) {
|
||||||
|
var plugins = data.Plugins.Volume;
|
||||||
|
deferred.resolve(plugins);
|
||||||
|
})
|
||||||
|
.catch(function error(err) {
|
||||||
|
deferred.reject({msg: 'Unable to retrieve volume plugin information', err: err});
|
||||||
|
});
|
||||||
|
return deferred.promise;
|
||||||
|
};
|
||||||
|
|
||||||
|
return service;
|
||||||
|
}]);
|
|
@ -1,5 +1,5 @@
|
||||||
angular.module('portainer.services')
|
angular.module('portainer.services')
|
||||||
.factory('VolumeService', ['$q', 'Volume', function VolumeServiceFactory($q, Volume) {
|
.factory('VolumeService', ['$q', 'Volume', 'VolumeHelper', function VolumeServiceFactory($q, Volume, VolumeHelper) {
|
||||||
'use strict';
|
'use strict';
|
||||||
var service = {};
|
var service = {};
|
||||||
|
|
||||||
|
@ -7,27 +7,14 @@ angular.module('portainer.services')
|
||||||
return Volume.query({}).$promise;
|
return Volume.query({}).$promise;
|
||||||
};
|
};
|
||||||
|
|
||||||
function prepareVolumeQueries(template, containerConfig) {
|
service.createVolumeConfiguration = function(name, driver, driverOptions) {
|
||||||
var volumeQueries = [];
|
var volumeConfiguration = {
|
||||||
if (template.volumes) {
|
Name: name,
|
||||||
template.volumes.forEach(function (vol) {
|
Driver: driver,
|
||||||
volumeQueries.push(
|
DriverOpts: VolumeHelper.createDriverOptions(driverOptions)
|
||||||
Volume.create({}, function (d) {
|
};
|
||||||
if (d.message) {
|
return volumeConfiguration;
|
||||||
Messages.error("Unable to create volume", {}, d.message);
|
};
|
||||||
} else {
|
|
||||||
Messages.send("Volume created", d.Name);
|
|
||||||
containerConfig.Volumes[vol] = {};
|
|
||||||
containerConfig.HostConfig.Binds.push(d.Name + ':' + vol);
|
|
||||||
}
|
|
||||||
}, function (e) {
|
|
||||||
Messages.error("Failure", e, "Unable to create volume");
|
|
||||||
}).$promise
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return volumeQueries;
|
|
||||||
}
|
|
||||||
|
|
||||||
service.createVolume = function(volumeConfiguration) {
|
service.createVolume = function(volumeConfiguration) {
|
||||||
var deferred = $q.defer();
|
var deferred = $q.defer();
|
||||||
|
@ -45,9 +32,9 @@ angular.module('portainer.services')
|
||||||
return deferred.promise;
|
return deferred.promise;
|
||||||
};
|
};
|
||||||
|
|
||||||
service.createVolumes = function(volumes) {
|
service.createVolumes = function(volumeConfigurations) {
|
||||||
var createVolumeQueries = volumes.map(function(volume) {
|
var createVolumeQueries = volumeConfigurations.map(function(volumeConfiguration) {
|
||||||
return service.createVolume(volume);
|
return service.createVolume(volumeConfiguration);
|
||||||
});
|
});
|
||||||
return $q.all(createVolumeQueries);
|
return $q.all(createVolumeQueries);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue