diff --git a/app/components/container/containerController.js b/app/components/container/containerController.js index 22acf056c..452a835f8 100644 --- a/app/components/container/containerController.js +++ b/app/components/container/containerController.js @@ -1,6 +1,6 @@ angular.module('container', []) -.controller('ContainerController', ['$scope', '$state','$stateParams', '$filter', 'Container', 'ContainerCommit', 'ContainerService', 'ImageHelper', 'Network', 'Notifications', 'Pagination', 'ModalService', -function ($scope, $state, $stateParams, $filter, Container, ContainerCommit, ContainerService, ImageHelper, Network, Notifications, Pagination, ModalService) { +.controller('ContainerController', ['$scope', '$state','$stateParams', '$filter', 'Container', 'ContainerCommit', 'ContainerService', 'ImageHelper', 'Network', 'NetworkService', 'Notifications', 'Pagination', 'ModalService', +function ($scope, $state, $stateParams, $filter, Container, ContainerCommit, ContainerService, ImageHelper, Network, NetworkService, Notifications, Pagination, ModalService) { $scope.activityTime = 0; $scope.portBindings = []; $scope.config = { @@ -213,25 +213,21 @@ function ($scope, $state, $stateParams, $filter, Container, ContainerCommit, Con }); }; - Network.query({}, function (d) { - var networks = d; - if ($scope.applicationState.endpoint.mode.provider === 'DOCKER_SWARM' || $scope.applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE') { - networks = d.filter(function (network) { - if (network.Scope === 'global') { - return network; - } - }); - networks.push({Name: 'bridge'}); - networks.push({Name: 'host'}); - networks.push({Name: 'none'}); - } - $scope.availableNetworks = networks; - if (!_.find(networks, {'Name': 'bridge'})) { - networks.push({Name: 'nat'}); - } - }, function (e) { - Notifications.error('Failure', e, 'Unable to retrieve networks'); - }); + var provider = $scope.applicationState.endpoint.mode.provider; + var apiVersion = $scope.applicationState.endpoint.apiVersion; + NetworkService.networks( + provider === 'DOCKER_STANDALONE' || provider === 'DOCKER_SWARM_MODE', + false, + provider === 'DOCKER_SWARM_MODE' && apiVersion >= 1.25, + provider === 'DOCKER_SWARM' + ) + .then(function success(data) { + var networks = data; + $scope.availableNetworks = networks; + }) + .catch(function error(err) { + Notifications.error('Failure', err, 'Unable to retrieve networks'); + }); update(); }]); diff --git a/app/components/createContainer/createContainerController.js b/app/components/createContainer/createContainerController.js index 048e3f2ce..bc7163929 100644 --- a/app/components/createContainer/createContainerController.js +++ b/app/components/createContainer/createContainerController.js @@ -1,8 +1,8 @@ // @@OLD_SERVICE_CONTROLLER: this service should be rewritten to use services. // See app/components/templates/templatesController.js as a reference. angular.module('createContainer', []) -.controller('CreateContainerController', ['$q', '$scope', '$state', '$stateParams', '$filter', 'Container', 'ContainerHelper', 'Image', 'ImageHelper', 'Volume', 'Network', 'ResourceControlService', 'Authentication', 'Notifications', 'ContainerService', 'ImageService', 'FormValidator', -function ($q, $scope, $state, $stateParams, $filter, Container, ContainerHelper, Image, ImageHelper, Volume, Network, ResourceControlService, Authentication, Notifications, ContainerService, ImageService, FormValidator) { +.controller('CreateContainerController', ['$q', '$scope', '$state', '$stateParams', '$filter', 'Container', 'ContainerHelper', 'Image', 'ImageHelper', 'Volume', 'NetworkService', 'ResourceControlService', 'Authentication', 'Notifications', 'ContainerService', 'ImageService', 'FormValidator', +function ($q, $scope, $state, $stateParams, $filter, Container, ContainerHelper, Image, ImageHelper, Volume, NetworkService, ResourceControlService, Authentication, Notifications, ContainerService, ImageService, FormValidator) { $scope.formValues = { alwaysPull: true, @@ -240,26 +240,25 @@ function ($q, $scope, $state, $stateParams, $filter, Container, ContainerHelper, Notifications.error('Failure', e, 'Unable to retrieve volumes'); }); - Network.query({}, function (d) { - var networks = d; - if ($scope.applicationState.endpoint.mode.provider === 'DOCKER_SWARM' || $scope.applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE') { - networks = d.filter(function (network) { - if (network.Scope === 'global') { - return network; - } - }); - $scope.globalNetworkCount = networks.length; - networks.push({Name: 'bridge'}); - networks.push({Name: 'host'}); - networks.push({Name: 'none'}); - } - networks.push({Name: 'container'}); + var provider = $scope.applicationState.endpoint.mode.provider; + var apiVersion = $scope.applicationState.endpoint.apiVersion; + NetworkService.networks( + provider === 'DOCKER_STANDALONE' || provider === 'DOCKER_SWARM_MODE', + false, + provider === 'DOCKER_SWARM_MODE' && apiVersion >= 1.25, + provider === 'DOCKER_SWARM' + ) + .then(function success(data) { + var networks = data; + networks.push({ Name: 'container' }); $scope.availableNetworks = networks; - if (!_.find(networks, {'Name': 'bridge'})) { + + if (_.find(networks, {'Name': 'nat'})) { $scope.config.HostConfig.NetworkMode = 'nat'; } - }, function (e) { - Notifications.error('Failure', e, 'Unable to retrieve networks'); + }) + .catch(function error(err) { + Notifications.error('Failure', err, 'Unable to retrieve networks'); }); Container.query({}, function (d) { diff --git a/app/components/createService/createServiceController.js b/app/components/createService/createServiceController.js index a976c8e8c..d7723503d 100644 --- a/app/components/createService/createServiceController.js +++ b/app/components/createService/createServiceController.js @@ -305,10 +305,11 @@ function ($q, $scope, $state, Service, ServiceHelper, SecretHelper, SecretServic function initView() { $('#loadingViewSpinner').show(); var apiVersion = $scope.applicationState.endpoint.apiVersion; + $q.all({ volumes: VolumeService.volumes(), - networks: NetworkService.retrieveSwarmNetworks(), - secrets: apiVersion >= 1.25 ? SecretService.secrets() : [] + secrets: apiVersion >= 1.25 ? SecretService.secrets() : [], + networks: NetworkService.networks(true, true, false, false) }) .then(function success(data) { $scope.availableVolumes = data.volumes; diff --git a/app/components/templates/templatesController.js b/app/components/templates/templatesController.js index 5b62b5b1b..9a8d90455 100644 --- a/app/components/templates/templatesController.js +++ b/app/components/templates/templatesController.js @@ -144,27 +144,20 @@ function ($scope, $q, $state, $stateParams, $anchorScroll, $filter, ContainerSer return containerMapping; } - function filterNetworksBasedOnProvider(networks) { - var endpointProvider = $scope.applicationState.endpoint.mode.provider; - if (endpointProvider === 'DOCKER_SWARM' || endpointProvider === 'DOCKER_SWARM_MODE') { - if (endpointProvider === 'DOCKER_SWARM') { - networks = NetworkService.filterGlobalNetworks(networks); - } else { - networks = NetworkService.filterSwarmModeAttachableNetworks(networks); - } - $scope.globalNetworkCount = networks.length; - NetworkService.addPredefinedLocalNetworks(networks); - } - return networks; - } - function initTemplates() { var templatesKey = $stateParams.key; + var provider = $scope.applicationState.endpoint.mode.provider; + var apiVersion = $scope.applicationState.endpoint.apiVersion; + $q.all({ templates: TemplateService.getTemplates(templatesKey), containers: ContainerService.getContainers(0), - networks: NetworkService.networks(), - volumes: VolumeService.getVolumes() + volumes: VolumeService.getVolumes(), + networks: NetworkService.networks( + provider === 'DOCKER_STANDALONE' || provider === 'DOCKER_SWARM_MODE', + false, + provider === 'DOCKER_SWARM_MODE' && apiVersion >= 1.25, + provider === 'DOCKER_SWARM') }) .then(function success(data) { $scope.templates = data.templates; @@ -174,8 +167,10 @@ function ($scope, $q, $state, $stateParams, $anchorScroll, $filter, ContainerSer }); $scope.availableCategories = _.sortBy(_.uniq(availableCategories)); $scope.runningContainers = data.containers; - $scope.availableNetworks = filterNetworksBasedOnProvider(data.networks); $scope.availableVolumes = data.volumes.Volumes; + var networks = data.networks; + $scope.availableNetworks = networks; + $scope.globalNetworkCount = networks.length; }) .catch(function error(err) { $scope.templates = []; diff --git a/app/services/docker/networkService.js b/app/services/docker/networkService.js index b3bfc236a..013311cf0 100644 --- a/app/services/docker/networkService.js +++ b/app/services/docker/networkService.js @@ -3,21 +3,29 @@ angular.module('portainer.services') 'use strict'; var service = {}; - service.networks = function() { - return Network.query({}).$promise; - }; - - service.retrieveSwarmNetworks = function() { + service.networks = function(localNetworks, swarmNetworks, swarmAttachableNetworks, globalNetworks) { var deferred = $q.defer(); - service.networks() + Network.query({}).$promise .then(function success(data) { - var networks = data.filter(function (network) { - if (network.Scope === 'swarm') { + var networks = data; + + var filteredNetworks = networks.filter(function(network) { + if (localNetworks && network.Scope === 'local') { + return network; + } + if (swarmNetworks && network.Scope === 'swarm') { + return network; + } + if (swarmAttachableNetworks && network.Scope === 'swarm' && network.Attachable === true) { + return network; + } + if (globalNetworks && network.Scope === 'global') { return network; } }); - deferred.resolve(networks); + + deferred.resolve(filteredNetworks); }) .catch(function error(err) { deferred.reject({msg: 'Unable to retrieve networks', err: err}); @@ -26,27 +34,5 @@ angular.module('portainer.services') return deferred.promise; }; - service.filterGlobalNetworks = function(networks) { - return networks.filter(function (network) { - if (network.Scope === 'global') { - return network; - } - }); - }; - - service.filterSwarmModeAttachableNetworks = function(networks) { - return networks.filter(function (network) { - if (network.Scope === 'swarm' && network.Attachable === true) { - return network; - } - }); - }; - - service.addPredefinedLocalNetworks = function(networks) { - networks.push({Scope: 'local', Name: 'bridge'}); - networks.push({Scope: 'local', Name: 'host'}); - networks.push({Scope: 'local', Name: 'none'}); - }; - return service; }]);