2015-02-20 23:15:48 +00:00
|
|
|
(function() {
|
|
|
|
/**
|
|
|
|
* Page to view the details of a single image.
|
|
|
|
*/
|
|
|
|
angular.module('quayPages').config(['pages', function(pages) {
|
2015-03-20 21:46:02 +00:00
|
|
|
pages.create('image-view', 'image-view.html', ImageViewCtrl, {
|
|
|
|
'newLayout': true,
|
|
|
|
'title': '{{ image.id }}',
|
|
|
|
'description': 'Image {{ image.id }}'
|
2015-06-29 09:33:00 +00:00
|
|
|
})
|
2015-02-20 23:15:48 +00:00
|
|
|
}]);
|
|
|
|
|
2015-11-11 20:52:30 +00:00
|
|
|
function ImageViewCtrl($scope, $routeParams, $rootScope, $timeout, ApiService, ImageMetadataService, VulnerabilityService, Features) {
|
2015-03-20 21:46:02 +00:00
|
|
|
var namespace = $routeParams.namespace;
|
|
|
|
var name = $routeParams.name;
|
|
|
|
var imageid = $routeParams.image;
|
|
|
|
|
2015-11-11 20:52:30 +00:00
|
|
|
$scope.options = {
|
|
|
|
'vulnFilter': '',
|
|
|
|
'packageFilter': ''
|
|
|
|
};
|
|
|
|
|
2015-03-20 21:46:02 +00:00
|
|
|
var loadImage = function() {
|
|
|
|
var params = {
|
|
|
|
'repository': namespace + '/' + name,
|
|
|
|
'image_id': imageid
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.imageResource = ApiService.getImageAsResource(params).get(function(image) {
|
|
|
|
$scope.image = image;
|
|
|
|
$scope.reversedHistory = image.history.reverse();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
var loadRepository = function() {
|
|
|
|
var params = {
|
|
|
|
'repository': namespace + '/' + name
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.repositoryResource = ApiService.getRepoAsResource(params).get(function(repo) {
|
|
|
|
$scope.repository = repo;
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
loadImage();
|
|
|
|
loadRepository();
|
2015-03-23 19:22:22 +00:00
|
|
|
|
2015-10-28 19:38:55 +00:00
|
|
|
$scope.downloadPackages = function() {
|
2015-11-11 20:52:30 +00:00
|
|
|
if (!Features.SECURITY_SCANNER || $scope.packagesResource) { return; }
|
2015-10-28 19:38:55 +00:00
|
|
|
|
|
|
|
var params = {
|
|
|
|
'repository': namespace + '/' + name,
|
|
|
|
'imageid': imageid
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.packagesResource = ApiService.getRepoImagePackagesAsResource(params).get(function(packages) {
|
|
|
|
$scope.packages = packages;
|
2015-11-12 20:42:45 +00:00
|
|
|
return packages;
|
2015-10-28 19:38:55 +00:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-11-11 20:52:30 +00:00
|
|
|
$scope.loadImageVulnerabilities = function() {
|
|
|
|
if (!Features.SECURITY_SCANNER || $scope.vulnerabilitiesResource) { return; }
|
|
|
|
|
2015-11-12 20:42:45 +00:00
|
|
|
$scope.VulnerabilityLevels = VulnerabilityService.getLevels();
|
|
|
|
|
2015-11-11 20:52:30 +00:00
|
|
|
var params = {
|
|
|
|
'repository': namespace + '/' + name,
|
|
|
|
'imageid': imageid
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.vulnerabilitiesResource = ApiService.getRepoImageVulnerabilitiesAsResource(params).get(function(resp) {
|
2015-11-12 20:42:45 +00:00
|
|
|
$scope.vulnerabilityInfo = resp;
|
2015-11-11 20:52:30 +00:00
|
|
|
$scope.vulnerabilities = [];
|
|
|
|
|
2015-11-12 20:42:45 +00:00
|
|
|
if (resp.data && resp.data.Vulnerabilities) {
|
|
|
|
resp.data.Vulnerabilities.forEach(function(vuln) {
|
|
|
|
vuln_copy = jQuery.extend({}, vuln);
|
|
|
|
vuln_copy['index'] = VulnerabilityService.LEVELS[vuln['Priority']]['index'];
|
|
|
|
$scope.vulnerabilities.push(vuln_copy);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return resp;
|
2015-11-11 20:52:30 +00:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-03-23 19:22:22 +00:00
|
|
|
$scope.downloadChanges = function() {
|
|
|
|
if ($scope.changesResource) { return; }
|
|
|
|
|
|
|
|
var params = {
|
|
|
|
'repository': namespace + '/' + name,
|
|
|
|
'image_id': imageid
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.changesResource = ApiService.getImageChangesAsResource(params).get(function(changes) {
|
|
|
|
var combinedChanges = [];
|
|
|
|
var addCombinedChanges = function(c, kind) {
|
|
|
|
for (var i = 0; i < c.length; ++i) {
|
|
|
|
combinedChanges.push({
|
|
|
|
'kind': kind,
|
|
|
|
'file': c[i]
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
addCombinedChanges(changes.added, 'added');
|
|
|
|
addCombinedChanges(changes.removed, 'removed');
|
|
|
|
addCombinedChanges(changes.changed, 'changed');
|
|
|
|
|
|
|
|
$scope.combinedChanges = combinedChanges;
|
|
|
|
$scope.imageChanges = changes;
|
|
|
|
$scope.initializeTree();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.initializeTree = function() {
|
2015-03-24 23:28:24 +00:00
|
|
|
if ($scope.tree || !$scope.combinedChanges.length) { return; }
|
2015-03-23 19:22:22 +00:00
|
|
|
|
|
|
|
$scope.tree = new ImageFileChangeTree($scope.image, $scope.combinedChanges);
|
|
|
|
$timeout(function() {
|
|
|
|
$scope.tree.draw('changes-tree-container');
|
|
|
|
}, 100);
|
|
|
|
};
|
2015-03-20 21:46:02 +00:00
|
|
|
}
|
2015-02-20 23:15:48 +00:00
|
|
|
})();
|