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

Reply via email to