diff --git a/app/components/startContainer/startContainerController.js b/app/components/startContainer/startContainerController.js index de22b2ebe..23837f41d 100644 --- a/app/components/startContainer/startContainerController.js +++ b/app/components/startContainer/startContainerController.js @@ -1,7 +1,14 @@ angular.module('startContainer', []) -.controller('StartContainerController', ['$scope', '$routeParams', '$location', 'Container', 'Messages', -function($scope, $routeParams, $location, Container, Messages) { +.controller('StartContainerController', ['$scope', '$routeParams', '$location', 'Container', 'Messages', 'containernameFilter', +function($scope, $routeParams, $location, Container, Messages, containernameFilter) { $scope.template = 'app/components/startContainer/startcontainer.html'; + + Container.query({all: 1}, function(d) { + $scope.containerNames = d.map(function(container){ + return containernameFilter(container); + }); + }); + $scope.config = { name: '', memory: 0, @@ -9,7 +16,7 @@ function($scope, $routeParams, $location, Container, Messages) { cpuShares: 1024, env: [], commands: '', - volumesFrom: '', + volumesFrom: [], portBindings: [] }; $scope.commandPlaceholder = '["/bin/echo", "Hello world"]'; @@ -28,6 +35,10 @@ function($scope, $routeParams, $location, Container, Messages) { var loc = $location; var s = $scope; + var volumesFrom = $scope.config.volumesFrom.map(function(volume) { + return volume.name; + }); + var env = $scope.config.env.map(function(envar) { return envar.name + '=' + envar.value; }); @@ -60,7 +71,7 @@ function($scope, $routeParams, $location, Container, Messages) { MemorySwap: $scope.config.memorySwap, CpuShares: $scope.config.cpuShares, Cmd: cmds, - VolumesFrom: $scope.config.volumesFrom, + VolumesFrom: volumesFrom, Env: env, ExposedPorts: exposedPorts, HostConfig: { @@ -104,4 +115,13 @@ function($scope, $routeParams, $location, Container, Messages) { var idx = $scope.config.env.indexOf(envar); $scope.config.env.splice(idx, 1); }; + + $scope.addVolume = function() { + $scope.config.volumesFrom.push({name: ''}); + }; + + $scope.removeVolume = function(volume) { + var idx = $scope.config.volumesFrom.indexOf(volume); + $scope.config.volumesFrom.splice(idx, 1); + }; }]); diff --git a/app/components/startContainer/startContainerController.spec.js b/app/components/startContainer/startContainerController.spec.js index 6d7626a19..acdfb9123 100644 --- a/app/components/startContainer/startContainerController.spec.js +++ b/app/components/startContainer/startContainerController.spec.js @@ -1,9 +1,9 @@ -describe('startContainerController', function () { +describe('startContainerController', function() { var scope, $location, createController, mockContainer, $httpBackend; - + beforeEach(angular.mock.module('dockerui')); - beforeEach(inject(function ($rootScope, $controller, _$location_) { + beforeEach(inject(function($rootScope, $controller, _$location_) { $location = _$location_; scope = $rootScope.$new(); @@ -13,13 +13,13 @@ describe('startContainerController', function () { }); }; - angular.mock.inject(function (_Container_, _$httpBackend_) { + angular.mock.inject(function(_Container_, _$httpBackend_) { mockContainer = _Container_; $httpBackend = _$httpBackend_; }); })); - describe('Create and start a container with port bindings', function () { + describe('Create and start a container with port bindings', function() { it('should issue a correct create request to the Docker remote API', function() { var controller = createController(); var id = '6abd8bfba81cf8a05a76a4bdefcb36c4b66cd02265f4bfcd0e236468696ebc6c'; @@ -29,19 +29,36 @@ describe('startContainerController', function () { "MemorySwap": 0, "CpuShares": 1024, "Cmd": null, - "VolumesFrom": "", + "VolumesFrom": [], "Env": [], - "ExposedPorts":{ + "ExposedPorts": { "9000/tcp": {}, }, "HostConfig": { - "PortBindings":{ + "PortBindings": { "9000/tcp": [{ "HostPort": "9999", "HostIp": "10.20.10.15", }] }, - }}; + } + }; + + $httpBackend.expectGET('/dockerapi/containers/json?all=1').respond([{ + "Command": "./dockerui -e /docker.sock", + "Created": 1421817232, + "Id": "b17882378cee8ec0136f482681b764cca430befd52a9bfd1bde031f49b8bba9f", + "Image": "dockerui:latest", + "Names": ["/dockerui"], + "Ports": [{ + "IP": "0.0.0.0", + "PrivatePort": 9000, + "PublicPort": 9000, + "Type": "tcp" + }], + "Status": "Up 2 minutes" + }]); + $httpBackend.expectPOST('/dockerapi/containers/create?name=container-name', expectedBody).respond({ "Id": id, "Warnings": null @@ -52,14 +69,18 @@ describe('startContainerController', function () { }); scope.config.name = 'container-name'; - scope.config.portBindings = [{ip: '10.20.10.15', extPort: '9999', intPort: '9000'}] + scope.config.portBindings = [{ + ip: '10.20.10.15', + extPort: '9999', + intPort: '9000' + }] scope.create(); $httpBackend.flush(); }); }); - describe('Create and start a container with environment variables', function () { + describe('Create and start a container with environment variables', function() { it('should issue a correct create request to the Docker remote API', function() { var controller = createController(); var id = '6abd8bfba81cf8a05a76a4bdefcb36c4b66cd02265f4bfcd0e236468696ebc6c'; @@ -69,11 +90,85 @@ describe('startContainerController', function () { "MemorySwap": 0, "CpuShares": 1024, "Cmd": null, - "VolumesFrom": "", - "Env":["SHELL=/bin/bash", "TERM=xterm-256color"], - "ExposedPorts":{}, - "HostConfig": {"PortBindings":{}} + "VolumesFrom": [], + "Env": ["SHELL=/bin/bash", "TERM=xterm-256color"], + "ExposedPorts": {}, + "HostConfig": { + "PortBindings": {} + } }; + + $httpBackend.expectGET('/dockerapi/containers/json?all=1').respond([{ + "Command": "./dockerui -e /docker.sock", + "Created": 1421817232, + "Id": "b17882378cee8ec0136f482681b764cca430befd52a9bfd1bde031f49b8bba9f", + "Image": "dockerui:latest", + "Names": ["/dockerui"], + "Ports": [{ + "IP": "0.0.0.0", + "PrivatePort": 9000, + "PublicPort": 9000, + "Type": "tcp" + }], + "Status": "Up 2 minutes" + }]); + + $httpBackend.expectPOST('/dockerapi/containers/create?name=container-name', expectedBody).respond({ + "Id": id, + "Warnings": null + }); + $httpBackend.expectPOST('/dockerapi/containers/' + id + '/start?').respond({ + "Id": id, + "Warnings": null + }); + + scope.config.name = 'container-name'; + scope.config.env = [{ + name: 'SHELL', + value: '/bin/bash' + }, { + name: 'TERM', + value: 'xterm-256color' + }]; + + scope.create(); + $httpBackend.flush(); + }); + }); + + describe('Create and start a container with volumesFrom', function() { + it('should issue a correct create request to the Docker remote API', function() { + var controller = createController(); + var id = '6abd8bfba81cf8a05a76a4bdefcb36c4b66cd02265f4bfcd0e236468696ebc6c'; + var expectedBody = { + "name": "container-name", + "Memory": 0, + "MemorySwap": 0, + "CpuShares": 1024, + "Cmd": null, + "VolumesFrom": ["parent", "other:ro"], + "Env": [], + "ExposedPorts": {}, + "HostConfig": { + "PortBindings": {} + } + }; + + $httpBackend.expectGET('/dockerapi/containers/json?all=1').respond([{ + "Command": "./dockerui -e /docker.sock", + "Created": 1421817232, + "Id": "b17882378cee8ec0136f482681b764cca430befd52a9bfd1bde031f49b8bba9f", + "Image": "dockerui:latest", + "Names": ["/dockerui"], + "Ports": [{ + "IP": "0.0.0.0", + "PrivatePort": 9000, + "PublicPort": 9000, + "Type": "tcp" + }], + "Status": "Up 2 minutes" + }]); + $httpBackend.expectPOST('/dockerapi/containers/create?name=container-name', expectedBody).respond({ "Id": id, "Warnings": null @@ -84,10 +179,10 @@ describe('startContainerController', function () { }); scope.config.name = 'container-name'; - scope.config.env = [{name: 'SHELL', value: '/bin/bash'}, {name: 'TERM', value: 'xterm-256color'}]; + scope.config.volumesFrom = [{name: "parent"}, {name:"other:ro"}]; scope.create(); $httpBackend.flush(); }); }); -}); +}); \ No newline at end of file diff --git a/app/components/startContainer/startcontainer.html b/app/components/startContainer/startcontainer.html index ae33055b2..8429bd6c5 100644 --- a/app/components/startContainer/startcontainer.html +++ b/app/components/startContainer/startcontainer.html @@ -30,8 +30,12 @@
- - + +
+