New Quay Sec UI and fix some small bugs

Fixes #855
This commit is contained in:
Joseph Schorr 2015-11-11 15:52:30 -05:00
parent 744ad9e79b
commit 76ce63895f
13 changed files with 307 additions and 115 deletions

View file

@ -34,8 +34,8 @@ angular.module('quay').directive('repoPanelTags', function () {
$scope.tagHistory = {};
$scope.tagActionHandler = null;
$scope.showingHistory = false;
$scope.tagsPerPage = 50;
$scope.tagVulnerabilities = {};
$scope.tagsPerPage = 25;
$scope.imageVulnerabilities = {};
var setTagState = function() {
if (!$scope.repository || !$scope.selectedTags) { return; }
@ -57,7 +57,7 @@ angular.module('quay').directive('repoPanelTags', function () {
allTags.push(tagInfo);
if (!$scope.options.tagFilter || tag.indexOf($scope.options.tagFilter) >= 0 ||
if (!$scope.options.tagFilter || tagfOf($scope.options.tagFilter) >= 0 ||
tagInfo.image_id.indexOf($scope.options.tagFilter) >= 0) {
tags.push(tagInfo);
}
@ -150,51 +150,66 @@ angular.module('quay').directive('repoPanelTags', function () {
setTagState();
});
$scope.loadTagVulnerabilities = function(tag, tagData) {
$scope.loadImageVulnerabilities = function(image_id, imageData) {
var params = {
'tag': tag.name,
'imageid': image_id,
'repository': $scope.repository.namespace + '/' + $scope.repository.name,
};
ApiService.getRepoTagVulnerabilities(null, params).then(function(resp) {
tagData.indexed = resp.security_indexed;
tagData.loading = false;
ApiService.getRepoImageVulnerabilities(null, params).then(function(resp) {
imageData.security_indexed = resp.security_indexed;
imageData.loading = false;
if (resp.security_indexed) {
tagData.hasVulnerabilities = !!resp.data.Vulnerabilities.length;
tagData.vulnerabilities = resp.data.Vulnerabilities;
if (imageData.security_indexed) {
var vulnerabilities = resp.data.Vulnerabilities;
imageData.hasVulnerabilities = !!vulnerabilities.length;
imageData.vulnerabilities = vulnerabilities;
var highest = {
'Priority': 'Unknown',
'Count': 0,
'index': 100000
};
var highest = null;
resp.data.Vulnerabilities.forEach(function(v) {
if (highest == null ||
VulnerabilityService.LEVELS[v.Priority].index < VulnerabilityService.LEVELS[highest.Priority].index) {
highest = v;
if (VulnerabilityService.LEVELS[v.Priority].index < highest.index) {
highest = {
'Priority': v.Priority,
'Count': 1,
'index': VulnerabilityService.LEVELS[v.Priority].index
}
} else if (VulnerabilityService.LEVELS[v.Priority].index == highest.index) {
highest['Count']++;
}
});
tagData.highestVulnerability = highest;
imageData.highestVulnerability = highest;
}
}, function() {
tagData.loading = false;
tagData.hasError = true;
imageData.loading = false;
imageData.hasError = true;
});
};
$scope.getTagVulnerabilities = function(tag) {
return $scope.getImageVulnerabilities(tag.image_id);
};
$scope.getImageVulnerabilities = function(image_id) {
if (!$scope.repository) {
return
}
var tagName = tag.name;
if (!$scope.tagVulnerabilities[tagName]) {
$scope.tagVulnerabilities[tagName] = {
if (!$scope.imageVulnerabilities[image_id]) {
$scope.imageVulnerabilities[image_id] = {
'loading': true
};
$scope.loadTagVulnerabilities(tag, $scope.tagVulnerabilities[tagName]);
$scope.loadImageVulnerabilities(image_id, $scope.imageVulnerabilities[image_id]);
}
return $scope.tagVulnerabilities[tagName];
return $scope.imageVulnerabilities[image_id];
};
$scope.clearSelectedTags = function() {

View file

@ -0,0 +1,18 @@
/**
* An element which displays a priority triangle for vulnerabilities.
*/
angular.module('quay').directive('vulnerabilityPriorityView', function () {
var directiveDefinitionObject = {
priority: 0,
templateUrl: '/static/directives/vulnerability-priority-view.html',
replace: false,
transclude: true,
restrict: 'C',
scope: {
'priority': '=priority'
},
controller: function($scope, $element) {
}
};
return directiveDefinitionObject;
});

View file

@ -10,11 +10,16 @@
})
}]);
function ImageViewCtrl($scope, $routeParams, $rootScope, $timeout, ApiService, ImageMetadataService) {
function ImageViewCtrl($scope, $routeParams, $rootScope, $timeout, ApiService, ImageMetadataService, VulnerabilityService, Features) {
var namespace = $routeParams.namespace;
var name = $routeParams.name;
var imageid = $routeParams.image;
$scope.options = {
'vulnFilter': '',
'packageFilter': ''
};
var loadImage = function() {
var params = {
'repository': namespace + '/' + name,
@ -41,7 +46,7 @@
loadRepository();
$scope.downloadPackages = function() {
if ($scope.packagesResource) { return; }
if (!Features.SECURITY_SCANNER || $scope.packagesResource) { return; }
var params = {
'repository': namespace + '/' + name,
@ -53,6 +58,26 @@
});
};
$scope.loadImageVulnerabilities = function() {
if (!Features.SECURITY_SCANNER || $scope.vulnerabilitiesResource) { return; }
var params = {
'repository': namespace + '/' + name,
'imageid': imageid
};
$scope.vulnerabilitiesResource = ApiService.getRepoImageVulnerabilitiesAsResource(params).get(function(resp) {
$scope.vulerabilityInfo = resp;
$scope.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);
});
});
};
$scope.downloadChanges = function() {
if ($scope.changesResource) { return; }