migrate the deprecated merged master/user config

This commit is contained in:
Stephen Birarda 2016-07-26 13:19:10 -07:00
parent 285478f1b2
commit 62af203d08
7 changed files with 52 additions and 61 deletions

View file

@ -1,5 +1,5 @@
{ {
"version": 1.6, "version": 1.7,
"settings": [ "settings": [
{ {
"name": "metaverse", "name": "metaverse",

View file

@ -75,15 +75,6 @@ span.port {
color: #666666; color: #666666;
} }
.locked {
color: #428bca;
}
.locked-table {
cursor: not-allowed;
background-color: #eee;
}
.advanced-setting { .advanced-setting {
display: none; display: none;
} }

View file

@ -57,15 +57,13 @@
<div class="panel-body"> <div class="panel-body">
<% _.each(split_settings[0], function(setting) { %> <% _.each(split_settings[0], function(setting) { %>
<% keypath = isGrouped ? group.name + "." + setting.name : setting.name %> <% keypath = isGrouped ? group.name + "." + setting.name : setting.name %>
<%= getFormGroup(keypath, setting, values, false, <%= getFormGroup(keypath, setting, values, false) %>
(_.has(locked, group.name) && _.has(locked[group.name], setting.name))) %>
<% }); %> <% }); %>
<% if (!_.isEmpty(split_settings[1])) { %> <% if (!_.isEmpty(split_settings[1])) { %>
<% $("#advanced-toggle-button").show() %> <% $("#advanced-toggle-button").show() %>
<% _.each(split_settings[1], function(setting) { %> <% _.each(split_settings[1], function(setting) { %>
<% keypath = isGrouped ? group.name + "." + setting.name : setting.name %> <% keypath = isGrouped ? group.name + "." + setting.name : setting.name %>
<%= getFormGroup(keypath, setting, values, true, <%= getFormGroup(keypath, setting, values, true) %>
(_.has(locked, group.name) && _.has(locked[group.name], setting.name))) %>
<% }); %> <% }); %>
<% }%> <% }%>
</div> </div>

View file

@ -41,7 +41,7 @@ var Settings = {
}; };
var viewHelpers = { var viewHelpers = {
getFormGroup: function(keypath, setting, values, isAdvanced, isLocked) { getFormGroup: function(keypath, setting, values, isAdvanced) {
form_group = "<div class='form-group " + (isAdvanced ? Settings.ADVANCED_CLASS : "") + "' data-keypath='" + keypath + "'>"; form_group = "<div class='form-group " + (isAdvanced ? Settings.ADVANCED_CLASS : "") + "' data-keypath='" + keypath + "'>";
setting_value = _(values).valueForKeyPath(keypath); setting_value = _(values).valueForKeyPath(keypath);
@ -54,9 +54,6 @@ var viewHelpers = {
} }
label_class = 'control-label'; label_class = 'control-label';
if (isLocked) {
label_class += ' locked';
}
function common_attrs(extra_classes) { function common_attrs(extra_classes) {
extra_classes = (!_.isUndefined(extra_classes) ? extra_classes : ""); extra_classes = (!_.isUndefined(extra_classes) ? extra_classes : "");
@ -71,9 +68,8 @@ var viewHelpers = {
form_group += "<label class='" + label_class + "'>" + setting.label + "</label>" form_group += "<label class='" + label_class + "'>" + setting.label + "</label>"
} }
form_group += "<div class='toggle-checkbox-container" + (isLocked ? " disabled" : "") + "'>" form_group += "<div class='toggle-checkbox-container'>"
form_group += "<input type='checkbox'" + common_attrs('toggle-checkbox') + (setting_value ? "checked" : "") form_group += "<input type='checkbox'" + common_attrs('toggle-checkbox') + (setting_value ? "checked" : "") + "/>"
form_group += (isLocked ? " disabled" : "") + "/>"
if (setting.help) { if (setting.help) {
form_group += "<span class='help-block checkbox-help'>" + setting.help + "</span>"; form_group += "<span class='help-block checkbox-help'>" + setting.help + "</span>";
@ -88,7 +84,7 @@ var viewHelpers = {
} }
if (input_type === 'table') { if (input_type === 'table') {
form_group += makeTable(setting, keypath, setting_value, isLocked) form_group += makeTable(setting, keypath, setting_value)
} else { } else {
if (input_type === 'select') { if (input_type === 'select') {
form_group += "<select class='form-control' data-hidden-input='" + keypath + "'>'" form_group += "<select class='form-control' data-hidden-input='" + keypath + "'>'"
@ -107,12 +103,10 @@ var viewHelpers = {
if (setting.href) { if (setting.href) {
form_group += "<a href='" + setting.href + "'style='display: block;' role='button'" form_group += "<a href='" + setting.href + "'style='display: block;' role='button'"
+ (isLocked ? " disabled" : "")
+ common_attrs("btn " + setting.classes) + " target='_blank'>" + common_attrs("btn " + setting.classes) + " target='_blank'>"
+ setting.button_label + "</a>"; + setting.button_label + "</a>";
} else { } else {
form_group += "<button " + common_attrs("btn " + setting.classes) form_group += "<button " + common_attrs("btn " + setting.classes) + ">"
+ (isLocked ? " disabled" : "") + ">"
+ setting.button_label + "</button>"; + setting.button_label + "</button>";
} }
@ -124,7 +118,7 @@ var viewHelpers = {
form_group += "<input type='" + input_type + "'" + common_attrs() + form_group += "<input type='" + input_type + "'" + common_attrs() +
"placeholder='" + (_.has(setting, 'placeholder') ? setting.placeholder : "") + "placeholder='" + (_.has(setting, 'placeholder') ? setting.placeholder : "") +
"' value='" + setting_value + "'" + (isLocked ? " disabled" : "") + "/>" "' value='" + setting_value + "'/>"
} }
form_group += "<span class='help-block'>" + setting.help + "</span>" form_group += "<span class='help-block'>" + setting.help + "</span>"
@ -459,10 +453,8 @@ function setupHFAccountButton() {
$("[data-keypath='metaverse.automatic_networking']").hide(); $("[data-keypath='metaverse.automatic_networking']").hide();
} }
var tokenLocked = _(Settings.data).valueForKeyPath("locked.metaverse.access_token");
// use the existing getFormGroup helper to ask for a button // use the existing getFormGroup helper to ask for a button
var buttonGroup = viewHelpers.getFormGroup('', buttonSetting, Settings.data.values, false, tokenLocked); var buttonGroup = viewHelpers.getFormGroup('', buttonSetting, Settings.data.values, false);
// add the button group to the top of the metaverse panel // add the button group to the top of the metaverse panel
$('#metaverse .panel-body').prepend(buttonGroup); $('#metaverse .panel-body').prepend(buttonGroup);
@ -673,7 +665,7 @@ function setupPlacesTable() {
} }
// get a table for the places // get a table for the places
var placesTableGroup = viewHelpers.getFormGroup('', placesTableSetting, Settings.data.values, false, false); var placesTableGroup = viewHelpers.getFormGroup('', placesTableSetting, Settings.data.values, false);
// append the places table in the right place // append the places table in the right place
$('#places_paths .panel-body').prepend(placesTableGroup); $('#places_paths .panel-body').prepend(placesTableGroup);
@ -873,10 +865,8 @@ function reloadSettings(callback) {
Settings.data = data; Settings.data = data;
Settings.initialValues = form2js('settings-form', ".", false, cleanupFormValues, true); Settings.initialValues = form2js('settings-form', ".", false, cleanupFormValues, true);
if (!_.has(data["locked"], "metaverse") && !_.has(data["locked"]["metaverse"], "id")) { // append the domain selection modal
// append the domain selection modal, as long as it's not locked appendDomainIDButtons();
appendDomainIDButtons();
}
// call our method to setup the HF account button // call our method to setup the HF account button
setupHFAccountButton(); setupHFAccountButton();
@ -889,12 +879,6 @@ function reloadSettings(callback) {
$('[data-toggle="tooltip"]').tooltip(); $('[data-toggle="tooltip"]').tooltip();
// add tooltip to locked settings
$('label.locked').tooltip({
placement: 'right',
title: 'This setting is in the master config file and cannot be changed'
});
// call the callback now that settings are loaded // call the callback now that settings are loaded
callback(true); callback(true);
}).fail(function() { }).fail(function() {
@ -943,11 +927,11 @@ $('body').on('click', '.save-button', function(e){
return false; return false;
}); });
function makeTable(setting, keypath, setting_value, isLocked) { function makeTable(setting, keypath, setting_value) {
var isArray = !_.has(setting, 'key'); var isArray = !_.has(setting, 'key');
var categoryKey = setting.categorize_by_key; var categoryKey = setting.categorize_by_key;
var isCategorized = !!categoryKey && isArray; var isCategorized = !!categoryKey && isArray;
if (!isArray && setting.can_order) { if (!isArray && setting.can_order) {
setting.can_order = false; setting.can_order = false;
} }
@ -961,7 +945,7 @@ function makeTable(setting, keypath, setting_value, isLocked) {
var nonDeletableRowKey = setting["non-deletable-row-key"]; var nonDeletableRowKey = setting["non-deletable-row-key"];
var nonDeletableRowValues = setting["non-deletable-row-values"]; var nonDeletableRowValues = setting["non-deletable-row-values"];
html += "<table class='table table-bordered " + (isLocked ? "locked-table" : "") + "' " + html += "<table class='table table-bordered' " +
"data-short-name='" + setting.name + "' name='" + keypath + "' " + "data-short-name='" + setting.name + "' name='" + keypath + "' " +
"id='" + (!_.isUndefined(setting.html_id) ? setting.html_id : keypath) + "' " + "id='" + (!_.isUndefined(setting.html_id) ? setting.html_id : keypath) + "' " +
"data-setting-type='" + (isArray ? 'array' : 'hash') + "'>"; "data-setting-type='" + (isArray ? 'array' : 'hash') + "'>";
@ -976,7 +960,7 @@ function makeTable(setting, keypath, setting_value, isLocked) {
_.each(setting.groups, function (group) { _.each(setting.groups, function (group) {
html += "<td colspan='" + group.span + "'><strong>" + group.label + "</strong></td>" html += "<td colspan='" + group.span + "'><strong>" + group.label + "</strong></td>"
}) })
if (!isLocked && !setting.read_only) { if (!setting.read_only) {
if (setting.can_order) { if (setting.can_order) {
html += "<td class='" + Settings.REORDER_BUTTONS_CLASSES + html += "<td class='" + Settings.REORDER_BUTTONS_CLASSES +
"'><a href='javascript:void(0);' class='glyphicon glyphicon-sort'></a></td>"; "'><a href='javascript:void(0);' class='glyphicon glyphicon-sort'></a></td>";
@ -1004,7 +988,7 @@ function makeTable(setting, keypath, setting_value, isLocked) {
(col.class ? col.class : '') + "'><strong>" + col.label + "</strong></td>" // Data (col.class ? col.class : '') + "'><strong>" + col.label + "</strong></td>" // Data
}) })
if (!isLocked && !setting.read_only) { if (!setting.read_only) {
if (setting.can_order) { if (setting.can_order) {
numVisibleColumns++; numVisibleColumns++;
html += "<td class='" + Settings.REORDER_BUTTONS_CLASSES + html += "<td class='" + Settings.REORDER_BUTTONS_CLASSES +
@ -1083,7 +1067,7 @@ function makeTable(setting, keypath, setting_value, isLocked) {
}); });
if (!isLocked && !setting.read_only) { if (!setting.read_only) {
if (setting.can_order) { if (setting.can_order) {
html += "<td class='" + Settings.REORDER_BUTTONS_CLASSES+ html += "<td class='" + Settings.REORDER_BUTTONS_CLASSES+
"'><a href='javascript:void(0);' class='" + Settings.MOVE_UP_SPAN_CLASSES + "'></a>" "'><a href='javascript:void(0);' class='" + Settings.MOVE_UP_SPAN_CLASSES + "'></a>"
@ -1108,7 +1092,7 @@ function makeTable(setting, keypath, setting_value, isLocked) {
} }
// populate inputs in the table for new values // populate inputs in the table for new values
if (!isLocked && !setting.read_only) { if (!setting.read_only) {
if (setting.can_add_new_categories) { if (setting.can_add_new_categories) {
html += makeTableCategoryInput(setting, numVisibleColumns); html += makeTableCategoryInput(setting, numVisibleColumns);
} }

View file

@ -95,6 +95,8 @@ void DomainServerSettingsManager::processSettingsRequestPacket(QSharedPointer<Re
void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList) { void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList) {
_argumentList = argumentList; _argumentList = argumentList;
// after 1.7 we no longer use the master or merged configs - this is kept in place for migration
_configMap.loadMasterAndUserConfig(_argumentList); _configMap.loadMasterAndUserConfig(_argumentList);
// What settings version were we before and what are we using now? // What settings version were we before and what are we using now?
@ -282,6 +284,19 @@ void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList
packPermissions(); packPermissions();
} }
if (oldVersion < 1.7) {
// This was prior to the removal of the master config file
// So we write the merged config to the user config file, and stop reading from the user config file
qDebug() << "Migrating merged config to user config file. The master config file is deprecated.";
// replace the user config by the merged config
_configMap.getUserConfig() = _configMap.getMergedConfig();
// persist the new config so the user config file has the correctly merged config
persistToFile();
}
} }
unpackPermissions(); unpackPermissions();
@ -327,9 +342,6 @@ void DomainServerSettingsManager::validateDescriptorsMap() {
if (wasMalformed) { if (wasMalformed) {
// write the new settings to file // write the new settings to file
persistToFile(); persistToFile();
// reload the master and user config so the merged config is correct
_configMap.loadMasterAndUserConfig(_argumentList);
} }
} }
@ -437,7 +449,6 @@ void DomainServerSettingsManager::packPermissions() {
packPermissionsForMap("permissions", _groupForbiddens, GROUP_FORBIDDENS_KEYPATH); packPermissionsForMap("permissions", _groupForbiddens, GROUP_FORBIDDENS_KEYPATH);
persistToFile(); persistToFile();
_configMap.loadMasterAndUserConfig(_argumentList);
} }
bool DomainServerSettingsManager::unpackPermissionsForKeypath(const QString& keyPath, bool DomainServerSettingsManager::unpackPermissionsForKeypath(const QString& keyPath,
@ -446,7 +457,7 @@ bool DomainServerSettingsManager::unpackPermissionsForKeypath(const QString& key
mapPointer->clear(); mapPointer->clear();
QVariant* permissions = valueForKeyPath(_configMap.getMergedConfig(), keyPath, true); QVariant* permissions = valueForKeyPath(_configMap.getUserConfig(), keyPath, true);
if (!permissions->canConvert(QMetaType::QVariantList)) { if (!permissions->canConvert(QMetaType::QVariantList)) {
qDebug() << "Failed to extract permissions for key path" << keyPath << "from settings."; qDebug() << "Failed to extract permissions for key path" << keyPath << "from settings.";
(*permissions) = QVariantList(); (*permissions) = QVariantList();
@ -777,7 +788,7 @@ NodePermissions DomainServerSettingsManager::getForbiddensForGroup(const QUuid&
} }
QVariant DomainServerSettingsManager::valueOrDefaultValueForKeyPath(const QString& keyPath) { QVariant DomainServerSettingsManager::valueOrDefaultValueForKeyPath(const QString& keyPath) {
const QVariant* foundValue = valueForKeyPath(_configMap.getMergedConfig(), keyPath); const QVariant* foundValue = valueForKeyPath(_configMap.getUserConfig(), keyPath);
if (foundValue) { if (foundValue) {
return *foundValue; return *foundValue;
@ -860,12 +871,10 @@ bool DomainServerSettingsManager::handleAuthenticatedHTTPRequest(HTTPConnection
// setup a JSON Object with descriptions and non-omitted settings // setup a JSON Object with descriptions and non-omitted settings
const QString SETTINGS_RESPONSE_DESCRIPTION_KEY = "descriptions"; const QString SETTINGS_RESPONSE_DESCRIPTION_KEY = "descriptions";
const QString SETTINGS_RESPONSE_VALUE_KEY = "values"; const QString SETTINGS_RESPONSE_VALUE_KEY = "values";
const QString SETTINGS_RESPONSE_LOCKED_VALUES_KEY = "locked";
QJsonObject rootObject; QJsonObject rootObject;
rootObject[SETTINGS_RESPONSE_DESCRIPTION_KEY] = _descriptionArray; rootObject[SETTINGS_RESPONSE_DESCRIPTION_KEY] = _descriptionArray;
rootObject[SETTINGS_RESPONSE_VALUE_KEY] = responseObjectForType("", true); rootObject[SETTINGS_RESPONSE_VALUE_KEY] = responseObjectForType("", true);
rootObject[SETTINGS_RESPONSE_LOCKED_VALUES_KEY] = QJsonDocument::fromVariant(_configMap.getMasterConfig()).object();
connection->respond(HTTPConnection::StatusCode200, QJsonDocument(rootObject).toJson(), "application/json"); connection->respond(HTTPConnection::StatusCode200, QJsonDocument(rootObject).toJson(), "application/json");
} }
@ -910,13 +919,13 @@ QJsonObject DomainServerSettingsManager::responseObjectForType(const QString& ty
QVariant variantValue; QVariant variantValue;
if (!groupKey.isEmpty()) { if (!groupKey.isEmpty()) {
QVariant settingsMapGroupValue = _configMap.getMergedConfig().value(groupKey); QVariant settingsMapGroupValue = _configMap.getUserConfig().value(groupKey);
if (!settingsMapGroupValue.isNull()) { if (!settingsMapGroupValue.isNull()) {
variantValue = settingsMapGroupValue.toMap().value(settingName); variantValue = settingsMapGroupValue.toMap().value(settingName);
} }
} else { } else {
variantValue = _configMap.getMergedConfig().value(settingName); variantValue = _configMap.getUserConfig().value(settingName);
} }
QJsonValue result; QJsonValue result;
@ -1208,6 +1217,9 @@ void DomainServerSettingsManager::persistToFile() {
settingsFile.write(QJsonDocument::fromVariant(_configMap.getUserConfig()).toJson()); settingsFile.write(QJsonDocument::fromVariant(_configMap.getUserConfig()).toJson());
} else { } else {
qCritical("Could not write to JSON settings file. Unable to persist settings."); qCritical("Could not write to JSON settings file. Unable to persist settings.");
// failed to write, reload whatever the current config state is
_configMap.loadConfig(_argumentList);
} }
} }

View file

@ -111,6 +111,13 @@ void HifiConfigVariantMap::loadMasterAndUserConfig(const QStringList& argumentLi
loadMapFromJSONFile(_masterConfig, masterConfigFilepath); loadMapFromJSONFile(_masterConfig, masterConfigFilepath);
} }
// load the user config - that method replaces loadMasterAndUserConfig after the 1.7 migration
loadConfig(argumentList);
mergeMasterAndUserConfigs();
}
void HifiConfigVariantMap::loadConfig(const QStringList& argumentList) {
// load the user config // load the user config
const QString USER_CONFIG_FILE_OPTION = "--user-config"; const QString USER_CONFIG_FILE_OPTION = "--user-config";
static const QString USER_CONFIG_FILE_NAME = "config.json"; static const QString USER_CONFIG_FILE_NAME = "config.json";
@ -159,12 +166,10 @@ void HifiConfigVariantMap::loadMasterAndUserConfig(const QStringList& argumentLi
} }
} }
} }
} }
loadMapFromJSONFile(_userConfig, _userConfigFilename); loadMapFromJSONFile(_userConfig, _userConfigFilename);
mergeMasterAndUserConfigs();
} }
void HifiConfigVariantMap::mergeMasterAndUserConfigs() { void HifiConfigVariantMap::mergeMasterAndUserConfigs() {

View file

@ -21,6 +21,7 @@ public:
HifiConfigVariantMap(); HifiConfigVariantMap();
void loadMasterAndUserConfig(const QStringList& argumentList); void loadMasterAndUserConfig(const QStringList& argumentList);
void loadConfig(const QStringList& argumentList);
const QVariantMap& getMasterConfig() const { return _masterConfig; } const QVariantMap& getMasterConfig() const { return _masterConfig; }
QVariantMap& getUserConfig() { return _userConfig; } QVariantMap& getUserConfig() { return _userConfig; }