From 0a91a1d9d89dfe53c3162b3f0e5773c52887a920 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 2 Sep 2015 14:59:54 -0400 Subject: [PATCH 1/2] Redirect to the /setup page automatically in the ER when not fully setup --- config.py | 2 +- static/js/pages/landing.js | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/config.py b/config.py index a1ecb2d52..ea65ad54e 100644 --- a/config.py +++ b/config.py @@ -20,7 +20,7 @@ CLIENT_WHITELIST = ['SERVER_HOSTNAME', 'PREFERRED_URL_SCHEME', 'MIXPANEL_KEY', 'STRIPE_PUBLISHABLE_KEY', 'ENTERPRISE_LOGO_URL', 'SENTRY_PUBLIC_DSN', 'AUTHENTICATION_TYPE', 'REGISTRY_TITLE', 'REGISTRY_TITLE_SHORT', 'CONTACT_INFO', 'AVATAR_KIND', 'LOCAL_OAUTH_HANDLER', 'DOCUMENTATION_LOCATION', - 'DOCUMENTATION_METADATA'] + 'DOCUMENTATION_METADATA', 'SETUP_COMPLETE'] def frontend_visible_config(config_dict): diff --git a/static/js/pages/landing.js b/static/js/pages/landing.js index 53c0e733e..e0f2c4d45 100644 --- a/static/js/pages/landing.js +++ b/static/js/pages/landing.js @@ -12,6 +12,11 @@ $scope.currentScreenshot = 'repo-view'; $scope.userRegistered = false; + if (!Config['SETUP_COMPLETE'] && !Features.BILLING) { + $location.path('/setup'); + return; + } + UserService.updateUserIn($scope, function(user) { if (!user.anonymous) { $location.path('/repository'); From f6cca8117816f0009f1d32739cf6a213390ec96c Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 2 Sep 2015 17:21:38 -0400 Subject: [PATCH 2/2] Handle hostname changes in the config panel Fixes #436 --- static/js/core-config-setup.js | 2 -- static/js/pages/setup.js | 6 +++++- static/js/pages/superuser.js | 7 +++++-- static/js/services/api-service.js | 11 +++-------- static/js/services/container-service.js | 25 +++++++++++++++++-------- static/partials/super-user.html | 2 +- 6 files changed, 31 insertions(+), 22 deletions(-) diff --git a/static/js/core-config-setup.js b/static/js/core-config-setup.js index 7d22d9fed..f67225843 100644 --- a/static/js/core-config-setup.js +++ b/static/js/core-config-setup.js @@ -227,9 +227,7 @@ angular.module("core-config-setup", ['angularFileUpload']) box.find("input").focus(); box.find("form").submit(function() { if (!$('#validatePassword').val()) { return; } - box.modal('hide'); - verifyNow(); }); }); }; diff --git a/static/js/pages/setup.js b/static/js/pages/setup.js index 3dfb817d3..90e32a403 100644 --- a/static/js/pages/setup.js +++ b/static/js/pages/setup.js @@ -93,6 +93,8 @@ $scope.stepProgress = []; $scope.hasSSL = false; $scope.hostname = null; + $scope.currentConfig = null; + $scope.currentState = { 'hasDatabaseSSLCert': false }; @@ -147,6 +149,8 @@ $scope.configurationSaved = function(config) { $scope.hasSSL = config['PREFERRED_URL_SCHEME'] == 'https'; $scope.hostname = config['SERVER_HOSTNAME']; + $scope.currentConfig = config; + $scope.currentStep = $scope.States.VALID_CONFIG; }; @@ -298,7 +302,7 @@ $scope.checkStatus = function() { ContainerService.checkStatus(function(resp) { $scope.currentStep = resp['status']; - }, $scope.hasSSL); + }, $scope.currentConfig); }; // Load the initial status. diff --git a/static/js/pages/superuser.js b/static/js/pages/superuser.js index 7ba61b308..5976e3c60 100644 --- a/static/js/pages/superuser.js +++ b/static/js/pages/superuser.js @@ -30,12 +30,14 @@ $scope.logsScrolled = false; $scope.csrf_token = encodeURIComponent(window.__token); $scope.dashboardActive = false; + $scope.currentConfig = null; $scope.setDashboardActive = function(active) { $scope.dashboardActive = active; }; - $scope.configurationSaved = function() { + $scope.configurationSaved = function(config) { + $scope.currentConfig = config; $scope.requiresRestart = true; }; @@ -321,6 +323,7 @@ $scope.requiresRestart = resp['requires_restart']; if ($scope.configStatus == 'ready') { + $scope.currentConfig = null; $scope.loadUsers(); } else { var message = "Installation of this product has not yet been completed." + @@ -331,7 +334,7 @@ var title = "Installation Incomplete"; CoreDialog.fatal(title, message); } - }); + }, $scope.currentConfig); }; // Load the initial status. diff --git a/static/js/services/api-service.js b/static/js/services/api-service.js index 14878a874..82dfb2547 100644 --- a/static/js/services/api-service.js +++ b/static/js/services/api-service.js @@ -47,7 +47,7 @@ angular.module('quay').factory('ApiService', ['Restangular', '$q', 'UtilService' return resource; }; - var buildUrl = function(path, parameters, opt_forcessl) { + var buildUrl = function(path, parameters) { // We already have /api/v1/ on the URLs, so remove them from the paths. path = path.substr('/api/v1/'.length, path.length); @@ -87,11 +87,6 @@ angular.module('quay').factory('ApiService', ['Restangular', '$q', 'UtilService' } } - // If we are forcing SSL, return an absolutel URL with an SSL prefix. - if (opt_forcessl) { - path = 'https://' + window.location.host + '/api/v1/' + path; - } - return url; }; @@ -216,8 +211,8 @@ angular.module('quay').factory('ApiService', ['Restangular', '$q', 'UtilService' var urlPath = path['x-path']; // Add the operation itself. - apiService[operationName] = function(opt_options, opt_parameters, opt_background, opt_forcessl) { - var one = Restangular.one(buildUrl(urlPath, opt_parameters, opt_forcessl)); + apiService[operationName] = function(opt_options, opt_parameters, opt_background) { + var one = Restangular.one(buildUrl(urlPath, opt_parameters)); if (opt_background) { one.withHttpConfig({ 'ignoreLoadingBar': true diff --git a/static/js/services/container-service.js b/static/js/services/container-service.js index 3d9036d29..a62bb5835 100644 --- a/static/js/services/container-service.js +++ b/static/js/services/container-service.js @@ -1,9 +1,9 @@ /** * Helper service for working with the registry's container. Only works in enterprise. */ -angular.module('quay').factory('ContainerService', ['ApiService', '$timeout', +angular.module('quay').factory('ContainerService', ['ApiService', '$timeout', 'Restangular', -function(ApiService, $timeout) { +function(ApiService, $timeout, Restangular) { var containerService = {}; containerService.restartContainer = function(callback) { ApiService.scShutdownContainer(null, null).then(function(resp) { @@ -11,25 +11,34 @@ function(ApiService, $timeout) { }, ApiService.errorDisplay('Cannot restart container. Please report this to support.')) }; - containerService.scheduleStatusCheck = function(callback) { + containerService.scheduleStatusCheck = function(callback, opt_config) { $timeout(function() { - containerService.checkStatus(callback); + containerService.checkStatus(callback, opt_config); }, 2000); }; - containerService.checkStatus = function(callback, force_ssl) { + containerService.checkStatus = function(callback, opt_config) { var errorHandler = function(resp) { if (resp.status == 404 || resp.status == 502) { // Container has not yet come back up, so we schedule another check. - containerService.scheduleStatusCheck(callback); + containerService.scheduleStatusCheck(callback, opt_config); return; } return ApiService.errorDisplay('Cannot load status. Please report this to support')(resp); }; - ApiService.scRegistryStatus(null, null) - .then(callback, errorHandler, /* background */true, /* force ssl*/force_ssl); + // If config is specified, override the API base URL from this point onward. + // TODO(jschorr): Find a better way than this. This is safe, since this will only be called + // for a restart, but it is still ugly. + if (opt_config && opt_config['SERVER_HOSTNAME']) { + var scheme = opt_config['PREFERRED_URL_SCHEME'] || 'http'; + var baseUrl = scheme + '://' + opt_config['SERVER_HOSTNAME'] + '/api/v1/'; + Restangular.setBaseUrl(baseUrl); + } + + ApiService.scRegistryStatus(null, null, /* background */true) + .then(callback, errorHandler); }; return containerService; diff --git a/static/partials/super-user.html b/static/partials/super-user.html index d4c5df1f1..6933ad538 100644 --- a/static/partials/super-user.html +++ b/static/partials/super-user.html @@ -47,7 +47,7 @@
+ configuration-saved="configurationSaved(config)">