[prev in list] [next in list] [prev in thread] [next in thread] 

List:       mesos-dev
Subject:    [jira] [Commented] (MESOS-857) restructure mesos python namespace
From:       "brian wickman (JIRA)" <jira () apache ! org>
Date:       2014-04-30 17:44:18
Message-ID: JIRA.12682211.1386013670010.207925.1398879858499 () arcas
[Download RAW message or body]


    [ https://issues.apache.org/jira/browse/MESOS-857?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13985801#comment-13985801 \
] 

brian wickman commented on MESOS-857:
-------------------------------------

I propose that we restructure the mesos python project.  Right now it's fractured \
haphazardly, yet there are idioms made available by the python packaging ecosystem to \
do this correctly.

For example, there is src/cli which is a mishmash of C++ and python, which contains a \
redeclaration of 'mesos' in unpackaged form which would conflict with the existing \
code in src/python.  Now src/python bundles mesos_pb2.py, mesos.py and _mesos.so in a \
top-level namespace.  Ordinarily if you 'pip install baz', you expect one top level \
package name and everything residing underneath, e.g. 'import baz' with baz.foo, \
baz.bar, baz.bak subpackages.

We should structure the mesos namespace such that bits and pieces of mesos can be \
installed a la carte.  Right now you have to go all-in, bringing in C extensions \
(which are challenging to build and have no pure source distribution available yet) \
which is a hindrance for adoption.

It seems reasonable that I might just want API stubs or the code-generated protobuf \
classes or just the CLI.  We can do this in a few ways, but it means splitting \
everything into different packages with dependencies between each (codified by \
"install_requires" in setup.py.)  The following proposal uses a top-level 'mesos' \
namespace package, but it could be done with separate top-level packages, e.g. \
mesos_api, mesos_driver, instead of mesos.api or mesos.driver.

I propose the following packages (which would also mirror the import namespace):

{noformat}
  mesos [nspkg]
  mesos.api [pkg]
  mesos.cli [pkg]
  mesos.driver [pkg]
  mesos.native [pkg]
  mesos.protocol [pkg]
{noformat}

mesos should be a namespace package: it contains no symbols.  But by default it would \
have install_requires on everything provided within the mesos project, so that 'pip \
install mesos' does approximately the correct thing.  But in and of itself, it would \
contain no sources.

mesos.api should contain just the Scheduler, SchedulerDriver, Executor, \
ExecutorDriver (and in the future, possibly Log, LogDriver, Containerizer, \
ContainerizerDriver) stubs.  it has no dependencies on anything else.

mesos.cli should contain all the CLI commands.  it also shouldn't need to depend on \
any other packages except maybe mesos.protocol.  we can use the console_scripts entry \
point in mesos.cli to handle script installation (see \
http://www.scotttorborg.com/python-packaging/command-line-scripts.html#the-console-scripts-entry-point \
).  this means 'pip install mesos.cli' would create wrapper scripts for mesos-cat, \
mesos-ps, etc, that correctly invoke the underlying python modules with all the \
dependencies set up correctly, and put onto the $PATH in the same place as your \
python interpreter.

mesos.driver should be a package that is a small wrapper around pkg_resources \
find_packages + get_entry_map and used to detect any python packages in the \
environment exporting concrete driver implementations (e.g. \
_mesos.MesosSchedulerDriver or _mesos.MesosExecutorDriver.)  this would be done via \
EntryPoints (see https://pythonhosted.org/setuptools/pkg_resources.html#entry-points \
)

mesos.native should be the package that contains _mesos.so and entry_point metadata \
expected by mesos.driver in the setup.py.  we could even go so far as to publish \
mesos.native.el5 or mesos.native.el6 binary wheels to PyPI in order to differentiate \
linux ABIs, but have them correctly detected and picked up by mesos.driver at \
runtime.  this strategy is also compatible with the pesos project \
(https://github.com/wickman/pesos ), which would just publish PesosSchedulerDriver \
and PesosExecutorDriver entry points for mesos.driver, allowing a pure python \
scheduler or executor to be implemented.

finally, mesos.protocol would be the package containing all of the code-generated \
protobuf stubs.  we could even split mesos.protocol out as a namespace package with \
separate subpackages for mesos.protocol.pb, mesos.protocol.json.  currently protobuf \
only supports python 2.x (there are some branches out there with support for 3.x but \
afaik there is no plan for those to reach master.)  mesos.protocol.pb would have an \
install_requires on protobuf, and mesos.protocol.json would be dependency-free, and \
hence friendly with python 3.x.  ideally there would be helper messages for \
constructing the body of libprocess messages (the "wire protocol".)  in the future \
that could be ported over to the Event/Call interface that Ben has described.

in order to support legacy applications, we could have the mesos.legacy package, \
which would map all the above names into their _mesos, mesos_pb2 and mesos.* \
counterparts.

> restructure mesos python namespace
> ----------------------------------
> 
> Key: MESOS-857
> URL: https://issues.apache.org/jira/browse/MESOS-857
> Project: Mesos
> Issue Type: Improvement
> Components: python api
> Reporter: brian wickman
> 
> Right now the mesos_pb2 and mesos dependencies are bundled together into the mesos \
> egg. We have some tooling that uses just the compiled protobufs, but because \
> they're lumped together with the mesos egg, we get all the dependency/platform \
> nightmare that comes along with it, not to mention the bloat of including 20MB of \
> .so files.  This proposes splitting the mesos protobufs into a separate mesos_pb \
> distribution that the mesos distribution should depend upon via install_requires \
> (e.g. "mesos_pb==0.15.0-rc4")



--
This message was sent by Atlassian JIRA
(v6.2#6252)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic