Added PortBindings to container start.

pull/2/head
Kevan Ahlquist 2015-01-18 23:20:49 -06:00
parent 77062bec84
commit 76d7e280f9
4 changed files with 128 additions and 4 deletions

View File

@ -9,7 +9,8 @@ function($scope, $routeParams, $location, Container, Messages) {
cpuShares: 1024,
env: '',
commands: '',
volumesFrom: ''
volumesFrom: '',
portBindings: []
};
$scope.commandPlaceholder = '["/bin/echo", "Hello world"]';
@ -27,6 +28,27 @@ function($scope, $routeParams, $location, Container, Messages) {
var loc = $location;
var s = $scope;
var exposedPorts = {};
var portBindings = {};
// TODO: consider using compatibility library
$scope.config.portBindings.forEach(function(portBinding) {
var intPort = portBinding.intPort + "/tcp";
var binding = {
HostIp: portBinding.ip,
HostPort: portBinding.extPort
};
if (portBinding.intPort) {
exposedPorts[intPort] = {};
if (intPort in portBindings) {
portBindings[intPort].push(binding);
} else {
portBindings[intPort] = [binding];
}
} else {
// TODO: Send warning message? Internal port need to be specified.
}
});
Container.create({
Image: id,
name: $scope.config.name,
@ -34,10 +56,19 @@ function($scope, $routeParams, $location, Container, Messages) {
MemorySwap: $scope.config.memorySwap,
CpuShares: $scope.config.cpuShares,
Cmd: cmds,
VolumesFrom: $scope.config.volumesFrom
VolumesFrom: $scope.config.volumesFrom,
ExposedPorts: exposedPorts,
HostConfig: {
PortBindings: portBindings
}
}, function(d) {
if (d.Id) {
ctor.start({id: d.Id}, function(cd) {
ctor.start({
id: d.Id,
HostConfig: {
PortBindings: portBindings
}
}, function(cd) {
$('#create-modal').modal('hide');
loc.path('/containers/' + d.Id + '/');
}, function(e) {
@ -50,4 +81,13 @@ function($scope, $routeParams, $location, Container, Messages) {
failedRequestHandler(e, Messages);
});
};
$scope.addPortBinding = function() {
$scope.config.portBindings.push({ip: '', extPort: '', intPort: ''});
};
$scope.removePortBinding = function(portBinding) {
var idx = $scope.config.portBindings.indexOf(portBinding);
$scope.config.portBindings.splice(idx, 1);
};
}]);

View File

@ -0,0 +1,63 @@
describe('startContainerController', function () {
var scope, $location, createController, mockContainer, $httpBackend;
beforeEach(angular.mock.module('dockerui'));
beforeEach(inject(function ($rootScope, $controller, _$location_) {
$location = _$location_;
scope = $rootScope.$new();
createController = function() {
return $controller('StartContainerController', {
'$scope': scope
});
};
angular.mock.inject(function (_Container_, _$httpBackend_) {
mockContainer = _Container_;
$httpBackend = _$httpBackend_;
});
}));
describe('Starting a container with options', 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": "",
"ExposedPorts":{
"9000/tcp": {},
},
"HostConfig": {
"PortBindings":{
"9000/tcp": [{
"HostPort": "9999",
"HostIp": "10.20.10.15",
}]
},
}};
$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.portBindings = [{ip: '10.20.10.15', extPort: '9999', intPort: '9000'}]
//var response = mockContainer.create({});
scope.create();
$httpBackend.flush();
//console.log(response);
});
});
});

View File

@ -33,6 +33,27 @@
<label>Volumes From:</label>
<input type="text" ng-model="config.volumesFrom" class="form-control"/>
</div>
<div class="form-group">
<label>Port bindings:</label>
<div ng-repeat="portBinding in config.portBindings" class="form-inline">
<div class="form-group">
<label class="sr-only">Host IP:</label>
<input type="text" ng-model="portBinding.ip" class="form-control" placeholder="Host IP Address"/>
</div>
<div class="form-group">
<label class="sr-only">Host Port:</label>
<input type="text" ng-model="portBinding.extPort" class="form-control" placeholder="Host Port"/>
</div>
<div class="form-group">
<label class="sr-only">Container port:</label>
<input type="text" ng-model="portBinding.intPort" class="form-control" placeholder="Container Port"/>
</div>
<div class="form-group">
<button class="btn btn-danger btn-xs form-control" ng-click="removePortBinding(portBinding)">Remove</button>
</div>
</div>
<button type="button" class="btn btn-success" ng-click="addPortBinding()">Add Port Binding</button>
</div>
</fieldset>
</form>
</div>

View File

@ -37,7 +37,7 @@ module.exports = function (grunt) {
' * Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author %>;\n' +
' * Licensed <%= _.pluck(pkg.licenses, "type").join(", ") %>\n */\n',
src: {
js: ['app/**/*.js'],
js: ['app/**/*.js', '!app/**/*.spec.js'],
jsTpl: ['<%= distdir %>/templates/**/*.js'],
specs: ['test/**/*.spec.js'],
scenarios: ['test/**/*.scenario.js'],