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 <
[email protected]> wrote:
> Sure, I will update.
>
> On Wed, Aug 9, 2017 at 11:17 AM, Dave Page <[email protected]> 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 <[email protected]>
>> 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 <[email protected]> wrote:
>>
>>>
>>>
>>> On Tue, Aug 8, 2017 at 11:27 AM, Surinder Kumar <
>>> [email protected]> wrote:
>>>
>>>> On Tue, Aug 8, 2017 at 1:47 PM, Dave Page <[email protected]> wrote:
>>>>
>>>>
>>>>>
>>>>> On Tue, Aug 8, 2017 at 7:18 AM, Surinder Kumar <
>>>>> [email protected]> 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 <[email protected]> wrote:
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Mon, Aug 7, 2017 at 1:43 PM, Surinder Kumar <
>>>>>>> [email protected]> 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 <
>>>>>>>> [email protected]> wrote:
>>>>>>>>
>>>>>>>>> On Mon, Aug 7, 2017 at 4:11 PM, Ashesh Vashi <
>>>>>>>>> [email protected]> wrote:
>>>>>>>>>
>>>>>>>>>> On Mon, Aug 7, 2017 at 3:59 PM, Dave Page <[email protected]>
>>>>>>>>>> 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 <[email protected]>
>>>>>>>>>>> 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