(function() { /** * Page to view the details of a single image. */ angular.module('quayPages').config(['pages', function(pages) { pages.create('image-view', 'image-view.html', ImageViewCtrl, { 'newLayout': true, 'title': '{{ image.id }}', 'description': 'Image {{ image.id }}' }) }]); 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, '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(); $scope.loadImageSecurity = function() { if (!Features.SECURITY_SCANNER || $scope.securityResource) { return; } $scope.VulnerabilityLevels = VulnerabilityService.getLevels(); var params = { 'repository': namespace + '/' + name, 'imageid': imageid, 'vulnerabilities': true, }; $scope.securityResource = ApiService.getRepoImageSecurityAsResource(params).get(function(resp) { $scope.securityStatus = resp.status; $scope.securityFeatures = []; $scope.securityVulnerabilities = []; if (resp.data && resp.data.Layer && resp.data.Layer.Features) { resp.data.Layer.Features.forEach(function(feature) { feature_obj = { 'name': feature.Name, 'namespace': feature.Namespace, 'version': feature.Version, 'addedBy': feature.AddedBy, } feature_vulnerabilities = [] if (feature.Vulnerabilities) { feature.Vulnerabilities.forEach(function(vuln) { vuln_obj = { 'name': vuln.Name, 'namespace': vuln.Namespace, 'description': vuln.Description, 'link': vuln.Link, 'severity': vuln.Severity, 'metadata': vuln.Metadata, 'feature': jQuery.extend({}, feature_obj), 'fixedBy': vuln.FixedBy, 'index': VulnerabilityService.LEVELS[vuln['Severity']]['index'], } feature_vulnerabilities.push(vuln_obj) $scope.securityVulnerabilities.push(vuln_obj); }); } feature_obj['vulnerabilities'] = feature_vulnerabilities $scope.securityFeatures.push(feature_obj); }); } return resp; }); }; $scope.initializeTree = function() { if ($scope.tree || !$scope.combinedChanges.length) { return; } $scope.tree = new ImageFileChangeTree($scope.image, $scope.combinedChanges); $timeout(function() { $scope.tree.draw('changes-tree-container'); }, 100); }; } })();