aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Burns <brian.p.burns@gmail.com>2017-01-08 17:21:20 -0500
committerBrian Burns <brian.p.burns@gmail.com>2017-01-08 17:21:20 -0500
commit8f90b78820a2c07e4ed79ba1973d93706aff70cb (patch)
tree82f3fbc0fc9189a716ef6076c5cdeec18b135318
parent22099a4b1c7c5f1f225b5cc1b257855d558d1905 (diff)
downloadtoree-gateway-8f90b78820a2c07e4ed79ba1973d93706aff70cb.tar.gz
toree-gateway-8f90b78820a2c07e4ed79ba1973d93706aff70cb.tar.bz2
toree-gateway-8f90b78820a2c07e4ed79ba1973d93706aff70cb.zip
python kernel
-rw-r--r--kernel.json13
-rw-r--r--pom.xml5
-rw-r--r--python/build/lib/toree_kernel.py135
-rw-r--r--python/dist/toree_kernel-0.1-py3.5.eggbin0 -> 4747 bytes
-rw-r--r--python/setup.py17
-rw-r--r--python/toree_kernel.egg-info/PKG-INFO15
-rw-r--r--python/toree_kernel.egg-info/SOURCES.txt7
-rw-r--r--python/toree_kernel.egg-info/dependency_links.txt1
-rw-r--r--python/toree_kernel.egg-info/requires.txt2
-rw-r--r--python/toree_kernel.egg-info/top_level.txt1
-rw-r--r--python/toree_kernel.py125
-rw-r--r--src/main/scala/com/ibm/ToreeClient.scala10
12 files changed, 329 insertions, 2 deletions
diff --git a/kernel.json b/kernel.json
new file mode 100644
index 0000000..3294399
--- /dev/null
+++ b/kernel.json
@@ -0,0 +1,13 @@
+{
+ "language_info": {
+ "name": "scala"
+ },
+ "display_name": "Toree Client Kernel",
+ "argv": [
+ "python",
+ "/Users/bburns/toree_client/python/toree_kernel.py",
+ "-f",
+ "{connection_file}"
+ ],
+ "codemirror_mode": "scala"
+}
diff --git a/pom.xml b/pom.xml
index e0385c2..b606ad5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,6 +62,11 @@
</excludes>
</filter>
</filters>
+ <transformers>
+ <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+ <resource>reference.conf</resource>
+ </transformer>
+ </transformers>
</configuration>
</execution>
</executions>
diff --git a/python/build/lib/toree_kernel.py b/python/build/lib/toree_kernel.py
new file mode 100644
index 0000000..f7269fa
--- /dev/null
+++ b/python/build/lib/toree_kernel.py
@@ -0,0 +1,135 @@
+import os
+import signal
+import sys
+import time
+import io
+
+from os import O_NONBLOCK, read
+from fcntl import fcntl, F_GETFL, F_SETFL
+from subprocess import Popen, PIPE
+from metakernel import MetaKernel
+from py4j.java_gateway import JavaGateway, CallbackServerParameters, java_import
+from py4j.protocol import Py4JError
+
+class TextOutput(object):
+ """Wrapper for text output whose repr is the text itself.
+ This avoids `repr(output)` adding quotation marks around already-rendered text.
+ """
+ def __init__(self, output):
+ self.output = output
+
+ def __repr__(self):
+ return self.output
+
+class ToreeKernel(MetaKernel):
+ implementation = 'toree_kernel'
+ implementation_version = '0.1'
+ langauge = 'scala'
+ language_version = '2.11'
+ banner = "toree_kernel"
+ language_info = {'name': 'scala',
+ 'mimetype': 'application/scala',
+ 'file_extension': '.scala'}
+
+ kernel_json = {
+ 'argv': [
+ 'python', '-m', 'toree_kernel', '-f', '{connection_file}'],
+ 'display_name': 'Toree Client',
+ 'language': 'scala',
+ 'name': 'toree_kernel'
+ }
+
+ def __init__(self, **kwargs):
+ super(ToreeKernel, self).__init__(**kwargs)
+ #self._start_toree_client()
+
+ #def sig_handler(signum, frame):
+ #self.gateway_proc.terminate()
+
+ def do_shutdown(self, restart):
+ super(ToreeKernel, self).do_shutdown(restart)
+ #self.gateway_proc.terminate()
+
+ def _start_toree_client(self):
+ args = [
+ "java",
+ "-classpath",
+ "../target/toree_client-0.1-jar-with-dependencies.jar",
+ "com.ibm.ToreeClient"
+ ]
+
+ self.gateway_proc = Popen(args, stderr=PIPE, stdout=PIPE)
+ time.sleep(1.5)
+ self.gateway = JavaGateway(
+ start_callback_server=True,
+ callback_server_parameters=CallbackServerParameters())
+
+ flags = fcntl(self.gateway_proc.stdout, F_GETFL) # get current p.stdout flags
+ fcntl(self.gateway_proc.stdout, F_SETFL, flags | O_NONBLOCK)
+
+ flags = fcntl(self.gateway_proc.stderr, F_GETFL) # get current p.stdout flags
+ fcntl(self.gateway_proc.stderr, F_SETFL, flags | O_NONBLOCK)
+
+ signal.signal(signal.SIGTERM, self.sig_handler)
+ signal.signal(signal.SIGINT, self.sig_handler)
+ signal.signal(signal.SIGHUP, self.sig_handler)
+
+
+ def Error(self, output):
+ if not output:
+ return
+
+ super(ToreeKernel, self).Error(output)
+
+ def handle_output(self, fd, fn):
+ stringIO = io.StringIO()
+ while True:
+ try:
+ b = read(fd.fileno(), 1024)
+ if b:
+ stringIO.write(b.decode('utf-8'))
+ except OSError:
+ break
+
+ s = stringIO.getvalue()
+ if s:
+ fn(s.strip())
+
+ stringIO.close()
+
+ def do_execute_direct(self, code, silent=False):
+ """
+ :param code:
+ The code to be executed.
+ :param silent:
+ Whether to display output.
+ :return:
+ Return value, or None
+
+ MetaKernel code handler.
+ """
+
+ """
+ if not code.strip():
+ return None
+
+ retval = None
+ try:
+ retval = self.gateway.entry_point.eval(code.rstrip())
+ self.handle_output(self.gateway_proc.stdout, self.Print)
+ self.handle_output(self.gateway_proc.stderr, self.Error)
+ except Py4JError as e:
+ if not silent:
+ self.Error(e.cause)
+
+ if retval is None:
+ return
+ elif isinstance(retval, str):
+ return TextOutput(retval)
+ else:
+ return retval
+ """
+ return "happy"
+
+if __name__ == '__main__':
+ ToreeKernel.run_as_main()
diff --git a/python/dist/toree_kernel-0.1-py3.5.egg b/python/dist/toree_kernel-0.1-py3.5.egg
new file mode 100644
index 0000000..b71502a
--- /dev/null
+++ b/python/dist/toree_kernel-0.1-py3.5.egg
Binary files differ
diff --git a/python/setup.py b/python/setup.py
new file mode 100644
index 0000000..307fcd4
--- /dev/null
+++ b/python/setup.py
@@ -0,0 +1,17 @@
+from setuptools import setup
+
+
+setup(name='toree_kernel',
+ version='0.1',
+ description='Toree Client Kernel',
+ long_description='A simple echo kernel for Jupyter/IPython, based on MetaKernel',
+ py_modules=['toree_kernel'],
+ install_requires=['metakernel', 'py4j'],
+ classifiers = [
+ 'Framework :: IPython',
+ 'License :: OSI Approved :: BSD License',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 2',
+ 'Topic :: System :: Shells',
+ ]
+)
diff --git a/python/toree_kernel.egg-info/PKG-INFO b/python/toree_kernel.egg-info/PKG-INFO
new file mode 100644
index 0000000..38f7f19
--- /dev/null
+++ b/python/toree_kernel.egg-info/PKG-INFO
@@ -0,0 +1,15 @@
+Metadata-Version: 1.1
+Name: toree-kernel
+Version: 0.1
+Summary: Toree Client Kernel
+Home-page: UNKNOWN
+Author: UNKNOWN
+Author-email: UNKNOWN
+License: UNKNOWN
+Description: A simple echo kernel for Jupyter/IPython, based on MetaKernel
+Platform: UNKNOWN
+Classifier: Framework :: IPython
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 2
+Classifier: Topic :: System :: Shells
diff --git a/python/toree_kernel.egg-info/SOURCES.txt b/python/toree_kernel.egg-info/SOURCES.txt
new file mode 100644
index 0000000..336cf83
--- /dev/null
+++ b/python/toree_kernel.egg-info/SOURCES.txt
@@ -0,0 +1,7 @@
+setup.py
+toree_kernel.py
+toree_kernel.egg-info/PKG-INFO
+toree_kernel.egg-info/SOURCES.txt
+toree_kernel.egg-info/dependency_links.txt
+toree_kernel.egg-info/requires.txt
+toree_kernel.egg-info/top_level.txt \ No newline at end of file
diff --git a/python/toree_kernel.egg-info/dependency_links.txt b/python/toree_kernel.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/python/toree_kernel.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/python/toree_kernel.egg-info/requires.txt b/python/toree_kernel.egg-info/requires.txt
new file mode 100644
index 0000000..4ee13b4
--- /dev/null
+++ b/python/toree_kernel.egg-info/requires.txt
@@ -0,0 +1,2 @@
+metakernel
+py4j
diff --git a/python/toree_kernel.egg-info/top_level.txt b/python/toree_kernel.egg-info/top_level.txt
new file mode 100644
index 0000000..a315772
--- /dev/null
+++ b/python/toree_kernel.egg-info/top_level.txt
@@ -0,0 +1 @@
+toree_kernel
diff --git a/python/toree_kernel.py b/python/toree_kernel.py
new file mode 100644
index 0000000..9734ffa
--- /dev/null
+++ b/python/toree_kernel.py
@@ -0,0 +1,125 @@
+import os
+import signal
+import sys
+import time
+import io
+
+from os import O_NONBLOCK, read
+from fcntl import fcntl, F_GETFL, F_SETFL
+from subprocess import Popen, PIPE
+from metakernel import MetaKernel
+from py4j.java_gateway import JavaGateway, CallbackServerParameters, java_import
+from py4j.protocol import Py4JError
+
+class TextOutput(object):
+ """Wrapper for text output whose repr is the text itself.
+ This avoids `repr(output)` adding quotation marks around already-rendered text.
+ """
+ def __init__(self, output):
+ self.output = output
+
+ def __repr__(self):
+ return self.output
+
+class ToreeKernel(MetaKernel):
+ implementation = 'toree_kernel'
+ implementation_version = '0.1'
+ langauge = 'scala'
+ language_version = '2.11'
+ banner = "toree_kernel"
+ language_info = {'name': 'scala',
+ 'mimetype': 'application/scala',
+ 'file_extension': '.scala'}
+
+
+ def __init__(self, **kwargs):
+ super(ToreeKernel, self).__init__(**kwargs)
+ self._start_toree_client()
+
+ def sig_handler(signum, frame):
+ self.gateway_proc.terminate()
+
+ def do_shutdown(self, restart):
+ super(ToreeKernel, self).do_shutdown(restart)
+ self.gateway_proc.terminate()
+
+ def _start_toree_client(self):
+ args = [
+ "java",
+ "-classpath",
+ "/Users/bburns/toree_client/target/toree-client-0.1-jar-with-dependencies.jar",
+ "com.ibm.ToreeClient"
+ ]
+
+ self.gateway_proc = Popen(args, stderr=PIPE, stdout=PIPE)
+ time.sleep(1.5)
+ self.gateway = JavaGateway(
+ start_callback_server=True,
+ callback_server_parameters=CallbackServerParameters())
+
+ flags = fcntl(self.gateway_proc.stdout, F_GETFL) # get current p.stdout flags
+ fcntl(self.gateway_proc.stdout, F_SETFL, flags | O_NONBLOCK)
+
+ flags = fcntl(self.gateway_proc.stderr, F_GETFL) # get current p.stdout flags
+ fcntl(self.gateway_proc.stderr, F_SETFL, flags | O_NONBLOCK)
+
+ signal.signal(signal.SIGTERM, self.sig_handler)
+ signal.signal(signal.SIGINT, self.sig_handler)
+ signal.signal(signal.SIGHUP, self.sig_handler)
+
+
+ def Error(self, output):
+ if not output:
+ return
+
+ super(ToreeKernel, self).Error(output)
+
+ def handle_output(self, fd, fn):
+ stringIO = io.StringIO()
+ while True:
+ try:
+ b = read(fd.fileno(), 1024)
+ if b:
+ stringIO.write(b.decode('utf-8'))
+ except OSError:
+ break
+
+ s = stringIO.getvalue()
+ if s:
+ fn(s.strip())
+
+ stringIO.close()
+
+ def do_execute_direct(self, code, silent=False):
+ """
+ :param code:
+ The code to be executed.
+ :param silent:
+ Whether to display output.
+ :return:
+ Return value, or None
+
+ MetaKernel code handler.
+ """
+
+ if not code.strip():
+ return None
+
+ retval = None
+ try:
+ retval = self.gateway.entry_point.eval(code.rstrip())
+ self.handle_output(self.gateway_proc.stdout, self.Print)
+ self.handle_output(self.gateway_proc.stderr, self.Error)
+ except Py4JError as e:
+ if not silent:
+ self.Error(e.cause)
+
+ if retval is None:
+ return
+ elif isinstance(retval, str):
+ return TextOutput(retval)
+ else:
+ return retval
+
+if __name__ == '__main__':
+ ToreeKernel.run_as_main()
diff --git a/src/main/scala/com/ibm/ToreeClient.scala b/src/main/scala/com/ibm/ToreeClient.scala
index a075f77..b644b02 100644
--- a/src/main/scala/com/ibm/ToreeClient.scala
+++ b/src/main/scala/com/ibm/ToreeClient.scala
@@ -38,7 +38,7 @@ object ToreeClient extends App {
"hb_port": 49691,
"shell_port": 40544,
"iopub_port": 43462,
- "ip": "127.0.0.1",
+ "ip": "9.125.72.72",
"transport": "tcp",
"signature_scheme": "hmac-sha256",
"key": ""
@@ -53,7 +53,13 @@ object ToreeClient extends App {
with StandardHandlerInitialization).createClient()
val toreeGateway = new ToreeGateway(client)
- print(toreeGateway.eval("sc"))
+ /*
+ val code: String =
+ """
+ |sc.parallelize(List(1,2,3,4,5)).reduce((a, b) => a + b)
+ """.stripMargin
+ print(toreeGateway.eval(args(0)))
+ */
val gatewayServer: GatewayServer = new GatewayServer(toreeGateway)
gatewayServer.start()