1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-08-08 23:35:31 +02:00

feat(app): add the capability to enable/disable host management features (#2472)

* feat(settings): add the capability to enable/disable the host management features

* feat(settings): remove the validation of EnableHostManagementFeatures in frontend

* feat(api): disable schedules API when HostManagementFeatures is false + DB migration

* style(settings): update host management settings tooltip

* refacot(schedules): update DBVersion to 15
This commit is contained in:
baron_l 2018-12-05 23:36:25 +01:00 committed by Anthony Lapenna
parent 101bb41587
commit a9b107dbb5
27 changed files with 128 additions and 9 deletions

View file

@ -12,23 +12,23 @@
<host-details-panel
host="$ctrl.hostDetails"
is-browse-enabled="$ctrl.isAgent && $ctrl.agentApiVersion > 1 && !$ctrl.offlineMode"
is-browse-enabled="$ctrl.isAgent && $ctrl.agentApiVersion > 1 && !$ctrl.offlineMode && $ctrl.hostFeaturesEnabled"
browse-url="{{$ctrl.browseUrl}}"
is-job-enabled="$ctrl.isJobEnabled && !$ctrl.offlineMode"
is-job-enabled="$ctrl.isJobEnabled && !$ctrl.offlineMode && $ctrl.hostFeaturesEnabled"
job-url="{{$ctrl.jobUrl}}"
></host-details-panel>
<engine-details-panel engine="$ctrl.engineDetails"></engine-details-panel>
<jobs-datatable
ng-if="$ctrl.isJobEnabled && $ctrl.jobs && !$ctrl.offlineMode"
ng-if="$ctrl.isJobEnabled && $ctrl.jobs && !$ctrl.offlineMode && $ctrl.hostFeaturesEnabled"
title-text="Jobs" title-icon="fa-tasks"
dataset="$ctrl.jobs"
table-key="jobs"
order-by="Created" reverse-order="true"
></jobs-datatable>
<devices-panel ng-if="$ctrl.isAgent && $ctrl.agentApiVersion > 1 && !$ctrl.offlineMode" devices="$ctrl.devices"></devices-panel>
<disks-panel ng-if="$ctrl.isAgent && $ctrl.agentApiVersion > 1 && !$ctrl.offlineMode" disks="$ctrl.disks"></disks-panel>
<devices-panel ng-if="$ctrl.isAgent && $ctrl.agentApiVersion > 1 && !$ctrl.offlineMode && $ctrl.hostFeaturesEnabled" devices="$ctrl.devices"></devices-panel>
<disks-panel ng-if="$ctrl.isAgent && $ctrl.agentApiVersion > 1 && !$ctrl.offlineMode && $ctrl.hostFeaturesEnabled" disks="$ctrl.disks"></disks-panel>
<ng-transclude></ng-transclude>

View file

@ -12,6 +12,7 @@ angular.module('portainer.docker').component('hostOverview', {
browseUrl: '@',
jobUrl: '@',
isJobEnabled: '<',
hostFeaturesEnabled: '<',
jobs: '<'
},
transclude: true

View file

@ -22,6 +22,7 @@ angular.module('portainer.docker').controller('HostViewController', [
ctrl.state.isAdmin = Authentication.getUserDetails().role === 1;
var agentApiVersion = applicationState.endpoint.agentApiVersion;
ctrl.state.agentApiVersion = agentApiVersion;
ctrl.state.enableHostManagementFeatures = applicationState.application.enableHostManagementFeatures;
$q.all({
version: SystemService.version(),

View file

@ -9,6 +9,7 @@
browse-url="docker.host.browser"
offline-mode="$ctrl.state.offlineMode"
is-job-enabled="$ctrl.state.isAdmin && !$ctrl.state.offlineMode"
host-features-enabled="$ctrl.state.enableHostManagementFeatures"
job-url="docker.host.job"
jobs="$ctrl.jobs"
></host-overview>

View file

@ -14,6 +14,7 @@ angular.module('portainer.docker').controller('NodeDetailsViewController', [
var applicationState = StateManager.getState();
ctrl.state.isAgent = applicationState.endpoint.mode.agentProxy;
ctrl.state.isAdmin = Authentication.getUserDetails().role === 1;
ctrl.state.enableHostManagementFeatures = applicationState.application.enableHostManagementFeatures;
var fetchJobs = ctrl.state.isAdmin && ctrl.state.isAgent;

View file

@ -8,6 +8,7 @@
refresh-url="docker.nodes.node"
browse-url="docker.nodes.node.browse"
is-job-enabled="$ctrl.state.isAdmin && $ctrl.state.isAgent"
host-features-enabled="$ctrl.state.enableHostManagementFeatures"
job-url="docker.nodes.node.job"
jobs="$ctrl.jobs"
>

View file

@ -8,6 +8,7 @@ function SettingsViewModel(data) {
this.SnapshotInterval = data.SnapshotInterval;
this.TemplatesURL = data.TemplatesURL;
this.ExternalTemplates = data.ExternalTemplates;
this.EnableHostManagementFeatures = data.EnableHostManagementFeatures;
}
function LDAPSettingsViewModel(data) {

View file

@ -43,6 +43,11 @@ function StateManagerFactory($q, SystemService, InfoHelper, LocalStorage, Settin
LocalStorage.storeApplicationState(state.application);
};
manager.updateEnableHostManagementFeatures = function(enableHostManagementFeatures) {
state.application.enableHostManagementFeatures = enableHostManagementFeatures;
LocalStorage.storeApplicationState(state.application);
};
function assignStateFromStatusAndSettings(status, settings) {
state.application.authentication = status.Authentication;
state.application.analytics = status.Analytics;
@ -51,6 +56,7 @@ function StateManagerFactory($q, SystemService, InfoHelper, LocalStorage, Settin
state.application.version = status.Version;
state.application.logo = settings.LogoURL;
state.application.snapshotInterval = settings.SnapshotInterval;
state.application.enableHostManagementFeatures = settings.EnableHostManagementFeatures;
state.application.validity = moment().unix();
}

View file

@ -101,6 +101,17 @@
</label>
</div>
</div>
<div class="form-group">
<div class="col-sm-12">
<label for="toggle_enableHostManagementFeatures" class="control-label text-left">
Enable host management features
<portainer-tooltip position="bottom" message="Enables host management features: host scheduler, host browsing and command execution. Requires an agent setup."></portainer-tooltip>
</label>
<label class="switch" style="margin-left: 20px;">
<input type="checkbox" name="toggle_enableHostManagementFeatures" ng-model="formValues.enableHostManagementFeatures"><i></i>
</label>
</div>
</div>
<!-- security -->
<!-- actions -->
<div class="form-group">

View file

@ -12,7 +12,8 @@ function ($scope, $state, Notifications, SettingsService, StateManager) {
restrictBindMounts: false,
restrictPrivilegedMode: false,
labelName: '',
labelValue: ''
labelValue: '',
enableHostManagementFeatures: false
};
$scope.removeFilteredContainerLabel = function(index) {
@ -46,6 +47,7 @@ function ($scope, $state, Notifications, SettingsService, StateManager) {
settings.AllowBindMountsForRegularUsers = !$scope.formValues.restrictBindMounts;
settings.AllowPrivilegedModeForRegularUsers = !$scope.formValues.restrictPrivilegedMode;
settings.EnableHostManagementFeatures = $scope.formValues.enableHostManagementFeatures;
$scope.state.actionInProgress = true;
updateSettings(settings);
@ -57,6 +59,7 @@ function ($scope, $state, Notifications, SettingsService, StateManager) {
Notifications.success('Settings updated');
StateManager.updateLogo(settings.LogoURL);
StateManager.updateSnapshotInterval(settings.SnapshotInterval);
StateManager.updateEnableHostManagementFeatures(settings.EnableHostManagementFeatures);
$state.reload();
})
.catch(function error(err) {
@ -80,6 +83,7 @@ function ($scope, $state, Notifications, SettingsService, StateManager) {
}
$scope.formValues.restrictBindMounts = !settings.AllowBindMountsForRegularUsers;
$scope.formValues.restrictPrivilegedMode = !settings.AllowPrivilegedModeForRegularUsers;
$scope.formValues.enableHostManagementFeatures = settings.EnableHostManagementFeatures;
})
.catch(function error(err) {
Notifications.error('Failure', err, 'Unable to retrieve application settings');

View file

@ -36,10 +36,10 @@
<a ui-sref="storidge.profiles" ui-sref-active="active">Profiles</a>
</div>
</li>
<li class="sidebar-title" ng-if="!applicationState.application.authentication || isAdmin">
<li class="sidebar-title" ng-if="(!applicationState.application.authentication || isAdmin) && applicationState.application.enableHostManagementFeatures">
<span>Scheduler</span>
</li>
<li class="sidebar-list" ng-if="!applicationState.application.authentication || isAdmin">
<li class="sidebar-list" ng-if="(!applicationState.application.authentication || isAdmin) && applicationState.application.enableHostManagementFeatures">
<a ui-sref="portainer.schedules" ui-sref-active="active">Host jobs <span class="menu-icon fa fa-clock fa-fw"></span></a>
</li>
<li class="sidebar-title" ng-if="!applicationState.application.authentication || isAdmin || isTeamLeader">