mirror of https://github.com/portainer/portainer
feat(services): add the ability to specify a target for secrets (#1365)
parent
6b9f3dad7a
commit
3ee2e20f8e
|
@ -82,7 +82,7 @@ function ($q, $scope, $state, $timeout, Service, ServiceHelper, ConfigService, C
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.addSecret = function() {
|
$scope.addSecret = function() {
|
||||||
$scope.formValues.Secrets.push({});
|
$scope.formValues.Secrets.push({ overrideTarget: false });
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.removeSecret = function(index) {
|
$scope.removeSecret = function(index) {
|
||||||
|
@ -275,6 +275,9 @@ function ($q, $scope, $state, $timeout, Service, ServiceHelper, ConfigService, C
|
||||||
if (secret.model) {
|
if (secret.model) {
|
||||||
var s = SecretHelper.secretConfig(secret.model);
|
var s = SecretHelper.secretConfig(secret.model);
|
||||||
s.File.Name = s.SecretName;
|
s.File.Name = s.SecretName;
|
||||||
|
if (secret.overrideTarget && secret.target && secret.target !== '') {
|
||||||
|
s.File.Name = secret.target;
|
||||||
|
}
|
||||||
secrets.push(s);
|
secrets.push(s);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<form class="form-horizontal" style="margin-top: 15px;">
|
<form class="form-horizontal" style="margin-top: 15px;">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-12 small text-muted">
|
<div class="col-sm-12 small text-muted">
|
||||||
Secrets will be available under <code>/run/secrets/$SECRET_NAME</code> in containers.
|
By default, secrets will be available under <code>/run/secrets/$SECRET_NAME</code> in containers.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
@ -12,16 +12,26 @@
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 form-inline" style="margin-top: 10px;">
|
<div class="col-sm-12 form-inline" style="margin-top: 10px;">
|
||||||
<div ng-repeat="secret in formValues.Secrets" style="margin-top: 2px;">
|
<div ng-repeat="secret in formValues.Secrets track by $index" style="margin-top: 4px;">
|
||||||
<div class="input-group col-sm-4 input-group-sm">
|
<div class="input-group col-sm-4 input-group-sm">
|
||||||
<span class="input-group-addon">secret</span>
|
<span class="input-group-addon">secret</span>
|
||||||
<select class="form-control" ng-model="secret.model" ng-options="secret.Name for secret in availableSecrets">
|
<select class="form-control" ng-model="secret.model" ng-options="secret.Name for secret in availableSecrets">
|
||||||
<option value="" selected="selected">Select a secret</option>
|
<option value="" selected="selected">Select a secret</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-sm btn-danger" type="button" ng-click="removeSecret($index)">
|
<div class="input-group col-sm-4 input-group-sm" ng-if="applicationState.endpoint.apiVersion >= 1.30 && secret.overrideTarget">
|
||||||
<i class="fa fa-trash" aria-hidden="true"></i>
|
<span class="input-group-addon">target</span>
|
||||||
</button>
|
<input class="form-control" ng-model="secret.target" placeholder="/path/in/container">
|
||||||
|
</div>
|
||||||
|
<div class="input-group col-sm-3 input-group-sm">
|
||||||
|
<div class="btn-group btn-group-sm" ng-if="applicationState.endpoint.apiVersion >= 1.30">
|
||||||
|
<label class="btn btn-primary" ng-model="secret.overrideTarget" uib-btn-radio="false">Default location</label>
|
||||||
|
<label class="btn btn-primary" ng-model="secret.overrideTarget" uib-btn-radio="true">Override</label>
|
||||||
|
</div>
|
||||||
|
<button class="btn btn-sm btn-danger" type="button" ng-click="removeSecret($index)">
|
||||||
|
<i class="fa fa-trash" aria-hidden="true"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -5,10 +5,18 @@
|
||||||
<rd-widget-body classes="no-padding">
|
<rd-widget-body classes="no-padding">
|
||||||
<div class="form-inline" style="padding: 10px;">
|
<div class="form-inline" style="padding: 10px;">
|
||||||
Add a secret:
|
Add a secret:
|
||||||
<select class="form-control" ng-options="secret.Name for secret in secrets" ng-model="newSecret">
|
<select class="form-control" ng-options="secret.Name for secret in secrets" ng-model="state.addSecret.secret">
|
||||||
<option selected disabled hidden value="">Select a secret</option>
|
<option selected disabled hidden value="">Select a secret</option>
|
||||||
</select>
|
</select>
|
||||||
<a class="btn btn-default btn-sm" ng-click="addSecret(service, newSecret)">
|
<div class="form-group" ng-if="applicationState.endpoint.apiVersion >= 1.30 && state.addSecret.override">
|
||||||
|
Target:
|
||||||
|
<input class="form-control" ng-model="state.addSecret.target" placeholder="/path/in/container">
|
||||||
|
</div>
|
||||||
|
<div class="btn-group btn-group-sm" ng-if="applicationState.endpoint.apiVersion >= 1.30">
|
||||||
|
<label class="btn btn-primary" ng-model="state.addSecret.override" uib-btn-radio="false">Default location</label>
|
||||||
|
<label class="btn btn-primary" ng-model="state.addSecret.override" uib-btn-radio="true">Override</label>
|
||||||
|
</div>
|
||||||
|
<a class="btn btn-default btn-sm" ng-click="addSecret(service, state.addSecret)">
|
||||||
<i class="fa fa-plus-circle" aria-hidden="true"></i> add secret
|
<i class="fa fa-plus-circle" aria-hidden="true"></i> add secret
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -75,10 +75,16 @@ function ($q, $scope, $transition$, $state, $location, $timeout, $anchorScroll,
|
||||||
$scope.updateConfig = function updateConfig(service) {
|
$scope.updateConfig = function updateConfig(service) {
|
||||||
updateServiceArray(service, 'ServiceConfigs', service.ServiceConfigs);
|
updateServiceArray(service, 'ServiceConfigs', service.ServiceConfigs);
|
||||||
};
|
};
|
||||||
$scope.addSecret = function addSecret(service, secret) {
|
$scope.addSecret = function addSecret(service, newSecret) {
|
||||||
if (secret && service.ServiceSecrets.filter(function(serviceSecret) { return serviceSecret.Id === secret.Id;}).length === 0) {
|
if (newSecret.secret) {
|
||||||
service.ServiceSecrets.push({ Id: secret.Id, Name: secret.Name, FileName: secret.Name, Uid: '0', Gid: '0', Mode: 444 });
|
var filename = newSecret.secret.Name;
|
||||||
updateServiceArray(service, 'ServiceSecrets', service.ServiceSecrets);
|
if (newSecret.override) {
|
||||||
|
filename = newSecret.target;
|
||||||
|
}
|
||||||
|
if (service.ServiceSecrets.filter(function(serviceSecret) { return serviceSecret.Id === newSecret.secret.Id && serviceSecret.FileName === filename;}).length === 0) {
|
||||||
|
service.ServiceSecrets.push({ Id: newSecret.secret.Id, Name: newSecret.secret.Name, FileName: filename, Uid: '0', Gid: '0', Mode: 444 });
|
||||||
|
updateServiceArray(service, 'ServiceSecrets', service.ServiceSecrets);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
$scope.removeSecret = function removeSecret(service, index) {
|
$scope.removeSecret = function removeSecret(service, index) {
|
||||||
|
@ -358,6 +364,9 @@ function ($q, $scope, $transition$, $state, $location, $timeout, $anchorScroll,
|
||||||
$scope.state.sliderMaxCpu = 32;
|
$scope.state.sliderMaxCpu = 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Default values
|
||||||
|
$scope.state.addSecret = {override: false};
|
||||||
|
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
$anchorScroll();
|
$anchorScroll();
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue