1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-07-22 14:59:41 +02:00

feat(volume-creation): retrieve available drivers from the engine (#751)

This commit is contained in:
Anthony Lapenna 2017-04-01 12:18:46 +02:00 committed by GitHub
parent 53f31ba3b8
commit 50305e0eee
5 changed files with 104 additions and 80 deletions

View file

@ -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) {
$('#createVolumeSpinner').show();
Volume.create(config, function (d) {
if (d.message) {
$('#createVolumeSpinner').hide();
Messages.error('Unable to create volume', {}, d.message);
} else {
if ($scope.formValues.Ownership === 'private') {
ResourceControlService.setVolumeResourceControl(Authentication.getUserDetails().ID, d.Name)
.then(function success() {
Messages.send("Volume created", d.Name);
$('#createVolumeSpinner').hide();
$state.go('volumes', {}, {reload: true});
})
.catch(function error(err) {
$('#createVolumeSpinner').hide();
Messages.error("Failure", err, 'Unable to apply resource control on volume');
});
} else {
Messages.send("Volume created", d.Name);
$('#createVolumeSpinner').hide();
$state.go('volumes', {}, {reload: true});
}
}
}, function (e) {
$('#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 () { $scope.create = function () {
var config = prepareConfiguration(); $('#createVolumeSpinner').show();
createVolume(config);
var name = $scope.formValues.Name;
var driver = $scope.formValues.Driver;
var driverOptions = $scope.formValues.DriverOptions;
var volumeConfiguration = VolumeService.createVolumeConfiguration(name, driver, driverOptions);
VolumeService.createVolume(volumeConfiguration)
.then(function success(data) {
if ($scope.formValues.Ownership === 'private') {
ResourceControlService.setVolumeResourceControl(Authentication.getUserDetails().ID, data.Name)
.then(function success() {
Messages.send("Volume created", data.Name);
$state.go('volumes', {}, {reload: true});
})
.catch(function error(err) {
Messages.error("Failure", err, 'Unable to apply resource control on volume');
});
} else {
Messages.send("Volume created", data.Name);
$state.go('volumes', {}, {reload: true});
}
})
.catch(function error(err) {
Messages.error('Failure', err, 'Unable to create volume');
})
.finally(function final() {
$('#createVolumeSpinner').hide();
});
}; };
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();
}]); }]);

View file

@ -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 -->

View 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;
}]);

View 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;
}]);

View file

@ -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);
}; };