Hi This patch includes the fix where this patch breaks when feature tests are run.
Set builtins.SERVER_MODE if it is present in globals()['SERVER_MODE'] else set to None. Please find updated patch. Thanks, Surinder On Wed, Aug 9, 2017 at 11:57 AM, Surinder Kumar < surinder.ku...@enterprisedb.com> wrote: > Sure, I will update. > > On Wed, Aug 9, 2017 at 11:17 AM, Dave Page <dp...@pgadmin.org> wrote: > >> Please update the patch :-) >> >> -- >> Dave Page >> Blog: http://pgsnake.blogspot.com >> Twitter: @pgsnake >> >> EnterpriseDB UK:http://www.enterprisedb.com >> The Enterprise PostgreSQL Company >> >> On 9 Aug 2017, at 05:53, Surinder Kumar <surinder.ku...@enterprisedb.com> >> wrote: >> >> Hi, >> >> I noticed that test cases don’t run and I got an error: >> >> (pgAdmin_27)Laptop195:regression surinder$ python runtests.py --pkg >> feature_tests >> <module '__builtin__' (built-in)> >> Traceback (most recent call last): >> File "runtests.py", line 45, in <module> >> import config >> File "/Users/surinder/Documents/Projects/pgadmin4/web/config.py", line >> 121, in <module> >> if builtins.SERVER_MODE is None: >> AttributeError: 'module' object has no attribute' >> SERVER_MODE >> ' >> >> I think this is because we are setting first builtins.SERVER_MODE in >> pgAdmin4.py >> but in test cases pgAdmin4.py is not being called. >> >> >> On Tue, Aug 8, 2017 at 4:03 PM, Dave Page <dp...@pgadmin.org> wrote: >> >>> >>> >>> On Tue, Aug 8, 2017 at 11:27 AM, Surinder Kumar < >>> surinder.ku...@enterprisedb.com> wrote: >>> >>>> On Tue, Aug 8, 2017 at 1:47 PM, Dave Page <dp...@pgadmin.org> wrote: >>>> >>>> >>>>> >>>>> On Tue, Aug 8, 2017 at 7:18 AM, Surinder Kumar < >>>>> surinder.ku...@enterprisedb.com> wrote: >>>>> >>>>>> Hi >>>>>> >>>>>> On Ubuntu-14.04, I got error Application Server couldn't be contacted >>>>>> : >>>>>> >>>>>> *Steps performed:* >>>>>> >>>>>> - I have already installed pgAdmin4-1.4 which come with >>>>>> PostgreSQL-9.6 installer. >>>>>> then I run root@ubuntu:/opt/PostgreSQL/9.6/pgAdmin 4/bin# >>>>>> ./pgAdmin4./. >>>>>> - Now took latest git pull from HEAD >>>>>> - Apply unified_config.diff patch. >>>>>> - Then compiled pgAdmin4 in runtime and then run ./pgAdmin. >>>>>> - Got error Application Server couldn't be contacted. >>>>>> >>>>>> But when I ran ./pgAdmin4 for the second time. pgAdmin4 runs without >>>>>> any issue. >>>>>> I didn’t get any error on the terminal and log file. >>>>>> I couldn't find why it gives this error. >>>>>> >>>>> >>>>> I know Fahar has run into this with existing releases on Ubuntu. If >>>>> you enable debugging, can you see any clues? I assume it's going round the >>>>> retry loop before aborting? >>>>> >>>>>> *Another issue related to Alembic:* >>>>>> >>>>>> If I am running pgAdmin4 already installed on my machine, then I >>>>>> upgrade pgAdmin4 using Python wheel: >>>>>> >>>>>> (test_p27) surinder@ubuntu:~/virtualenvs/test_p27$ python >>>>>> ~/virtualenvs/test_p27/lib/python2.7/site-packages/pgadmin4/ >>>>>> pgAdmin4.py >>>>>> >>>>>> *I am getting error:* >>>>>> >>>>>> alembic.util.exc.CommandError: Can't locate revision identified by >>>>>> 'd85a62333272' >>>>>> >>>>>> To fix this, I have to delete existing pgadmin4.db file. I don’t >>>>>> know if it is a valid case or should I log an RM if it is? >>>>>> >>>>> That's an annoying side-effect of the move to Alembic. The previous DB >>>>> code would quite happily (and intentionally) run with a newer version of >>>>> the database, however, the new code does not. You'll see this issue >>>>> whenever you've run a newer version of pgAdmin and then go back to an >>>>> older >>>>> version that uses an older schema version. >>>>> >>>>> It would be nice to change this so it doesn't complain - but we'd have >>>>> to be cautious to only break compatibility on major releases. >>>>> >>>>> >>>>> >>>>>> Apart for this, I didn’t see any functionality break. It works!! >>>>>> >>>>>> >>>>>> I liked the approach to set SEVER_MODE in runtime using built-ins. >>>>>> >>>>> Thanks. Do you think it warrants a 2.0 version number, given the >>>>> potential for breaking existing installations (I do, but would like other >>>>> feedback)? If we do that - and thus allow a parallel installation of 1.x >>>>> and 2.x), how would we resolve the Alembic issue you noted such that both >>>>> versions could be run against the same DB? >>>>> >>>> To resolve this issue while upgrading to newer version of pgAdmin4, we >>>> can add a parameter version_table: 'alembic_version-1.6 in >>>> web/migrations/env.py of upcoming pgAdmin4 source code(reference link >>>> <https://issues.asterisk.org/jira/secure/attachment/51610/ASTERISK-24311-set-version-table.diff> >>>> ) >>>> It will create a new version table in pgadmin4.db database and it will >>>> instruct the Alembic to run migrations for the version stored in >>>> table(alembic_version-1.6) when new pgAdmin4 will be installed. >>>> >>>> I tried to check if it works or not. But somehow I couldn’t install >>>> pgAdmin4-1.5 from wheel. >>>> >>>> Alternatively I will try to generate new schema using in pgAdmin4 >>>> source code(Git HEAD). It will generate a new migration version and then i >>>> will run pgAdmin4-1.6 from wheel having different migration number. It will >>>> create pgadmin4.db for 1.5. >>>> Then >>>> I will run pgAdmin4-1.6 from source code, so migration will take place >>>> and hopefully >>>> the >>>> sa >>>> me >>>> >>>> pgadmin4.db will work for newer pgAdmin4 version. >>>> >>>> Reference link <https://issues.asterisk.org/jira/browse/ASTERISK-24311> >>>> where the same issue has been discussed. >>>> >>> >>> Sounds good - please investigate further. >>> >> I spent some time, understands how Alembic works and I thought it is >> easy using the reference link but not, It needs more R&D. I will look how >> can we fix it. >> >>> >>> Thanks! >>> >>> >>>> Thanks, >>>> Surinder >>>> >>>> >>>>> >>>>> >>>>>> Thanks, >>>>>> Surinder >>>>>> >>>>>> >>>>>> On Mon, Aug 7, 2017 at 7:01 PM, Dave Page <dp...@pgadmin.org> wrote: >>>>>> >>>>>>> >>>>>>> >>>>>>> On Mon, Aug 7, 2017 at 1:43 PM, Surinder Kumar < >>>>>>> surinder.ku...@enterprisedb.com> wrote: >>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> The patch seems to work in Runtime mode, but fails in Server mode >>>>>>>> with error: >>>>>>>> >>>>>>>> (pgAdmin_27)Laptop195:pgadmin4 surinder$ python web/pgAdmin4.py >>>>>>>> Traceback (most recent call last): >>>>>>>> File "web/pgAdmin4.py", line 55, in <module> >>>>>>>> exec(open(file_quote(setupfile), 'r').read()) >>>>>>>> File "<string>", line 35, in <module> >>>>>>>> File >>>>>>>> "/Users/surinder/Documents/Projects/pgadmin4/web/pgadmin/setup/data_directory.py", >>>>>>>> line 23, in create_app_data_directory >>>>>>>> >>>>>>>> _create_directory_if_not_exists(os.path.dirname(config.SQLITE_PATH)) >>>>>>>> File >>>>>>>> "/Users/surinder/Documents/Projects/pgadmin4/web/pgadmin/setup/data_directory.py", >>>>>>>> line 15, in _create_directory_if_not_exists >>>>>>>> os.mkdir(_path) >>>>>>>> OSError: [Errno 13] Permission denied: '/var/lib/pgadmin' >>>>>>>> (pgAdmin_27)Laptop195:pgadmin4 surinder$ >>>>>>>> >>>>>>>> This is because the directory /var/lib/ has root only access and I >>>>>>>> am running pgAdmin4 with the non-root user. >>>>>>>> >>>>>>>> Also pgadmin directory is not created. >>>>>>>> >>>>>>>> (pgAdmin_35)Laptop195:pgadmin4 surinder$ ls /var/lib/pgadmin >>>>>>>> ls: /var/lib/pgadmin: No such file or directory >>>>>>>> >>>>>>>> I got same error with MacOSX and Ubuntu-14.04 machines irrespective >>>>>>>> of Python version. >>>>>>>> >>>>>>>> Meanwhile, I am testing patch with other test cases. >>>>>>>> >>>>>>> That's fully expected. In the case of Linux, the packages will be >>>>>>> responsible for creating those directories with the appropriate >>>>>>> ownership. >>>>>>> In other cases, the user would. >>>>>>> >>>>>> ok, I got it. >>>>>> >>>>>>> >>>>>>> There's not really much we can do about that - and it's exactly what >>>>>>> would happen if you try to run many other packages yourself when >>>>>>> standard >>>>>>> *nix paths are used. >>>>>>> >>>>>> >>>>>>> >>>>>>> >>>>>>>> Thanks, >>>>>>>> Surinder >>>>>>>> >>>>>>>> >>>>>>>> On Mon, Aug 7, 2017 at 4:33 PM, Surinder Kumar < >>>>>>>> surinder.ku...@enterprisedb.com> wrote: >>>>>>>> >>>>>>>>> On Mon, Aug 7, 2017 at 4:11 PM, Ashesh Vashi < >>>>>>>>> ashesh.va...@enterprisedb.com> wrote: >>>>>>>>> >>>>>>>>>> On Mon, Aug 7, 2017 at 3:59 PM, Dave Page <dp...@pgadmin.org> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>>> Anyone? >>>>>>>>>>> >>>>>>>>>> Surinder - please give this one priority. >>>>>>>>>> >>>>>>>>> Sure >>>>>>>>> . >>>>>>>>> >>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> >>>>>>>>>> Thanks & Regards, >>>>>>>>>> >>>>>>>>>> Ashesh Vashi >>>>>>>>>> EnterpriseDB INDIA: Enterprise PostgreSQL Company >>>>>>>>>> <http://www.enterprisedb.com/> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> *http://www.linkedin.com/in/asheshvashi* >>>>>>>>>> <http://www.linkedin.com/in/asheshvashi> >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Thu, Jul 20, 2017 at 5:03 PM, Dave Page <dp...@pgadmin.org> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> All, >>>>>>>>>>>> >>>>>>>>>>>> Attached is a patch that aims to allow us to have a >>>>>>>>>>>> standardised config that will work out of the box for both web and >>>>>>>>>>>> desktop >>>>>>>>>>>> modes. It does this by doing two things: >>>>>>>>>>>> >>>>>>>>>>>> 1) The runtime sets SERVER_MODE in the Python environment >>>>>>>>>>>> before starting the app. If this value is set, then it overrides >>>>>>>>>>>> the >>>>>>>>>>>> default value of SERVER_MODE in the config. >>>>>>>>>>>> >>>>>>>>>>>> 2) The config file then offers default values for the various >>>>>>>>>>>> file locations for both server and desktop mode, setting them >>>>>>>>>>>> appropriately >>>>>>>>>>>> based on the derived SERVER_MODE value. >>>>>>>>>>>> >>>>>>>>>>>> The only downsides I can see from this are: >>>>>>>>>>>> >>>>>>>>>>>> - You cannot run in server mode in the runtime without manually >>>>>>>>>>>> reconfiguring SERVER_MODE and likely a bunch of paths in >>>>>>>>>>>> config_local.py >>>>>>>>>>>> >>>>>>>>>>>> - If you want to override SERVER_MODE, you'll probably also >>>>>>>>>>>> need to redefine the various paths in config_local.py. >>>>>>>>>>>> >>>>>>>>>>>> I don't see either being something 99.9% of users would need >>>>>>>>>>>> though. >>>>>>>>>>>> >>>>>>>>>>>> Can anyone see if the patch breaks anything, or if I missed any >>>>>>>>>>>> side effects? >>>>>>>>>>>> >>>>>>>>>>>> Is it likely to break things during upgrades? I suspect so... >>>>>>>>>>>> so maybe this should prompt v2.0? >>>>>>>>>>>> >>>>>>>>>>>> I'd appreciate multiple reviews of this, as it could break >>>>>>>>>>>> things. Note that I haven't yet updated the docs. >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> Dave Page >>>>>>>>>>>> Blog: http://pgsnake.blogspot.com >>>>>>>>>>>> Twitter: @pgsnake >>>>>>>>>>>> >>>>>>>>>>>> EnterpriseDB UK: http://www.enterprisedb.com >>>>>>>>>>>> The Enterprise PostgreSQL Company >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> Dave Page >>>>>>>>>>> Blog: http://pgsnake.blogspot.com >>>>>>>>>>> Twitter: @pgsnake >>>>>>>>>>> >>>>>>>>>>> EnterpriseDB UK: http://www.enterprisedb.com >>>>>>>>>>> The Enterprise PostgreSQL Company >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Dave Page >>>>>>> Blog: http://pgsnake.blogspot.com >>>>>>> Twitter: @pgsnake >>>>>>> >>>>>>> EnterpriseDB UK: http://www.enterprisedb.com >>>>>>> The Enterprise PostgreSQL Company >>>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> Dave Page >>>>> Blog: http://pgsnake.blogspot.com >>>>> Twitter: @pgsnake >>>>> >>>>> EnterpriseDB UK: http://www.enterprisedb.com >>>>> The Enterprise PostgreSQL Company >>>>> >>>> >>>> >>> >>> >>> >>> -- >>> Dave Page >>> Blog: http://pgsnake.blogspot.com >>> Twitter: @pgsnake >>> >>> EnterpriseDB UK: http://www.enterprisedb.com >>> The Enterprise PostgreSQL Company >>> >> >> >
diff --git a/web/config.py b/web/config.py index f4609e4e9..32df08d5d 100644 --- a/web/config.py +++ b/web/config.py @@ -11,9 +11,15 @@ # ########################################################################## +import logging import os import sys +if sys.version_info[0] >= 3: + import builtins +else: + import __builtin__ as builtins + # We need to include the root directory in sys.path to ensure that we can # find everything we need when running in the standalone runtime. @@ -93,46 +99,6 @@ MODULE_BLACKLIST = ['test'] NODE_BLACKLIST = [] -# Data directory for storage of config settings etc. This shouldn't normally -# need to be changed - it's here as various other settings depend on it. -if IS_WIN: - # Use the short path on windows - DATA_DIR = os.path.realpath( - os.path.join(fs_short_path(env('APPDATA')), u"pgAdmin") - ) -else: - DATA_DIR = os.path.realpath(os.path.expanduser(u'~/.pgadmin/')) - - -########################################################################## -# Log settings -########################################################################## - -# Debug mode? -DEBUG = False - - -import logging - -# Application log level - one of: -# CRITICAL 50 -# ERROR 40 -# WARNING 30 -# SQL 25 -# INFO 20 -# DEBUG 10 -# NOTSET 0 -CONSOLE_LOG_LEVEL = logging.WARNING -FILE_LOG_LEVEL = logging.WARNING - -# Log format. -CONSOLE_LOG_FORMAT = '%(asctime)s: %(levelname)s\t%(name)s:\t%(message)s' -FILE_LOG_FORMAT = '%(asctime)s: %(levelname)s\t%(name)s:\t%(message)s' - -# Log file name -LOG_FILE = os.path.join(DATA_DIR, 'pgadmin4.log') - - ########################################################################## # Server settings ########################################################################## @@ -142,7 +108,19 @@ LOG_FILE = os.path.join(DATA_DIR, 'pgadmin4.log') # default login. # # DO NOT DISABLE SERVER MODE IF RUNNING ON A WEBSERVER!! -SERVER_MODE = True +# +# We only set SERVER_MODE if it's not already set. That's to allow the +# runtime to force it to False. +# +# NOTE: If you change the value of SERVER_MODE in an included config file, +# you may also need to redefine any values below that are derived +# from it, notably various paths such as LOG_FILE and anything +# using DATA_DIR. + +if builtins.SERVER_MODE is None: + SERVER_MODE = True +else: + SERVER_MODE = builtins.SERVER_MODE # User ID (email address) to use for the default user in desktop mode. # The default should be fine here, as it's not exposed in the app. @@ -177,6 +155,52 @@ SECURITY_PASSWORD_HASH = 'pbkdf2_sha512' # has no effect on <= Python 2.7. MINIFY_PAGE = True +# Data directory for storage of config settings etc. This shouldn't normally +# need to be changed - it's here as various other settings depend on it. +# On Windows, we always store data in %APPDATA%\pgAdmin. On other platforms, +# if we're in server mode we use /var/lib/pgadmin, otherwise ~/.pgadmin +if IS_WIN: + # Use the short path on windows + DATA_DIR = os.path.realpath( + os.path.join(fs_short_path(env('APPDATA')), u"pgAdmin") + ) +else: + if SERVER_MODE: + DATA_DIR = '/var/lib/pgadmin' + else: + DATA_DIR = os.path.realpath(os.path.expanduser(u'~/.pgadmin/')) + + +########################################################################## +# Log settings +########################################################################## + +# Debug mode? +DEBUG = False + +# Application log level - one of: +# CRITICAL 50 +# ERROR 40 +# WARNING 30 +# SQL 25 +# INFO 20 +# DEBUG 10 +# NOTSET 0 +CONSOLE_LOG_LEVEL = logging.WARNING +FILE_LOG_LEVEL = logging.WARNING + +# Log format. +CONSOLE_LOG_FORMAT = '%(asctime)s: %(levelname)s\t%(name)s:\t%(message)s' +FILE_LOG_FORMAT = '%(asctime)s: %(levelname)s\t%(name)s:\t%(message)s' + +# Log file name. This goes in the data directory, except on non-Windows +# platforms in server mode. +if SERVER_MODE and not IS_WIN: + LOG_FILE = '/var/log/pgadmin/pgadmin4.log' +else: + LOG_FILE = os.path.join(DATA_DIR, 'pgadmin4.log') + + ########################################################################## # Server Connection Driver Settings ########################################################################## diff --git a/web/pgAdmin4.py b/web/pgAdmin4.py index 4a1855707..b6f9c9dca 100644 --- a/web/pgAdmin4.py +++ b/web/pgAdmin4.py @@ -14,12 +14,23 @@ to start a web server.""" import os import sys +if sys.version_info[0] >= 3: + import builtins +else: + import __builtin__ as builtins + # We need to include the root directory in sys.path to ensure that we can # find everything we need when running in the standalone runtime. root = os.path.dirname(os.path.realpath(__file__)) if sys.path[0] != root: sys.path.insert(0, root) +# Grab the SERVER_MODE if it's been set by the runtime +if 'SERVER_MODE' in globals(): + builtins.SERVER_MODE = globals()['SERVER_MODE'] +else: + builtins.SERVER_MODE = None + import config from pgadmin import create_app from pgadmin.utils import u, fs_encoding, file_quote diff --git a/web/regression/runtests.py b/web/regression/runtests.py index 2d4e2bc40..1a44a47ab 100644 --- a/web/regression/runtests.py +++ b/web/regression/runtests.py @@ -27,6 +27,11 @@ if sys.version_info < (2, 7): else: import unittest as unit_test +if sys.version_info[0] >= 3: + import builtins +else: + import __builtin__ as builtins + logger = logging.getLogger(__name__) file_name = os.path.basename(__file__) @@ -41,6 +46,12 @@ if sys.path[0] != root: sys.path.insert(0, root) os.chdir(root) +# Grab the SERVER_MODE if it's been set by the runtime +if 'SERVER_MODE' in globals(): + builtins.SERVER_MODE = globals()['SERVER_MODE'] +else: + builtins.SERVER_MODE = None + from pgadmin import create_app import config from regression import test_setup