Skip to content

Commit d7484c5

Browse files
committed
ENH: enhanced handling of IPython kernel parameters
1 parent 61a2522 commit d7484c5

File tree

1 file changed

+72
-20
lines changed

1 file changed

+72
-20
lines changed

bluesky_queueserver/manager/worker.py

Lines changed: 72 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1808,30 +1808,82 @@ def find_kernel_ip(ip_str):
18081808
ip = ip_str
18091809
return ip
18101810

1811-
shell_port = None ##60000
1812-
iopub_port = None ##60001
1813-
stdin_port = None ##60002
1814-
hb_port = None ##60003
1815-
control_port = None ##60004
1816-
# connection_file = "test.json"
1811+
# The following parameters should be properly added to CLI and config file parameters
1812+
connection_file = os.environ.get("QSERVER_IPYTHON_KERNEL_CONNECTION_FILE", None)
1813+
connection_dir = os.environ.get("QSERVER_IPYTHON_KERNEL_CONNECTION_DIR", None)
1814+
shell_port = os.environ.get("QSERVER_IPYTHON_KERNEL_SHELL_PORT", None)
1815+
iopub_port = os.environ.get("QSERVER_IPYTHON_KERNEL_IOPUB_PORT", None)
1816+
stdin_port = os.environ.get("QSERVER_IPYTHON_KERNEL_STDIN_PORT", None)
1817+
hb_port = os.environ.get("QSERVER_IPYTHON_KERNEL_HB_PORT", None)
1818+
control_port = os.environ.get("QSERVER_IPYTHON_KERNEL_CONTROL_PORT", None)
1819+
1820+
def _convert_to_int(x):
1821+
return int(x) if x else None
1822+
1823+
shell_port = _convert_to_int(shell_port)
1824+
iopub_port = _convert_to_int(iopub_port)
1825+
stdin_port = _convert_to_int(stdin_port)
1826+
hb_port = _convert_to_int(hb_port)
1827+
control_port = _convert_to_int(control_port)
18171828

1818-
# self._ip_kernel_app.connection_file = connection_file
1829+
kernel_ip = self._config_dict["ipython_kernel_ip"]
1830+
kernel_ip = find_kernel_ip(kernel_ip)
1831+
1832+
use_connection_file = bool(connection_file)
1833+
1834+
if connection_dir:
1835+
self._ip_kernel_app.connection_dir = connection_dir
1836+
1837+
if connection_file:
1838+
self._ip_kernel_app.connection_file = connection_file
1839+
abs_cf_name = self._ip_kernel_app.abs_connection_file
1840+
1841+
# Check the connection file. Delete the existing connection file if
1842+
# any of the parameters are not matching the new parameters or if
1843+
# the file is corrupt.
1844+
if os.path.isfile(abs_cf_name):
1845+
try:
1846+
with open(abs_cf_name, "r") as f:
1847+
cn_info = json.load(f)
1848+
1849+
def _check_value(value, key):
1850+
if value:
1851+
if key not in cn_info:
1852+
raise Exception(f"Key {key!r} is not found in the connection file")
1853+
if cn_info[key] != value:
1854+
raise Exception(
1855+
f"Old value {cn_info[key]=} is does not match the new value {value!r}"
1856+
)
1857+
1858+
_check_value(shell_port, "shell_port")
1859+
_check_value(iopub_port, "iopub_port")
1860+
_check_value(stdin_port, "stdin_port")
1861+
_check_value(hb_port, "hb_port")
1862+
_check_value(control_port, "control_port")
1863+
_check_value(kernel_ip, "ip")
1864+
1865+
except Exception as ex:
1866+
logger.error(
1867+
f"Connection file {abs_cf_name!r} is can't be loaded or out of date. "
1868+
f"A new connection file will be generated. ({ex})"
1869+
)
1870+
use_connection_file = False
1871+
os.remove(abs_cf_name)
1872+
else:
1873+
use_connection_file = False
18191874

18201875
logger.info("Generating random port numbers for IPython kernel ...")
1821-
kernel_ip = self._config_dict["ipython_kernel_ip"]
18221876
try:
1823-
kernel_ip = find_kernel_ip(kernel_ip)
1824-
self._ip_kernel_app.ip = kernel_ip
1825-
self._ip_kernel_app.shell_port = generate_random_port(kernel_ip)
1826-
self._ip_kernel_app.iopub_port = generate_random_port(kernel_ip)
1827-
self._ip_kernel_app.stdin_port = generate_random_port(kernel_ip)
1828-
self._ip_kernel_app.hb_port = generate_random_port(kernel_ip)
1829-
self._ip_kernel_app.control_port = control_port or generate_random_port(kernel_ip)
1830-
# self._ip_kernel_app.shell_port = shell_port or generate_random_port(kernel_ip)
1831-
# self._ip_kernel_app.iopub_port = iopub_port or generate_random_port(kernel_ip)
1832-
# self._ip_kernel_app.stdin_port = stdin_port or generate_random_port(kernel_ip)
1833-
# self._ip_kernel_app.hb_port = hb_port or generate_random_port(kernel_ip)
1834-
# self._ip_kernel_app.control_port = control_port or generate_random_port(kernel_ip)
1877+
if use_connection_file:
1878+
logger.info(f"Loading connection file {self._ip_kernel_app.abs_connection_file}")
1879+
self._ip_kernel_app.load_connection_file(self._ip_kernel_app.abs_connection_file)
1880+
else:
1881+
self._ip_kernel_app.ip = kernel_ip
1882+
self._ip_kernel_app.shell_port = shell_port or generate_random_port(kernel_ip)
1883+
self._ip_kernel_app.iopub_port = iopub_port or generate_random_port(kernel_ip)
1884+
self._ip_kernel_app.stdin_port = stdin_port or generate_random_port(kernel_ip)
1885+
self._ip_kernel_app.hb_port = hb_port or generate_random_port(kernel_ip)
1886+
self._ip_kernel_app.control_port = control_port or generate_random_port(kernel_ip)
18351887
self._ip_connect_info = self._ip_kernel_app.get_connection_info()
18361888
except Exception as ex:
18371889
self._success_startup = False

0 commit comments

Comments
 (0)