Commit 901af395 authored by Jim Fulton's avatar Jim Fulton

Added a convenience function to start a storage server without having

to create configuration files first. This is primarily useful for
exploration and development.
parent 9c0049b5
...@@ -25,4 +25,56 @@ def DB(*args, **kw): ...@@ -25,4 +25,56 @@ def DB(*args, **kw):
import ZEO.ClientStorage, ZODB import ZEO.ClientStorage, ZODB
return ZODB.DB(ZEO.ClientStorage.ClientStorage(*args, **kw)) return ZODB.DB(ZEO.ClientStorage.ClientStorage(*args, **kw))
def server(path=None, blob_dir=None, storage_conf=None, zeo_conf=None,
port=None):
"""Convenience function to start a server for interactive exploration
This fuction starts a ZEO server, given a storage configuration or
a file-storage path and blob directory. You can also supply a ZEO
configuration string or a port. If neither a ZEO port or
configuration is supplied, a port is chosen randomly.
The server address and a stop function are returned. The address
can be passed to ZEO.ClientStorage.ClientStorage or ZEO.DB to
create a client to the server. The stop function can be called
without arguments to stop the server.
Arguments:
path
A file-storage path. This argument is ignored if a storage
configuration is supplied.
blob_dir
A blob directory path. This argument is ignored if a storage
configuration is supplied.
storage_conf
A storage configuration string. If none is supplied, then at
least a file-storage path must be supplied and the storage
configuration will be generated from the file-storage path and
the blob directory.
zeo_conf
A ZEO server configuration string.
port
If no ZEO configuration is supplied, the one will be computed
from the port. If no port is supplied, one will be chosedn
randomly.
"""
import os, ZEO.tests.forker
if storage_conf is None and path is None:
raise TypeError("You must specify either a storage_conf or file path.")
if port is None and zeo_conf is None:
port = ZEO.tests.forker.get_port()
addr, admin, pid, config = ZEO.tests.forker.start_zeo_server(
storage_conf, zeo_conf, port, keep=True, path=path,
blob_dir=blob_dir, suicide=False)
os.remove(config)
def stop_server():
ZEO.tests.forker.shutdown_zeo_server(admin)
os.waitpid(pid, 0)
return addr, stop_server
...@@ -86,7 +86,8 @@ def encode_format(fmt): ...@@ -86,7 +86,8 @@ def encode_format(fmt):
def start_zeo_server(storage_conf=None, zeo_conf=None, port=None, keep=False, def start_zeo_server(storage_conf=None, zeo_conf=None, port=None, keep=False,
path='Data.fs', protocol=None): path='Data.fs', protocol=None, blob_dir=None,
suicide=True):
"""Start a ZEO server in a separate process. """Start a ZEO server in a separate process.
Takes two positional arguments a string containing the storage conf Takes two positional arguments a string containing the storage conf
...@@ -98,6 +99,9 @@ def start_zeo_server(storage_conf=None, zeo_conf=None, port=None, keep=False, ...@@ -98,6 +99,9 @@ def start_zeo_server(storage_conf=None, zeo_conf=None, port=None, keep=False,
if not storage_conf: if not storage_conf:
storage_conf = '<filestorage>\npath %s\n</filestorage>' % path storage_conf = '<filestorage>\npath %s\n</filestorage>' % path
if blob_dir:
storage_conf = '<blobstorage>\nblob-dir %s\n%s\n</blobstorage>' % (
blob_dir, storage_conf)
if port is None: if port is None:
raise AssertionError("The port wasn't specified") raise AssertionError("The port wasn't specified")
...@@ -126,6 +130,8 @@ def start_zeo_server(storage_conf=None, zeo_conf=None, port=None, keep=False, ...@@ -126,6 +130,8 @@ def start_zeo_server(storage_conf=None, zeo_conf=None, port=None, keep=False,
args = [qa(sys.executable), qa(script), '-C', qa(tmpfile)] args = [qa(sys.executable), qa(script), '-C', qa(tmpfile)]
if keep: if keep:
args.append("-k") args.append("-k")
if not suicide:
args.append("-S")
if protocol: if protocol:
args.extend(["-v", protocol]) args.extend(["-v", protocol])
......
...@@ -153,13 +153,16 @@ def main(): ...@@ -153,13 +153,16 @@ def main():
# wrong, it's a bug in the test suite. # wrong, it's a bug in the test suite.
keep = 0 keep = 0
configfile = None configfile = None
suicide = True
# Parse the arguments and let getopt.error percolate # Parse the arguments and let getopt.error percolate
opts, args = getopt.getopt(sys.argv[1:], 'kC:v:') opts, args = getopt.getopt(sys.argv[1:], 'kSC:v:')
for opt, arg in opts: for opt, arg in opts:
if opt == '-k': if opt == '-k':
keep = 1 keep = 1
elif opt == '-C': elif opt == '-C':
configfile = arg configfile = arg
elif opt == '-S':
suicide = False
elif opt == '-v': elif opt == '-v':
import ZEO.zrpc.connection import ZEO.zrpc.connection
ZEO.zrpc.connection.Connection.current_protocol = arg ZEO.zrpc.connection.Connection.current_protocol = arg
...@@ -205,10 +208,11 @@ def main(): ...@@ -205,10 +208,11 @@ def main():
sys.exit(2) sys.exit(2)
t.register_socket(server.dispatcher) t.register_socket(server.dispatcher)
# Create daemon suicide thread if suicide:
d = Suicide(test_addr) # Create daemon suicide thread
d.setDaemon(1) d = Suicide(test_addr)
d.start() d.setDaemon(1)
d.start()
# Loop for socket events # Loop for socket events
log(label, 'entering asyncore loop') log(label, 'entering asyncore loop')
asyncore.loop() asyncore.loop()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment