mirror of https://github.com/portainer/portainer
				
				
				
			Catch plaintext errors for creation and connection, implement network creation,
							parent
							
								
									8a4be8b93a
								
							
						
					
					
						commit
						5f4641af67
					
				| 
						 | 
				
			
			@ -3,14 +3,14 @@ angular.module('network', []).config(['$routeProvider', function ($routeProvider
 | 
			
		|||
        templateUrl: 'app/components/network/network.html',
 | 
			
		||||
        controller: 'NetworkController'
 | 
			
		||||
    });
 | 
			
		||||
}]).controller('NetworkController', ['$scope', 'Network', 'ViewSpinner', 'Messages', '$routeParams', '$location',
 | 
			
		||||
    function ($scope, Network, ViewSpinner, Messages, $routeParams, $location) {
 | 
			
		||||
}]).controller('NetworkController', ['$scope', 'Network', 'ViewSpinner', 'Messages', '$routeParams', '$location', 'errorMsgFilter',
 | 
			
		||||
    function ($scope, Network, ViewSpinner, Messages, $routeParams, $location, errorMsgFilter) {
 | 
			
		||||
 | 
			
		||||
        $scope.disconnect = function disconnect(networkId, containerId) {
 | 
			
		||||
            ViewSpinner.spin();
 | 
			
		||||
            Network.disconnect({id: $routeParams.id}, {Container: containerId}, function (d) {
 | 
			
		||||
                ViewSpinner.stop();
 | 
			
		||||
                Messages.send("Container disconnected", d);
 | 
			
		||||
                Messages.send("Container disconnected", containerId);
 | 
			
		||||
                $location.path('/networks/' + $routeParams.id); // Refresh the current page.
 | 
			
		||||
            }, function (e) {
 | 
			
		||||
                ViewSpinner.stop();
 | 
			
		||||
| 
						 | 
				
			
			@ -21,7 +21,12 @@ angular.module('network', []).config(['$routeProvider', function ($routeProvider
 | 
			
		|||
            ViewSpinner.spin();
 | 
			
		||||
            Network.connect({id: $routeParams.id}, {Container: containerId}, function (d) {
 | 
			
		||||
                ViewSpinner.stop();
 | 
			
		||||
                Messages.send("Container connected", d);
 | 
			
		||||
                var errmsg = errorMsgFilter(d);
 | 
			
		||||
                if (errmsg) {
 | 
			
		||||
                    Messages.error('Error', errmsg);
 | 
			
		||||
                } else {
 | 
			
		||||
                    Messages.send("Container connected", d);
 | 
			
		||||
                }
 | 
			
		||||
                $location.path('/networks/' + $routeParams.id); // Refresh the current page.
 | 
			
		||||
            }, function (e) {
 | 
			
		||||
                ViewSpinner.stop();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,7 +32,7 @@
 | 
			
		|||
    </thead>
 | 
			
		||||
    <tbody>
 | 
			
		||||
    <tr ng-repeat="network in networks | filter:filter | orderBy:predicate">
 | 
			
		||||
        <td><input type="checkbox" ng-model="image.Checked"/></td>
 | 
			
		||||
        <td><input type="checkbox" ng-model="network.Checked"/></td>
 | 
			
		||||
        <td><a href="#/networks/{{ network.Id }}/">{{ network.Name|truncate:20}}</a></td>
 | 
			
		||||
        <td>{{ network.Id }}</td>
 | 
			
		||||
        <td>{{ network.Scope }}</td>
 | 
			
		||||
| 
						 | 
				
			
			@ -59,17 +59,17 @@
 | 
			
		|||
            <div class="form-group">
 | 
			
		||||
                <label>Subnet:</label>
 | 
			
		||||
                <input type="text" placeholder='172.20.0.0/16'
 | 
			
		||||
                       ng-model="createNetworkConfig.Subnet" class="form-control"/>
 | 
			
		||||
                       ng-model="createNetworkConfig.IPAM.Config[0].Subnet" class="form-control"/>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label>IPRange:</label>
 | 
			
		||||
                <input type="text" placeholder='172.20.10.0/24'
 | 
			
		||||
                       ng-model="createNetworkConfig.IPRange" class="form-control"/>
 | 
			
		||||
                       ng-model="createNetworkConfig.IPAM.Config[0].IPRange" class="form-control"/>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label>Gateway:</label>
 | 
			
		||||
                <input type="text" placeholder='172.20.10.11'
 | 
			
		||||
                       ng-model="createNetworkConfig.Gateway" class="form-control"/>
 | 
			
		||||
                       ng-model="createNetworkConfig.IPAM.Config[0].Gateway" class="form-control"/>
 | 
			
		||||
            </div>
 | 
			
		||||
            <button type="button" class="btn btn-success btn-sm"
 | 
			
		||||
                    ng-click="addNetwork(createNetworkConfig)">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,10 +3,23 @@ angular.module('networks', []).config(['$routeProvider', function ($routeProvide
 | 
			
		|||
        templateUrl: 'app/components/networks/networks.html',
 | 
			
		||||
        controller: 'NetworksController'
 | 
			
		||||
    });
 | 
			
		||||
}]).controller('NetworksController', ['$scope', 'Network', 'ViewSpinner', 'Messages',
 | 
			
		||||
    function ($scope, Network, ViewSpinner, Messages) {
 | 
			
		||||
}]).controller('NetworksController', ['$scope', 'Network', 'ViewSpinner', 'Messages', '$route', 'errorMsgFilter',
 | 
			
		||||
    function ($scope, Network, ViewSpinner, Messages, $route, errorMsgFilter) {
 | 
			
		||||
        $scope.toggle = false;
 | 
			
		||||
        //$scope.predicate = '-Created';
 | 
			
		||||
        $scope.predicate = '-Created';
 | 
			
		||||
        $scope.createNetworkConfig = {
 | 
			
		||||
            "Name": '',
 | 
			
		||||
            "Driver": '',
 | 
			
		||||
            "IPAM": {
 | 
			
		||||
                "Config": [{
 | 
			
		||||
                    "Subnet": '',
 | 
			
		||||
                    "IPRange": '',
 | 
			
		||||
                    "Gateway": ''
 | 
			
		||||
                }]
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        $scope.removeAction = function () {
 | 
			
		||||
            ViewSpinner.spin();
 | 
			
		||||
| 
						 | 
				
			
			@ -21,7 +34,7 @@ angular.module('networks', []).config(['$routeProvider', function ($routeProvide
 | 
			
		|||
                if (network.Checked) {
 | 
			
		||||
                    counter = counter + 1;
 | 
			
		||||
                    Network.remove({id: network.Id}, function (d) {
 | 
			
		||||
                        Messages.send("Network deleted", resource.Deleted);
 | 
			
		||||
                        Messages.send("Network deleted", network.Id);
 | 
			
		||||
                        var index = $scope.networks.indexOf(network);
 | 
			
		||||
                        $scope.networks.splice(index, 1);
 | 
			
		||||
                        complete();
 | 
			
		||||
| 
						 | 
				
			
			@ -34,17 +47,36 @@ angular.module('networks', []).config(['$routeProvider', function ($routeProvide
 | 
			
		|||
        };
 | 
			
		||||
 | 
			
		||||
        $scope.toggleSelectAll = function () {
 | 
			
		||||
            angular.forEach($scope.images, function (i) {
 | 
			
		||||
            angular.forEach($scope.networks, function (i) {
 | 
			
		||||
                i.Checked = $scope.toggle;
 | 
			
		||||
            });
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        ViewSpinner.spin();
 | 
			
		||||
        Network.query({}, function (d) {
 | 
			
		||||
            $scope.networks = d;
 | 
			
		||||
            ViewSpinner.stop();
 | 
			
		||||
        }, function (e) {
 | 
			
		||||
            Messages.error("Failure", e.data);
 | 
			
		||||
            ViewSpinner.stop();
 | 
			
		||||
        });
 | 
			
		||||
        $scope.addNetwork = function addNetwork(createNetworkConfig) {
 | 
			
		||||
            ViewSpinner.spin();
 | 
			
		||||
            Network.create(createNetworkConfig, function (d) {
 | 
			
		||||
                if (d.Id) {
 | 
			
		||||
                    Messages.send("Network created", d.Id);
 | 
			
		||||
                } else {
 | 
			
		||||
                    Messages.error('Failure', errorMsgFilter(d));
 | 
			
		||||
                }
 | 
			
		||||
                ViewSpinner.stop();
 | 
			
		||||
                fetchNetworks();
 | 
			
		||||
            }, function (e) {
 | 
			
		||||
                Messages.error("Failure", e.data);
 | 
			
		||||
                ViewSpinner.stop();
 | 
			
		||||
            });
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        function fetchNetworks() {
 | 
			
		||||
            ViewSpinner.spin();
 | 
			
		||||
            Network.query({}, function (d) {
 | 
			
		||||
                $scope.networks = d;
 | 
			
		||||
                ViewSpinner.stop();
 | 
			
		||||
            }, function (e) {
 | 
			
		||||
                Messages.error("Failure", e.data);
 | 
			
		||||
                ViewSpinner.stop();
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        fetchNetworks();
 | 
			
		||||
    }]);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,107 @@
 | 
			
		|||
describe('NetworksController', function () {
 | 
			
		||||
    var $scope, $httpBackend, $routeParams;
 | 
			
		||||
 | 
			
		||||
    beforeEach(module('dockerui'));
 | 
			
		||||
    beforeEach(inject(function (_$httpBackend_, $controller, _$routeParams_) {
 | 
			
		||||
        $scope = {};
 | 
			
		||||
        $httpBackend = _$httpBackend_;
 | 
			
		||||
        $routeParams = _$routeParams_;
 | 
			
		||||
        $controller('NetworksController', {
 | 
			
		||||
            '$scope': $scope,
 | 
			
		||||
            '$routeParams': $routeParams
 | 
			
		||||
        });
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    it('initializes correctly', function () {
 | 
			
		||||
        expectGetNetwork();
 | 
			
		||||
        $httpBackend.flush();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    it('issues correct remove calls to the remote API', function () {
 | 
			
		||||
        expectGetNetwork();
 | 
			
		||||
        $httpBackend.flush();
 | 
			
		||||
        $scope.networks[0].Checked = true;
 | 
			
		||||
        $scope.networks[2].Checked = true;
 | 
			
		||||
        $httpBackend.expectDELETE('dockerapi/networks/f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566').respond(204);
 | 
			
		||||
        $httpBackend.expectDELETE('dockerapi/networks/13e871235c677f196c4e1ecebb9dc733b9b2d2ab589e30c539efeda84a24215e').respond(204);
 | 
			
		||||
        $scope.removeAction();
 | 
			
		||||
        $httpBackend.flush();
 | 
			
		||||
    });
 | 
			
		||||
    it('issues a correct network creation call to the remote API', function () {
 | 
			
		||||
        expectGetNetwork();
 | 
			
		||||
        var createBody = {
 | 
			
		||||
            "Name":"isolated_nw",
 | 
			
		||||
            "Driver":"bridge",
 | 
			
		||||
            "IPAM":{
 | 
			
		||||
                "Config":[{
 | 
			
		||||
                    "Subnet":"172.20.0.0/16",
 | 
			
		||||
                    "IPRange":"172.20.10.0/24",
 | 
			
		||||
                    "Gateway":"172.20.10.11"
 | 
			
		||||
                }]
 | 
			
		||||
            }};
 | 
			
		||||
        $httpBackend.expectPOST('dockerapi/networks/create', createBody).respond(201);
 | 
			
		||||
        expectGetNetwork();
 | 
			
		||||
        $scope.addNetwork(createBody);
 | 
			
		||||
        $httpBackend.flush();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    function expectGetNetwork() {
 | 
			
		||||
        $httpBackend.expectGET('dockerapi/networks').respond([
 | 
			
		||||
            {
 | 
			
		||||
                "Name": "bridge",
 | 
			
		||||
                "Id": "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566",
 | 
			
		||||
                "Scope": "local",
 | 
			
		||||
                "Driver": "bridge",
 | 
			
		||||
                "IPAM": {
 | 
			
		||||
                    "Driver": "default",
 | 
			
		||||
                    "Config": [
 | 
			
		||||
                        {
 | 
			
		||||
                            "Subnet": "172.17.0.0/16"
 | 
			
		||||
                        }
 | 
			
		||||
                    ]
 | 
			
		||||
                },
 | 
			
		||||
                "Containers": {
 | 
			
		||||
                    "39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867": {
 | 
			
		||||
                        "EndpointID": "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda",
 | 
			
		||||
                        "MacAddress": "02:42:ac:11:00:02",
 | 
			
		||||
                        "IPv4Address": "172.17.0.2/16",
 | 
			
		||||
                        "IPv6Address": ""
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                "Options": {
 | 
			
		||||
                    "com.docker.network.bridge.default_bridge": "true",
 | 
			
		||||
                    "com.docker.network.bridge.enable_icc": "true",
 | 
			
		||||
                    "com.docker.network.bridge.enable_ip_masquerade": "true",
 | 
			
		||||
                    "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
 | 
			
		||||
                    "com.docker.network.bridge.name": "docker0",
 | 
			
		||||
                    "com.docker.network.driver.mtu": "1500"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "Name": "none",
 | 
			
		||||
                "Id": "e086a3893b05ab69242d3c44e49483a3bbbd3a26b46baa8f61ab797c1088d794",
 | 
			
		||||
                "Scope": "local",
 | 
			
		||||
                "Driver": "null",
 | 
			
		||||
                "IPAM": {
 | 
			
		||||
                    "Driver": "default",
 | 
			
		||||
                    "Config": []
 | 
			
		||||
                },
 | 
			
		||||
                "Containers": {},
 | 
			
		||||
                "Options": {}
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "Name": "host",
 | 
			
		||||
                "Id": "13e871235c677f196c4e1ecebb9dc733b9b2d2ab589e30c539efeda84a24215e",
 | 
			
		||||
                "Scope": "local",
 | 
			
		||||
                "Driver": "host",
 | 
			
		||||
                "IPAM": {
 | 
			
		||||
                    "Driver": "default",
 | 
			
		||||
                    "Config": []
 | 
			
		||||
                },
 | 
			
		||||
                "Containers": {},
 | 
			
		||||
                "Options": {}
 | 
			
		||||
            }
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
		Loading…
	
		Reference in New Issue