mirror of
https://github.com/portainer/portainer.git
synced 2025-07-25 08:19:40 +02:00
feat(networks): group networks for swarm endpoints (#3028)
* feat(networks): group networks for swarm endpoints * fix(networks): display error on networks with 1 sub
This commit is contained in:
parent
552c897b3b
commit
c12ce5a5c7
5 changed files with 118 additions and 31 deletions
|
@ -1,6 +1,8 @@
|
|||
import _ from 'lodash-es';
|
||||
|
||||
angular.module('portainer.docker')
|
||||
.controller('NetworksController', ['$scope', '$state', 'NetworkService', 'Notifications', 'HttpRequestHelper', 'EndpointProvider',
|
||||
function ($scope, $state, NetworkService, Notifications, HttpRequestHelper, EndpointProvider) {
|
||||
.controller('NetworksController', ['$q', '$scope', '$state', 'NetworkService', 'Notifications', 'HttpRequestHelper', 'EndpointProvider', 'AgentService',
|
||||
function ($q, $scope, $state, NetworkService, Notifications, HttpRequestHelper, EndpointProvider, AgentService) {
|
||||
|
||||
$scope.removeAction = function (selectedItems) {
|
||||
var actionCount = selectedItems.length;
|
||||
|
@ -28,13 +30,43 @@ function ($scope, $state, NetworkService, Notifications, HttpRequestHelper, Endp
|
|||
|
||||
$scope.getNetworks = getNetworks;
|
||||
|
||||
function groupSwarmNetworksManagerNodesFirst(networks, agents) {
|
||||
const getRole = (item) => _.find(agents, (agent) => agent.NodeName === item.NodeName).NodeRole;
|
||||
|
||||
const nonSwarmNetworks = _.remove(networks, (item) => item.Scope !== 'swarm')
|
||||
const grouped = _.toArray(_.groupBy(networks, (item) => item.Id));
|
||||
const sorted = _.map(grouped, (arr) => _.sortBy(arr, (item) => getRole(item)));
|
||||
const arr = _.map(sorted, (a) => {
|
||||
const item = a[0];
|
||||
for (let i = 1; i < a.length; i++) {
|
||||
item.Subs.push(a[i]);
|
||||
}
|
||||
return item;
|
||||
});
|
||||
const res = _.concat(arr, ...nonSwarmNetworks);
|
||||
return res;
|
||||
}
|
||||
|
||||
function getNetworks() {
|
||||
NetworkService.networks(true, true, true)
|
||||
.then(function success(data) {
|
||||
$scope.networks = data;
|
||||
const req = {
|
||||
networks: NetworkService.networks(true, true, true)
|
||||
};
|
||||
|
||||
if ($scope.applicationState.endpoint.mode.agentProxy && $scope.applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE') {
|
||||
req.agents = AgentService.agents();
|
||||
}
|
||||
|
||||
$q.all(req)
|
||||
.then((data) => {
|
||||
$scope.offlineMode = EndpointProvider.offlineMode();
|
||||
const networks = _.forEach(data.networks, (item) => item.Subs = []);
|
||||
if ($scope.applicationState.endpoint.mode.agentProxy && $scope.applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE') {
|
||||
$scope.networks = groupSwarmNetworksManagerNodesFirst(data.networks, data.agents);
|
||||
} else {
|
||||
$scope.networks = networks;
|
||||
}
|
||||
})
|
||||
.catch(function error(err) {
|
||||
.catch((err) => {
|
||||
$scope.networks = [];
|
||||
Notifications.error('Failure', err, 'Unable to retrieve networks');
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue