Merge master into vulnerability-tool
This commit is contained in:
commit
7816b0c657
44 changed files with 880 additions and 289 deletions
|
@ -185,12 +185,17 @@ angular.module("core-config-setup", ['angularFileUpload'])
|
|||
|
||||
$scope.checkValidateAndSave = function() {
|
||||
if ($scope.configform.$valid) {
|
||||
saveStorageConfig();
|
||||
$scope.validateAndSave();
|
||||
return;
|
||||
}
|
||||
|
||||
$element.find("input.ng-invalid:first")[0].scrollIntoView();
|
||||
$element.find("input.ng-invalid:first").focus();
|
||||
var query = $element.find("input.ng-invalid:first");
|
||||
|
||||
if (query && query.length) {
|
||||
query[0].scrollIntoView();
|
||||
query.focus();
|
||||
}
|
||||
};
|
||||
|
||||
$scope.validateAndSave = function() {
|
||||
|
@ -277,6 +282,99 @@ angular.module("core-config-setup", ['angularFileUpload'])
|
|||
}, ApiService.errorDisplay('Could not save configuration. Please report this error.'));
|
||||
};
|
||||
|
||||
// Convert storage config to an array
|
||||
var initializeStorageConfig = function($scope) {
|
||||
var config = $scope.config.DISTRIBUTED_STORAGE_CONFIG || {};
|
||||
var defaultLocations = $scope.config.DISTRIBUTED_STORAGE_DEFAULT_LOCATIONS || [];
|
||||
var preference = $scope.config.DISTRIBUTED_STORAGE_PREFERENCE || [];
|
||||
|
||||
$scope.serverStorageConfig = angular.copy(config);
|
||||
$scope.storageConfig = [];
|
||||
|
||||
Object.keys(config).forEach(function(location) {
|
||||
$scope.storageConfig.push({
|
||||
location: location,
|
||||
defaultLocation: defaultLocations.indexOf(location) >= 0,
|
||||
data: angular.copy(config[location]),
|
||||
error: {},
|
||||
});
|
||||
});
|
||||
|
||||
if (!$scope.storageConfig.length) {
|
||||
$scope.addStorageConfig('default');
|
||||
return;
|
||||
}
|
||||
|
||||
// match DISTRIBUTED_STORAGE_PREFERENCE order first, remaining are
|
||||
// ordered by unicode point value
|
||||
$scope.storageConfig.sort(function(a, b) {
|
||||
var indexA = preference.indexOf(a.location);
|
||||
var indexB = preference.indexOf(b.location);
|
||||
|
||||
if (indexA > -1 && indexB > -1) return indexA < indexB ? -1 : 1;
|
||||
if (indexA > -1) return -1;
|
||||
if (indexB > -1) return 1;
|
||||
|
||||
return a.location < b.location ? -1 : 1;
|
||||
});
|
||||
};
|
||||
|
||||
$scope.allowChangeLocationStorageConfig = function(location) {
|
||||
if (!$scope.serverStorageConfig[location]) { return true };
|
||||
|
||||
// allow user to change location ID if another exists with the same ID
|
||||
return $scope.storageConfig.filter(function(sc) {
|
||||
return sc.location === location;
|
||||
}).length >= 2;
|
||||
};
|
||||
|
||||
$scope.allowRemoveStorageConfig = function(location) {
|
||||
return $scope.storageConfig.length > 1 && $scope.allowChangeLocationStorageConfig(location);
|
||||
};
|
||||
|
||||
$scope.canAddStorageConfig = function() {
|
||||
return $scope.config &&
|
||||
$scope.config.FEATURE_STORAGE_REPLICATION &&
|
||||
$scope.storageConfig &&
|
||||
(!$scope.storageConfig.length || $scope.storageConfig.length < 10);
|
||||
};
|
||||
|
||||
$scope.addStorageConfig = function(location) {
|
||||
var storageType = 'LocalStorage';
|
||||
|
||||
// Use last storage type by default
|
||||
if ($scope.storageConfig.length) {
|
||||
storageType = $scope.storageConfig[$scope.storageConfig.length-1].data[0];
|
||||
}
|
||||
|
||||
$scope.storageConfig.push({
|
||||
location: location || '',
|
||||
defaultLocation: false,
|
||||
data: [storageType, {}],
|
||||
error: {},
|
||||
});
|
||||
};
|
||||
|
||||
$scope.removeStorageConfig = function(sc) {
|
||||
$scope.storageConfig.splice($scope.storageConfig.indexOf(sc), 1);
|
||||
};
|
||||
|
||||
var saveStorageConfig = function() {
|
||||
var config = {};
|
||||
var defaultLocations = [];
|
||||
var preference = [];
|
||||
|
||||
$scope.storageConfig.forEach(function(sc) {
|
||||
config[sc.location] = sc.data;
|
||||
if (sc.defaultLocation) defaultLocations.push(sc.location);
|
||||
preference.push(sc.location);
|
||||
});
|
||||
|
||||
$scope.config.DISTRIBUTED_STORAGE_CONFIG = config;
|
||||
$scope.config.DISTRIBUTED_STORAGE_DEFAULT_LOCATIONS = defaultLocations;
|
||||
$scope.config.DISTRIBUTED_STORAGE_PREFERENCE = preference;
|
||||
};
|
||||
|
||||
var gitlabSelector = function(key) {
|
||||
return function(value) {
|
||||
if (!value || !$scope.config) { return; }
|
||||
|
@ -378,18 +476,11 @@ angular.module("core-config-setup", ['angularFileUpload'])
|
|||
$scope.$watch('mapped.redis.port', redisSetter('port'));
|
||||
$scope.$watch('mapped.redis.password', redisSetter('password'));
|
||||
|
||||
// Add a watch to remove any fields not allowed by the current storage configuration.
|
||||
// We have to do this otherwise extra fields (which are not allowed) can end up in the
|
||||
// configuration.
|
||||
$scope.$watch('config.DISTRIBUTED_STORAGE_CONFIG.local[0]', function(value) {
|
||||
// Remove any fields not associated with the current kind.
|
||||
if (!value || !$scope.STORAGE_CONFIG_FIELDS[value]
|
||||
|| !$scope.config.DISTRIBUTED_STORAGE_CONFIG
|
||||
|| !$scope.config.DISTRIBUTED_STORAGE_CONFIG.local
|
||||
|| !$scope.config.DISTRIBUTED_STORAGE_CONFIG.local[1]) { return; }
|
||||
|
||||
var allowedFields = $scope.STORAGE_CONFIG_FIELDS[value];
|
||||
var configObject = $scope.config.DISTRIBUTED_STORAGE_CONFIG.local[1];
|
||||
// Remove extra extra fields (which are not allowed) from storage config.
|
||||
var updateFields = function(sc) {
|
||||
var type = sc.data[0];
|
||||
var configObject = sc.data[1];
|
||||
var allowedFields = $scope.STORAGE_CONFIG_FIELDS[type];
|
||||
|
||||
// Remove any fields not allowed.
|
||||
for (var fieldName in configObject) {
|
||||
|
@ -412,8 +503,53 @@ angular.module("core-config-setup", ['angularFileUpload'])
|
|||
configObject[allowedFields[i].name] = configObject[allowedFields[i].name] || false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Validate and update storage config on update.
|
||||
var refreshStorageConfig = function() {
|
||||
if (!$scope.config || !$scope.storageConfig) return;
|
||||
|
||||
var locationCounts = {};
|
||||
var errors = [];
|
||||
var valid = true;
|
||||
|
||||
$scope.storageConfig.forEach(function(sc) {
|
||||
// remove extra fields from storage config
|
||||
updateFields(sc);
|
||||
|
||||
if (!locationCounts[sc.location]) locationCounts[sc.location] = 0;
|
||||
locationCounts[sc.location]++;
|
||||
});
|
||||
|
||||
// validate storage config
|
||||
$scope.storageConfig.forEach(function(sc) {
|
||||
var error = {};
|
||||
|
||||
if ($scope.config.FEATURE_STORAGE_REPLICATION && sc.data[0] === 'LocalStorage') {
|
||||
error.engine = 'Replication to a locally mounted directory is unsupported as it is only accessible on a single machine.';
|
||||
valid = false;
|
||||
}
|
||||
|
||||
if (locationCounts[sc.location] > 1) {
|
||||
error.location = 'Location ID must be unique.';
|
||||
valid = false;
|
||||
}
|
||||
|
||||
errors.push(error);
|
||||
});
|
||||
|
||||
$scope.storageConfigError = errors;
|
||||
$scope.configform.$setValidity('storageConfig', valid);
|
||||
};
|
||||
|
||||
$scope.$watch('config.FEATURE_STORAGE_REPLICATION', function() {
|
||||
refreshStorageConfig();
|
||||
});
|
||||
|
||||
$scope.$watch('storageConfig', function() {
|
||||
refreshStorageConfig();
|
||||
}, true);
|
||||
|
||||
$scope.$watch('config', function(value) {
|
||||
$scope.mapped['$hasChanges'] = true;
|
||||
}, true);
|
||||
|
@ -424,6 +560,7 @@ angular.module("core-config-setup", ['angularFileUpload'])
|
|||
ApiService.scGetConfig().then(function(resp) {
|
||||
$scope.config = resp['config'] || {};
|
||||
initializeMappedLogic($scope.config);
|
||||
initializeStorageConfig($scope);
|
||||
$scope.mapped['$hasChanges'] = false;
|
||||
}, ApiService.errorDisplay('Could not load config'));
|
||||
});
|
||||
|
@ -919,4 +1056,4 @@ angular.module("core-config-setup", ['angularFileUpload'])
|
|||
}
|
||||
};
|
||||
return directiveDefinitionObject;
|
||||
});
|
||||
});
|
||||
|
|
|
@ -232,6 +232,7 @@ angular.module('quay').directive('repoPanelTags', function () {
|
|||
$scope.trackLineClass = function(index, track_info) {
|
||||
var startIndex = $.inArray(track_info.tags[0], $scope.tags);
|
||||
var endIndex = $.inArray(track_info.tags[track_info.tags.length - 1], $scope.tags);
|
||||
index += $scope.options.page * $scope.tagsPerPage;
|
||||
|
||||
if (index == startIndex) {
|
||||
return 'start';
|
||||
|
|
|
@ -55,6 +55,11 @@ angular.module('quay').factory('DataFileService', [function() {
|
|||
return;
|
||||
}
|
||||
|
||||
if (plain.byteLength == 0) {
|
||||
failure();
|
||||
return;
|
||||
}
|
||||
|
||||
dataFileService.tryAsTar_(plain, success, failure);
|
||||
};
|
||||
|
||||
|
|
Reference in a new issue