src/app/containers/containers.js
angular.module( 'app.containers', [ ])
.controller( 'ContainersCtrl',
function ContainersCtrl( $scope, $interval, Cookies, ContainerService, ImageService ) {
$scope.settings = Cookies.settings;
$scope.searchThreshold = 10;
$scope.viewLimit = 10;
$scope.sort = '-Created';
$scope.update = function() {
ContainerService.update();
};
var intervalPromise = $interval($scope.update, 10000);
ContainerService.update().then( ImageService.update() );
$scope.imageFilter = ContainerService.imageFilter;
$scope.$on('$destroy', function () {
$interval.cancel(intervalPromise);
});
})
.service( 'ContainerService',
function ( $rootScope, $q, Cookies, Config, Container ) {
var self = this;
this.init = function() {
if( !$rootScope.containers) {
return self.update();
}
return $q.when();
};
this.imageFilter = function( data, filters ) {
if( !data.Image ) {
return false;
}
var name = data.Image;
filters = filters.split('|');
for (var i in filters) {
if( filters[i].charAt(0) != '!' &&
name.indexOf(filters[i]) != -1 ) {
return true;
} else if( name.indexOf(filters[i].slice(1)) != -1 ) {
return false;
}
}
return false;
};
this.update = function() {
var settings = Cookies.settings;
var advancedView = function( data, filters ) {
if ( filters === undefined ) {
filters = "";
}
if( !settings.advanced ) {
filters += '|!alexagency/amhub';
}
return self.imageFilter(data, filters);
};
var deferred = $q.defer();
Container.query({}, function( containers ) {
$rootScope.containers = [];
for(var i in containers) {
if( advancedView(containers[i], settings.filter) ) {
$rootScope.containers.push(containers[i]);
}
}
return deferred.resolve();
});
return deferred.promise;
};
this.getByName = function( name ) {
return self.init().then(function() {
for (var i in $rootScope.containers) {
var container = $rootScope.containers[i];
if(container.Names[0]) {
if(container.Names[0].slice(1) == name) {
return container;
}
} else {
return container; //return first container without name
}
}
});
};
this.getActive = function() {
return self.init().then(function() {
var containers = [];
for(var i in $rootScope.containers) {
if($rootScope.containers[i].Status.indexOf('Up') != -1) {
containers.push($rootScope.containers[i]);
}
}
return containers;
});
};
this.getFreeAddresses = function() {
var deferred = $q.defer();
Config.get({}, function(config) {
var addresses = config.addresses;
self.init().then(function() {
for (var i in $rootScope.containers) {
var container = $rootScope.containers[i];
for(var index in container.Ports) {
if(container.Ports[index] && container.Ports[index].IP) {
var containerIp = container.Ports[index].IP;
if(containerIp != "0.0.0.0") {
for(var j in addresses) {
if(addresses[j].ip == containerIp) {
addresses.splice(j,1);
break;
}
}
}
}
}
}
deferred.resolve(addresses);
});
});
return deferred.promise;
};
this.remove = function( id ) {
return Container.remove({ id: id }, function() {
console.log('Container removed.');
});
};
this.getAllByImage = function( imageName ) {
return self.init().then(function() {
var imageContainers = [];
for (var i in $rootScope.containers) {
var container = $rootScope.containers[i];
if( container.Image == imageName ) {
imageContainers.push(container);
}
}
return imageContainers;
});
};
this.removeAllByImage = function( imageName ) {
var deferred = $q.defer();
self.init().then(function() {
var promises = [];
for (var i in $rootScope.containers) {
var container = $rootScope.containers[i];
if( container.Image == imageName ) {
promises.push(self.remove( container.Id ));
}
}
$q.all(promises)
.then(function(resolutions) {
return deferred.resolve();
});
});
return deferred.promise;
};
})
;