@@ -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