mirror of https://github.com/portainer/portainer
185 lines
5.6 KiB
JavaScript
185 lines
5.6 KiB
JavaScript
angular.module('startContainer', ['ui.bootstrap'])
|
|
.controller('StartContainerController', ['$scope', '$state', 'Container', 'Image', 'Messages', 'containernameFilter', 'errorMsgFilter', 'ViewSpinner',
|
|
function ($scope, $state, Container, Image, Messages, containernameFilter, errorMsgFilter, ViewSpinner) {
|
|
$scope.template = 'app/components/startContainer/startcontainer.html';
|
|
|
|
Container.query({all: 1}, function (d) {
|
|
$scope.containerNames = d.map(function (container) {
|
|
return containernameFilter(container);
|
|
});
|
|
});
|
|
|
|
$scope.config = {
|
|
Env: [],
|
|
Labels: [],
|
|
Volumes: [],
|
|
SecurityOpts: [],
|
|
HostConfig: {
|
|
PortBindings: [],
|
|
Binds: [],
|
|
Links: [],
|
|
Dns: [],
|
|
DnsSearch: [],
|
|
VolumesFrom: [],
|
|
CapAdd: [],
|
|
CapDrop: [],
|
|
Devices: [],
|
|
LxcConf: [],
|
|
ExtraHosts: []
|
|
}
|
|
};
|
|
|
|
$scope.menuStatus = {
|
|
containerOpen: true,
|
|
hostConfigOpen: false
|
|
};
|
|
|
|
function failedRequestHandler(e, Messages) {
|
|
Messages.error('Error', errorMsgFilter(e));
|
|
}
|
|
|
|
function rmEmptyKeys(col) {
|
|
for (var key in col) {
|
|
if (col[key] === null || col[key] === undefined || col[key] === '' || ($.isPlainObject(col[key]) && $.isEmptyObject(col[key])) || col[key].length === 0) {
|
|
delete col[key];
|
|
}
|
|
}
|
|
}
|
|
|
|
function getNames(arr) {
|
|
return arr.map(function (item) {
|
|
return item.name;
|
|
});
|
|
}
|
|
|
|
function createContainer(config) {
|
|
Container.create(config, function (d) {
|
|
if (d.Id) {
|
|
var reqBody = config.HostConfig || {};
|
|
reqBody.id = d.Id;
|
|
Container.start(reqBody, function (cd) {
|
|
if (cd.id) {
|
|
ViewSpinner.stop();
|
|
Messages.send('Container Started', d.Id);
|
|
$state.go('container', {id: d.Id}, {reload: true});
|
|
} else {
|
|
ViewSpinner.stop();
|
|
failedRequestHandler(cd, Messages);
|
|
Container.remove({id: d.Id}, function () {
|
|
Messages.send('Container Removed', d.Id);
|
|
});
|
|
}
|
|
}, function (e) {
|
|
ViewSpinner.stop();
|
|
failedRequestHandler(e, Messages);
|
|
});
|
|
} else {
|
|
ViewSpinner.stop();
|
|
failedRequestHandler(d, Messages);
|
|
}
|
|
}, function (e) {
|
|
ViewSpinner.stop();
|
|
failedRequestHandler(e, Messages);
|
|
});
|
|
}
|
|
|
|
$scope.create = function () {
|
|
$('#create-modal').modal('hide');
|
|
ViewSpinner.spin();
|
|
|
|
var config = angular.copy($scope.config);
|
|
|
|
if (config.Cmd && config.Cmd[0] === "[") {
|
|
config.Cmd = angular.fromJson(config.Cmd);
|
|
} else if (config.Cmd) {
|
|
config.Cmd = config.Cmd.split(' ');
|
|
}
|
|
|
|
config.Env = config.Env.map(function (envar) {
|
|
return envar.name + '=' + envar.value;
|
|
});
|
|
var labels = {};
|
|
config.Labels = config.Labels.forEach(function(label) {
|
|
labels[label.key] = label.value;
|
|
});
|
|
config.Labels = labels;
|
|
|
|
config.Volumes = getNames(config.Volumes);
|
|
config.SecurityOpts = getNames(config.SecurityOpts);
|
|
|
|
config.HostConfig.VolumesFrom = getNames(config.HostConfig.VolumesFrom);
|
|
config.HostConfig.Binds = getNames(config.HostConfig.Binds);
|
|
config.HostConfig.Links = getNames(config.HostConfig.Links);
|
|
config.HostConfig.Dns = getNames(config.HostConfig.Dns);
|
|
config.HostConfig.DnsSearch = getNames(config.HostConfig.DnsSearch);
|
|
config.HostConfig.CapAdd = getNames(config.HostConfig.CapAdd);
|
|
config.HostConfig.CapDrop = getNames(config.HostConfig.CapDrop);
|
|
config.HostConfig.LxcConf = config.HostConfig.LxcConf.reduce(function (prev, cur, idx) {
|
|
prev[cur.name] = cur.value;
|
|
return prev;
|
|
}, {});
|
|
config.HostConfig.ExtraHosts = config.HostConfig.ExtraHosts.map(function (entry) {
|
|
return entry.host + ':' + entry.ip;
|
|
});
|
|
|
|
var ExposedPorts = {};
|
|
var PortBindings = {};
|
|
config.HostConfig.PortBindings.forEach(function (portBinding) {
|
|
var intPort = portBinding.intPort + "/tcp";
|
|
if (portBinding.protocol === "udp") {
|
|
intPort = portBinding.intPort + "/udp";
|
|
}
|
|
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 {
|
|
Messages.send('Warning', 'Internal port must be specified for PortBindings');
|
|
}
|
|
});
|
|
config.ExposedPorts = ExposedPorts;
|
|
config.HostConfig.PortBindings = PortBindings;
|
|
|
|
// Remove empty fields from the request to avoid overriding defaults
|
|
rmEmptyKeys(config.HostConfig);
|
|
rmEmptyKeys(config);
|
|
|
|
var image = _.toLower(config.Image);
|
|
var imageNameAndTag = image.split(':');
|
|
var imageConfig = {
|
|
fromImage: imageNameAndTag[0],
|
|
tag: imageNameAndTag[1] ? imageNameAndTag[1] : 'latest',
|
|
};
|
|
|
|
Image.create(imageConfig, function (data) {
|
|
var err = data.length > 0 && data[data.length - 1].hasOwnProperty('error');
|
|
if (err) {
|
|
var detail = data[data.length - 1];
|
|
ViewSpinner.stop();
|
|
Messages.error('Error', detail.error);
|
|
} else {
|
|
Messages.send("Image successfully pulled", image);
|
|
createContainer(config);
|
|
}
|
|
}, function (e) {
|
|
ViewSpinner.stop();
|
|
Messages.error('Error', 'Unable to pull image ' + image);
|
|
});
|
|
};
|
|
|
|
$scope.addEntry = function (array, entry) {
|
|
array.push(entry);
|
|
};
|
|
$scope.rmEntry = function (array, entry) {
|
|
var idx = array.indexOf(entry);
|
|
array.splice(idx, 1);
|
|
};
|
|
}]);
|