1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-08-05 05:45:22 +02:00

chore(project): add prettier for code format (#3645)

* chore(project): install prettier and lint-staged

* chore(project): apply prettier to html too

* chore(project): git ignore eslintcache

* chore(project): add a comment about format script

* chore(prettier): update printWidth

* chore(prettier): remove useTabs option

* chore(prettier): add HTML validation

* refactor(prettier): fix closing tags

* feat(prettier): define angular parser for html templates

* style(prettier): run prettier on codebase

Co-authored-by: Anthony Lapenna <lapenna.anthony@gmail.com>
This commit is contained in:
Chaim Lev-Ari 2020-04-11 00:54:53 +03:00 committed by GitHub
parent 6663073be1
commit cf5056d9c0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
714 changed files with 31228 additions and 28305 deletions

View file

@ -28,7 +28,7 @@
</tr>
<tr>
<td>Total memory</td>
<td>{{ totalMemory|humansize: 2 }}</td>
<td>{{ totalMemory | humansize: 2 }}</td>
</tr>
<tr>
<td colspan="2">
@ -47,12 +47,14 @@
<div class="row">
<div class="col-sm-12">
<nodes-datatable
title-text="Nodes" title-icon="fa-hdd"
dataset="nodes" table-key="nodes"
order-by="Hostname"
show-ip-address-column="applicationState.endpoint.apiVersion >= 1.25"
access-to-node-details="!applicationState.application.authentication || isAdmin"
refresh-callback="getNodes"
title-text="Nodes"
title-icon="fa-hdd"
dataset="nodes"
table-key="nodes"
order-by="Hostname"
show-ip-address-column="applicationState.endpoint.apiVersion >= 1.25"
access-to-node-details="!applicationState.application.authentication || isAdmin"
refresh-callback="getNodes"
></nodes-datatable>
</div>
</div>

View file

@ -1,101 +1,110 @@
angular.module('portainer.docker')
.controller('SwarmController', ['$q', '$scope', 'SystemService', 'NodeService', 'Notifications', 'StateManager', 'Authentication',
function ($q, $scope, SystemService, NodeService, Notifications, StateManager, Authentication) {
$scope.info = {};
$scope.docker = {};
$scope.swarm = {};
$scope.totalCPU = 0;
$scope.totalMemory = 0;
angular.module('portainer.docker').controller('SwarmController', [
'$q',
'$scope',
'SystemService',
'NodeService',
'Notifications',
'StateManager',
'Authentication',
function ($q, $scope, SystemService, NodeService, Notifications, StateManager, Authentication) {
$scope.info = {};
$scope.docker = {};
$scope.swarm = {};
$scope.totalCPU = 0;
$scope.totalMemory = 0;
function extractSwarmInfo(info) {
// Swarm info is available in SystemStatus object
var systemStatus = info.SystemStatus;
// Swarm strategy
$scope.swarm[systemStatus[1][0]] = systemStatus[1][1];
// Swarm filters
$scope.swarm[systemStatus[2][0]] = systemStatus[2][1];
// Swarm node count
var nodes = systemStatus[0][1] === 'primary' ? systemStatus[3][1] : systemStatus[4][1];
var node_count = parseInt(nodes, 10);
$scope.swarm[systemStatus[3][0]] = node_count;
function extractSwarmInfo(info) {
// Swarm info is available in SystemStatus object
var systemStatus = info.SystemStatus;
// Swarm strategy
$scope.swarm[systemStatus[1][0]] = systemStatus[1][1];
// Swarm filters
$scope.swarm[systemStatus[2][0]] = systemStatus[2][1];
// Swarm node count
var nodes = systemStatus[0][1] === 'primary' ? systemStatus[3][1] : systemStatus[4][1];
var node_count = parseInt(nodes, 10);
$scope.swarm[systemStatus[3][0]] = node_count;
$scope.swarm.Status = [];
extractNodesInfo(systemStatus, node_count);
}
function extractNodesInfo(info, node_count) {
// First information for node1 available at element #4 of SystemStatus if connected to a primary
// If connected to a replica, information for node1 is available at element #5
// The next 10 elements are information related to the node
var node_offset = info[0][1] === 'primary' ? 4 : 5;
for (let i = 0; i < node_count; i++) {
extractNodeInfo(info, node_offset);
node_offset += 9;
}
}
function extractNodeInfo(info, offset) {
var node = {};
node.name = info[offset][0];
node.ip = info[offset][1];
node.Id = info[offset + 1][1];
node.status = info[offset + 2][1];
node.containers = info[offset + 3][1];
node.cpu = info[offset + 4][1].split('/')[1];
node.memory = info[offset + 5][1].split('/')[1];
node.labels = info[offset + 6][1];
node.version = info[offset + 8][1];
$scope.swarm.Status.push(node);
}
function processTotalCPUAndMemory(nodes) {
var CPU = 0, memory = 0;
angular.forEach(nodes, function(node) {
CPU += node.CPUs;
memory += node.Memory;
});
$scope.totalCPU = CPU / 1000000000;
$scope.totalMemory = memory;
}
$scope.getNodes = getNodes;
function getNodes() {
var provider = $scope.applicationState.endpoint.mode.provider;
if (provider === 'DOCKER_SWARM_MODE') {
NodeService.nodes().then(function(data) {
var nodes = data;
processTotalCPUAndMemory(nodes);
$scope.nodes = nodes;
})
.catch(function error(err) {
Notifications.error('Failure', err, 'Unable to retrieve cluster details');
});
}
}
function initView() {
if (StateManager.getState().application.authentication) {
$scope.isAdmin = Authentication.isAdmin();
$scope.swarm.Status = [];
extractNodesInfo(systemStatus, node_count);
}
var provider = $scope.applicationState.endpoint.mode.provider;
$q.all({
version: SystemService.version(),
info: SystemService.info()
})
.then(function success(data) {
$scope.docker = data.version;
$scope.info = data.info;
if (provider === 'DOCKER_SWARM_MODE') {
getNodes();
} else {
extractSwarmInfo(data.info);
function extractNodesInfo(info, node_count) {
// First information for node1 available at element #4 of SystemStatus if connected to a primary
// If connected to a replica, information for node1 is available at element #5
// The next 10 elements are information related to the node
var node_offset = info[0][1] === 'primary' ? 4 : 5;
for (let i = 0; i < node_count; i++) {
extractNodeInfo(info, node_offset);
node_offset += 9;
}
})
.catch(function error(err) {
Notifications.error('Failure', err, 'Unable to retrieve cluster details');
});
}
}
initView();
}]);
function extractNodeInfo(info, offset) {
var node = {};
node.name = info[offset][0];
node.ip = info[offset][1];
node.Id = info[offset + 1][1];
node.status = info[offset + 2][1];
node.containers = info[offset + 3][1];
node.cpu = info[offset + 4][1].split('/')[1];
node.memory = info[offset + 5][1].split('/')[1];
node.labels = info[offset + 6][1];
node.version = info[offset + 8][1];
$scope.swarm.Status.push(node);
}
function processTotalCPUAndMemory(nodes) {
var CPU = 0,
memory = 0;
angular.forEach(nodes, function (node) {
CPU += node.CPUs;
memory += node.Memory;
});
$scope.totalCPU = CPU / 1000000000;
$scope.totalMemory = memory;
}
$scope.getNodes = getNodes;
function getNodes() {
var provider = $scope.applicationState.endpoint.mode.provider;
if (provider === 'DOCKER_SWARM_MODE') {
NodeService.nodes()
.then(function (data) {
var nodes = data;
processTotalCPUAndMemory(nodes);
$scope.nodes = nodes;
})
.catch(function error(err) {
Notifications.error('Failure', err, 'Unable to retrieve cluster details');
});
}
}
function initView() {
if (StateManager.getState().application.authentication) {
$scope.isAdmin = Authentication.isAdmin();
}
var provider = $scope.applicationState.endpoint.mode.provider;
$q.all({
version: SystemService.version(),
info: SystemService.info(),
})
.then(function success(data) {
$scope.docker = data.version;
$scope.info = data.info;
if (provider === 'DOCKER_SWARM_MODE') {
getNodes();
} else {
extractSwarmInfo(data.info);
}
})
.catch(function error(err) {
Notifications.error('Failure', err, 'Unable to retrieve cluster details');
});
}
initView();
},
]);

View file

@ -1,152 +1,156 @@
angular.module('portainer.docker')
.controller('SwarmVisualizerController', ['$q', '$scope', '$document', '$interval', 'NodeService', 'ServiceService', 'TaskService', 'Notifications', 'LocalStorage',
function ($q, $scope, $document, $interval, NodeService, ServiceService, TaskService, Notifications, LocalStorage) {
angular.module('portainer.docker').controller('SwarmVisualizerController', [
'$q',
'$scope',
'$document',
'$interval',
'NodeService',
'ServiceService',
'TaskService',
'Notifications',
'LocalStorage',
function ($q, $scope, $document, $interval, NodeService, ServiceService, TaskService, Notifications, LocalStorage) {
$scope.state = {
ShowInformationPanel: true,
DisplayOnlyRunningTasks: false,
DisplayNodeLabels: false,
refreshRate: '5',
};
$scope.state = {
ShowInformationPanel: true,
DisplayOnlyRunningTasks: false,
DisplayNodeLabels: false,
refreshRate: '5'
};
$scope.$on('$destroy', function () {
stopRepeater();
});
$scope.$on('$destroy', function() {
stopRepeater();
});
$scope.changeShowInformationPanel = function(value) {
$scope.changeShowInformationPanel = function (value) {
$scope.state.ShowInformationPanel = value;
LocalStorage.storeSwarmVisualizerSettings('show_info_panel', value);
};
};
$scope.changeDisplayOnlyRunningTasks = function() {
$scope.changeDisplayOnlyRunningTasks = function () {
var value = $scope.state.DisplayOnlyRunningTasks;
LocalStorage.storeSwarmVisualizerSettings('display_only_running_tasks', value);
};
};
$scope.changeDisplayNodeLabels = function() {
var value = $scope.state.DisplayNodeLabels;
LocalStorage.storeSwarmVisualizerSettings('display_node_labels', value);
};
$scope.changeDisplayNodeLabels = function () {
var value = $scope.state.DisplayNodeLabels;
LocalStorage.storeSwarmVisualizerSettings('display_node_labels', value);
};
$scope.changeUpdateRepeater = function() {
stopRepeater();
setUpdateRepeater();
$('#refreshRateChange').show();
$('#refreshRateChange').fadeOut(1500);
LocalStorage.storeSwarmVisualizerSettings('refresh_rate', $scope.state.refreshRate);
};
$scope.changeUpdateRepeater = function () {
stopRepeater();
setUpdateRepeater();
$('#refreshRateChange').show();
$('#refreshRateChange').fadeOut(1500);
LocalStorage.storeSwarmVisualizerSettings('refresh_rate', $scope.state.refreshRate);
};
function stopRepeater() {
var repeater = $scope.repeater;
if (angular.isDefined(repeater)) {
$interval.cancel(repeater);
repeater = null;
function stopRepeater() {
var repeater = $scope.repeater;
if (angular.isDefined(repeater)) {
$interval.cancel(repeater);
repeater = null;
}
}
}
function setUpdateRepeater() {
var refreshRate = $scope.state.refreshRate;
$scope.repeater = $interval(function() {
function setUpdateRepeater() {
var refreshRate = $scope.state.refreshRate;
$scope.repeater = $interval(function () {
$q.all({
nodes: NodeService.nodes(),
services: ServiceService.services(),
tasks: TaskService.tasks(),
})
.then(function success(data) {
var nodes = data.nodes;
$scope.nodes = nodes;
var services = data.services;
$scope.services = services;
var tasks = data.tasks;
$scope.tasks = tasks;
prepareVisualizerData(nodes, services, tasks);
})
.catch(function error(err) {
stopRepeater();
Notifications.error('Failure', err, 'Unable to retrieve cluster information');
});
}, refreshRate * 1000);
}
function assignServiceInfo(services, tasks) {
for (var i = 0; i < services.length; i++) {
var service = services[i];
for (var j = 0; j < tasks.length; j++) {
var task = tasks[j];
if (task.ServiceId === service.Id) {
task.ServiceName = service.Name;
}
}
}
}
function assignTasksToNode(nodes, tasks) {
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
node.Tasks = [];
for (var j = 0; j < tasks.length; j++) {
var task = tasks[j];
if (task.NodeId === node.Id) {
node.Tasks.push(task);
}
}
}
}
function prepareVisualizerData(nodes, services, tasks) {
var visualizerData = {};
assignServiceInfo(services, tasks);
assignTasksToNode(nodes, tasks);
visualizerData.nodes = nodes;
$scope.visualizerData = visualizerData;
}
function loadState() {
var showInfoPanel = LocalStorage.getSwarmVisualizerSettings('show_info_panel');
if (showInfoPanel !== undefined && showInfoPanel !== null) $scope.state.ShowInformationPanel = showInfoPanel;
var displayOnlyRunningTasks = LocalStorage.getSwarmVisualizerSettings('display_only_running_tasks');
if (displayOnlyRunningTasks !== undefined && displayOnlyRunningTasks !== null) $scope.state.DisplayOnlyRunningTasks = displayOnlyRunningTasks;
var displayNodeLabels = LocalStorage.getSwarmVisualizerSettings('display_node_labels');
if (displayNodeLabels !== undefined && displayNodeLabels !== null) $scope.state.DisplayNodeLabels = displayNodeLabels;
var refreshRate = LocalStorage.getSwarmVisualizerSettings('refresh_rate');
if (refreshRate !== undefined && refreshRate !== null) $scope.state.refreshRate = refreshRate;
}
function initView() {
$q.all({
nodes: NodeService.nodes(),
services: ServiceService.services(),
tasks: TaskService.tasks()
tasks: TaskService.tasks(),
})
.then(function success(data) {
var nodes = data.nodes;
$scope.nodes = nodes;
var services = data.services;
$scope.services = services;
var tasks = data.tasks;
$scope.tasks = tasks;
prepareVisualizerData(nodes, services, tasks);
})
.catch(function error(err) {
stopRepeater();
Notifications.error('Failure', err, 'Unable to retrieve cluster information');
});
}, refreshRate * 1000);
}
.then(function success(data) {
var nodes = data.nodes;
$scope.nodes = nodes;
var services = data.services;
$scope.services = services;
var tasks = data.tasks;
$scope.tasks = tasks;
prepareVisualizerData(nodes, services, tasks);
setUpdateRepeater();
})
.catch(function error(err) {
Notifications.error('Failure', err, 'Unable to initialize cluster visualizer');
});
function assignServiceInfo(services, tasks) {
for (var i = 0; i < services.length; i++) {
var service = services[i];
for (var j = 0; j < tasks.length; j++) {
var task = tasks[j];
if (task.ServiceId === service.Id) {
task.ServiceName = service.Name;
}
}
loadState();
}
}
function assignTasksToNode(nodes, tasks) {
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
node.Tasks = [];
for (var j = 0; j < tasks.length; j++) {
var task = tasks[j];
if (task.NodeId === node.Id) {
node.Tasks.push(task);
}
}
}
}
function prepareVisualizerData(nodes, services, tasks) {
var visualizerData = {};
assignServiceInfo(services, tasks);
assignTasksToNode(nodes, tasks);
visualizerData.nodes = nodes;
$scope.visualizerData = visualizerData;
}
function loadState() {
var showInfoPanel = LocalStorage.getSwarmVisualizerSettings('show_info_panel');
if (showInfoPanel !== undefined && showInfoPanel !== null)
$scope.state.ShowInformationPanel = showInfoPanel;
var displayOnlyRunningTasks = LocalStorage.getSwarmVisualizerSettings('display_only_running_tasks');
if (displayOnlyRunningTasks !== undefined && displayOnlyRunningTasks !== null)
$scope.state.DisplayOnlyRunningTasks = displayOnlyRunningTasks;
var displayNodeLabels = LocalStorage.getSwarmVisualizerSettings('display_node_labels');
if (displayNodeLabels !== undefined && displayNodeLabels !== null)
$scope.state.DisplayNodeLabels = displayNodeLabels;
var refreshRate = LocalStorage.getSwarmVisualizerSettings('refresh_rate');
if (refreshRate !== undefined && refreshRate !== null)
$scope.state.refreshRate = refreshRate;
}
function initView() {
$q.all({
nodes: NodeService.nodes(),
services: ServiceService.services(),
tasks: TaskService.tasks()
})
.then(function success(data) {
var nodes = data.nodes;
$scope.nodes = nodes;
var services = data.services;
$scope.services = services;
var tasks = data.tasks;
$scope.tasks = tasks;
prepareVisualizerData(nodes, services, tasks);
setUpdateRepeater();
})
.catch(function error(err) {
Notifications.error('Failure', err, 'Unable to initialize cluster visualizer');
});
loadState();
}
initView();
}]);
initView();
},
]);

View file

@ -4,9 +4,7 @@
<i class="fa fa-sync" aria-hidden="true"></i>
</a>
</rd-header-title>
<rd-header-content>
<a ui-sref="docker.swarm">Swarm</a> &gt; <a ui-sref="docker.swarm.visualizer">Cluster visualizer</a>
</rd-header-content>
<rd-header-content> <a ui-sref="docker.swarm">Swarm</a> &gt; <a ui-sref="docker.swarm.visualizer">Cluster visualizer</a> </rd-header-content>
</rd-header>
<div class="row">
@ -45,16 +43,14 @@
Only display running tasks
</label>
<label class="switch" style="margin-left: 20px;">
<input type="checkbox" ng-model="state.DisplayOnlyRunningTasks" ng-change="changeDisplayOnlyRunningTasks()"><i></i>
<input type="checkbox" ng-model="state.DisplayOnlyRunningTasks" ng-change="changeDisplayOnlyRunningTasks()" /><i></i>
</label>
</div>
<div class="col-sm-12">
<label class="control-label text-left">
Display node labels
</label>
<label class="switch" style="margin-left: 20px;">
<input type="checkbox" ng-model="state.DisplayNodeLabels" ng-change="changeDisplayNodeLabels()"><i></i>
</label>
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" ng-model="state.DisplayNodeLabels" ng-change="changeDisplayNodeLabels()" /><i></i> </label>
</div>
</div>
</form>
@ -101,22 +97,26 @@
</div>
<div>{{ node.Role }}</div>
<div>CPU: {{ node.CPUs / 1000000000 }}</div>
<div>Memory: {{ node.Memory|humansize: 2 }}</div>
<div><span class="label label-{{ node.Status | nodestatusbadge }}">{{ node.Status }}</span></div>
<div>Memory: {{ node.Memory | humansize: 2 }}</div>
<div
><span class="label label-{{ node.Status | nodestatusbadge }}">{{ node.Status }}</span></div
>
<div class="node_labels" ng-if="node.Labels.length > 0 && state.DisplayNodeLabels">
<div>Labels</div>
<div class="node_label" ng-repeat="label in node.Labels">
<span class="label_key">
{{ label.key }}
</span>
<span class="label_value" ng-if="label.value">
= {{ label.value }}
</span>
<span class="label_value" ng-if="label.value"> = {{ label.value }} </span>
</div>
</div>
</div>
<div class="tasks">
<div class="task task_{{ task.Status.State | visualizerTask }}" style="border: 2px solid {{ task.ServiceId | visualizerTaskBorderColor }}" ng-repeat="task in node.Tasks | orderBy: 'ServiceName' | filter: (state.DisplayOnlyRunningTasks || '') && { Status: { State: 'running' } }">
<div
class="task task_{{ task.Status.State | visualizerTask }}"
style="border: 2px solid {{ task.ServiceId | visualizerTaskBorderColor }}"
ng-repeat="task in node.Tasks | orderBy: 'ServiceName' | filter: (state.DisplayOnlyRunningTasks || '') && { Status: { State: 'running' } }"
>
<div class="service_name">{{ task.ServiceName }}</div>
<div>Image: {{ task.Spec.ContainerSpec.Image | hideshasum }}</div>
<div>Status: {{ task.Status.State }}</div>