You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by dm...@apache.org on 2020/02/26 09:16:09 UTC

[incubator-dlab] 01/01: [DLAB-625] Created Jupyterlab template for Azure

This is an automated email from the ASF dual-hosted git repository.

dmysakovets pushed a commit to branch DLAB-625
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git

commit 868e4b03d8fcf9dd1af0ef827b7e32cd1c5cdc96
Author: Demyan Mysakovets <de...@gmail.com>
AuthorDate: Wed Feb 26 11:15:51 2020 +0200

    [DLAB-625] Created Jupyterlab template for Azure
---
 .../src/general/files/azure/jupyterlab_Dockerfile  |  51 +++
 .../files/azure/jupyterlab_description.json        |  25 ++
 .../general/files/gcp/jupyterlab_description.json  |   2 +-
 .../general/scripts/azure/jupyterlab_configure.py  | 356 +++++++++++++++++++++
 .../src/general/scripts/azure/ssn_configure.py     |   1 +
 .../jenkins_jobs/create_notebook_image/config.xml  |   1 +
 .../jenkins_jobs/create_notebook_server/config.xml |   1 +
 .../jenkins_jobs/manage_git_credentials/config.xml |   1 +
 .../jenkins_jobs/start_notebook_server/config.xml  |   1 +
 .../jenkins_jobs/stop_notebook_server/config.xml   |   1 +
 .../terminate_notebook_image/config.xml            |   1 +
 .../terminate_notebook_server/config.xml           |   1 +
 .../scripts/configure_jupyterlab_node.py           |   7 -
 13 files changed, 441 insertions(+), 8 deletions(-)

diff --git a/infrastructure-provisioning/src/general/files/azure/jupyterlab_Dockerfile b/infrastructure-provisioning/src/general/files/azure/jupyterlab_Dockerfile
new file mode 100644
index 0000000..97739c1
--- /dev/null
+++ b/infrastructure-provisioning/src/general/files/azure/jupyterlab_Dockerfile
@@ -0,0 +1,51 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+
+FROM docker.dlab-base:latest
+
+ARG OS
+
+COPY jupyterlab/ /root/
+COPY general/scripts/os/* /root/scripts/
+COPY general/scripts/azure/jupyter* /root/scripts/
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/templates/os/${OS}/jupyter-notebook.service /root/templates/
+COPY general/templates/os/${OS}/ungit.service /root/templates/
+COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
+COPY general/templates/os/pyspark_local_template.json /root/templates/
+COPY general/templates/os/py3spark_local_template.json /root/templates/
+COPY general/templates/os/r_template.json /root/templates/
+COPY general/templates/os/run_template.sh /root/templates/
+COPY general/files/os/toree-assembly-0.2.0.jar /root/files/
+COPY general/files/os/toree_kernel.tar.gz /root/files/
+COPY general/templates/os/pyspark_dataengine_template.json /root/templates/
+COPY general/templates/os/r_dataengine_template.json /root/templates/
+COPY general/templates/os/toree_dataengine_template.json /root/templates/
+COPY general/templates/os/inactive.sh /root/templates/
+COPY general/templates/os/inactive.service /root/templates/
+COPY general/templates/os/inactive.timer /root/templates/
+COPY general/templates/azure/core-site* /root/templates/
+
+
+RUN chmod a+x /root/fabfile.py; \
+    chmod a+x /root/scripts/*
+
diff --git a/infrastructure-provisioning/src/general/files/azure/jupyterlab_description.json b/infrastructure-provisioning/src/general/files/azure/jupyterlab_description.json
new file mode 100644
index 0000000..739bdcf
--- /dev/null
+++ b/infrastructure-provisioning/src/general/files/azure/jupyterlab_description.json
@@ -0,0 +1,25 @@
+{
+  "exploratory_environment_shapes" :
+  {
+    "Memory optimized" : [
+      {"Size": "S", "Description": "Standard_E4s_v3", "Type": "Standard_E4s_v3","Ram": "32 GB","Cpu": "4"},
+      {"Size": "M", "Description": "Standard_E16s_v3", "Type": "Standard_E16s_v3","Ram": "128 GB","Cpu": "16"},
+      {"Size": "L", "Description": "Standard_E32s_v3", "Type": "Standard_E32s_v3","Ram": "256 GB","Cpu": "32"}
+    ],
+    "Compute optimized": [
+      {"Size": "S", "Description": "Standard_F2s", "Type": "Standard_F2s","Ram": "4 GB","Cpu": "2"},
+      {"Size": "M", "Description": "Standard_F8s", "Type": "Standard_F8s","Ram": "16.0 GB","Cpu": "8"},
+      {"Size": "L", "Description": "Standard_F16s", "Type": "Standard_F16s","Ram": "32.0 GB","Cpu": "16"}
+    ]
+  },
+  "exploratory_environment_versions" :
+  [
+    {
+      "template_name": "JupyterLab 0.35.6",
+      "description": "Base image with JupyterLab node creation routines",
+      "environment_type": "exploratory",
+      "version": "jupyter_lab-0.35.6",
+      "vendor": "Azure"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/files/gcp/jupyterlab_description.json b/infrastructure-provisioning/src/general/files/gcp/jupyterlab_description.json
index 3f202f7..8a376bf 100644
--- a/infrastructure-provisioning/src/general/files/gcp/jupyterlab_description.json
+++ b/infrastructure-provisioning/src/general/files/gcp/jupyterlab_description.json
@@ -1,4 +1,4 @@
-{
+d{
   "exploratory_environment_shapes" :
   {
     "For testing" : [
diff --git a/infrastructure-provisioning/src/general/scripts/azure/jupyterlab_configure.py b/infrastructure-provisioning/src/general/scripts/azure/jupyterlab_configure.py
new file mode 100644
index 0000000..d87e640
--- /dev/null
+++ b/infrastructure-provisioning/src/general/scripts/azure/jupyterlab_configure.py
@@ -0,0 +1,356 @@
+#!/usr/bin/python
+
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+import logging
+import json
+import sys
+from dlab.fab import *
+from dlab.meta_lib import *
+from dlab.actions_lib import *
+import os
+
+
+if __name__ == "__main__":
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
+                                               os.environ['request_id'])
+    local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
+    logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
+                        level=logging.DEBUG,
+                        filename=local_log_filepath)
+    try:
+        notebook_config = dict()
+        try:
+            notebook_config['exploratory_name'] = os.environ['exploratory_name'].replace('_', '-')
+        except:
+            notebook_config['exploratory_name'] = ''
+        notebook_config['service_base_name'] = os.environ['conf_service_base_name']
+        notebook_config['resource_group_name'] = os.environ['azure_resource_group_name']
+        notebook_config['instance_size'] = os.environ['azure_notebook_instance_size']
+        notebook_config['key_name'] = os.environ['conf_key_name']
+        notebook_config['user_name'] = os.environ['edge_user_name'].replace('_', '-')
+        notebook_config['project_name'] = os.environ['project_name'].lower().replace('_', '-')
+        notebook_config['endpoint_name'] = os.environ['endpoint_name'].lower().replace('_', '-')
+        notebook_config['project_tag'] = os.environ['project_name'].lower().replace('_', '-')
+        notebook_config['endpoint_tag'] = os.environ['endpoint_name'].lower().replace('_', '-')
+        notebook_config['user_keyname'] = os.environ['project_name']
+        notebook_config['instance_name'] = '{}-{}-nb-{}'.format(notebook_config['service_base_name'],
+                                                                notebook_config['project_name'],
+                                                                notebook_config['exploratory_name'])
+        notebook_config['image_enabled'] = os.environ['conf_image_enabled']
+        notebook_config['shared_image_enabled'] = os.environ['conf_shared_image_enabled']
+        if notebook_config['shared_image_enabled'] == 'false':
+            notebook_config['expected_image_name'] = '{0}-{1}-{2}-{3}-notebook-image'.format(
+            notebook_config['service_base_name'],
+            notebook_config['endpoint_name'],
+            notebook_config['project_name'],
+            os.environ['application'])
+            notebook_config['image_tags'] = {"Name": notebook_config['instance_name'],
+                                       "SBN": notebook_config['service_base_name'],
+                                       "User": notebook_config['user_name'],
+                                       "project_tag": notebook_config['project_tag'],
+                                       "endpoint_tag": notebook_config['endpoint_tag'],
+                                       "Exploratory": notebook_config['exploratory_name'],
+                                       os.environ['conf_billing_tag_key']: os.environ['conf_billing_tag_value']}
+        else:
+            notebook_config['expected_image_name'] = '{0}-{1}-{2}-notebook-image'.format(
+                notebook_config['service_base_name'],
+                notebook_config['endpoint_name'],
+                os.environ['application'])
+            notebook_config['image_tags'] = {"Name": notebook_config['instance_name'],
+                                       "SBN": notebook_config['service_base_name'],
+                                       "User": notebook_config['user_name'],
+                                       "endpoint_tag": notebook_config['endpoint_tag'],
+                                       "Exploratory": notebook_config['exploratory_name'],
+                                       os.environ['conf_billing_tag_key']: os.environ['conf_billing_tag_value']}
+        notebook_config['notebook_image_name'] = str(os.environ.get('notebook_image_name'))
+        notebook_config['security_group_name'] = '{}-{}-nb-sg'.format(notebook_config['service_base_name'],
+                                                                      notebook_config['project_name'])
+        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['tags'] = {"Name": notebook_config['instance_name'],
+                                   "SBN": notebook_config['service_base_name'],
+                                   "User": notebook_config['user_name'],
+                                   "project_tag": notebook_config['project_tag'],
+                                   "endpoint_tag": notebook_config['endpoint_tag'],
+                                   "Exploratory": notebook_config['exploratory_name'],
+                                   os.environ['conf_billing_tag_key']: os.environ['conf_billing_tag_value']}
+        notebook_config['ip_address'] = AzureMeta().get_private_ip_address(notebook_config['resource_group_name'],
+                                                        notebook_config['instance_name'])
+
+        # generating variables regarding EDGE proxy on Notebook instance
+        instance_hostname = AzureMeta().get_private_ip_address(notebook_config['resource_group_name'],
+                                                               notebook_config['instance_name'])
+        edge_instance_name = '{0}-{1}-{2}-edge'.format(notebook_config['service_base_name'],
+                                                       notebook_config['project_name'],
+                                                       notebook_config['endpoint_name'])
+        edge_instance_private_hostname = AzureMeta().get_private_ip_address(notebook_config['resource_group_name'],
+                                                                            edge_instance_name)
+        if os.environ['conf_network_type'] == 'private':
+            edge_instance_hostname = AzureMeta().get_private_ip_address(notebook_config['resource_group_name'],
+                                                                        edge_instance_name)
+        else:
+            edge_instance_hostname = AzureMeta().get_instance_public_ip_address(notebook_config['resource_group_name'],
+                                                                                edge_instance_name)
+        keyfile_name = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
+        edge_hostname = AzureMeta().get_private_ip_address(notebook_config['resource_group_name'],
+                                                                    edge_instance_name)
+
+        if os.environ['conf_os_family'] == 'debian':
+            initial_user = 'ubuntu'
+            sudo_group = 'sudo'
+        if os.environ['conf_os_family'] == 'redhat':
+            initial_user = 'ec2-user'
+            sudo_group = 'wheel'
+    except Exception as err:
+        print('Error: {0}'.format(err))
+        append_result("Failed to generate variables dictionary.", str(err))
+        AzureActions().remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
+        sys.exit(1)
+
+    try:
+        logging.info('[CREATING DLAB SSH USER]')
+        print('[CREATING DLAB SSH USER]')
+        params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format\
+            (instance_hostname, os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem", initial_user,
+             notebook_config['dlab_ssh_user'], sudo_group)
+
+        try:
+            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+        except:
+            traceback.print_exc()
+            raise Exception
+    except Exception as err:
+        print('Error: {0}'.format(err))
+        append_result("Failed creating ssh user 'dlab-user'.", str(err))
+        AzureActions().remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
+        sys.exit(1)
+
+    # configuring proxy on Notebook instance
+    try:
+        logging.info('[CONFIGURE PROXY ON JUPYTER INSTANCE]')
+        print('[CONFIGURE PROXY ON JUPYTER INSTANCE]')
+        additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
+        params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
+            .format(instance_hostname, notebook_config['instance_name'], keyfile_name, json.dumps(additional_config),
+                    notebook_config['dlab_ssh_user'])
+        try:
+            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+        except:
+            traceback.print_exc()
+            raise Exception
+    except Exception as err:
+        print('Error: {0}'.format(err))
+        append_result("Failed to configure proxy.", str(err))
+        AzureActions().remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
+        sys.exit(1)
+
+    # updating repositories & installing python packages
+    try:
+        logging.info('[INSTALLING PREREQUISITES TO JUPYTER NOTEBOOK INSTANCE]')
+        print('[INSTALLING PREREQUISITES TO JUPYTER NOTEBOOK INSTANCE]')
+        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".\
+            format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], os.environ['azure_region'],
+                   edge_instance_private_hostname)
+        try:
+            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+        except:
+            traceback.print_exc()
+            raise Exception
+    except Exception as err:
+        print('Error: {0}'.format(err))
+        append_result("Failed installing apps: apt & pip.", str(err))
+        AzureActions().remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
+        sys.exit(1)
+
+    # installing and configuring jupiter and all dependencies
+    try:
+        logging.info('[CONFIGURE JUPYTERLAB NOTEBOOK INSTANCE]')
+        print('[CONFIGURE JUPYTER NOTEBOOK INSTANCE]')
+        params = "--hostname {0} --keyfile {1} " \
+                 "--region {2} --spark_version {3} " \
+                 "--hadoop_version {4} --os_user {5} " \
+                 "--scala_version {6} --r_mirror {7} " \
+                 "--ip_adress {8} --exploratory_name {9} --edge_ip {10}".\
+            format(instance_hostname, keyfile_name,
+                   os.environ['azure_region'], os.environ['notebook_spark_version'],
+                   os.environ['notebook_hadoop_version'], notebook_config['dlab_ssh_user'],
+                   os.environ['notebook_scala_version'], os.environ['notebook_r_mirror'],
+                   notebook_config['ip_address'], notebook_config['exploratory_name'], edge_hostname)
+        try:
+            local("~/scripts/{}.py {}".format('configure_jupyterlab_node', params))
+            remount_azure_disk(True, notebook_config['dlab_ssh_user'], instance_hostname,
+                               os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem")
+        except:
+            traceback.print_exc()
+            raise Exception
+    except Exception as err:
+        print('Error: {0}'.format(err))
+        append_result("Failed to configure jupyter.", str(err))
+        AzureActions().remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
+        sys.exit(1)
+
+    try:
+        print('[INSTALLING USERs KEY]')
+        logging.info('[INSTALLING USERs KEY]')
+        additional_config = {"user_keyname": notebook_config['user_keyname'],
+                             "user_keydir": os.environ['conf_key_dir']}
+        params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
+            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+        try:
+            local("~/scripts/{}.py {}".format('install_user_key', params))
+        except:
+            append_result("Failed installing users key")
+            raise Exception
+    except Exception as err:
+        print('Error: {0}'.format(err))
+        append_result("Failed installing users key.", str(err))
+        AzureActions().remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
+        sys.exit(1)
+
+    try:
+        print('[SETUP USER GIT CREDENTIALS]')
+        logging.info('[SETUP USER GIT CREDENTIALS]')
+        params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
+            .format(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+        try:
+            # local("~/scripts/{}.py {}".format('common_download_git_certfile', params))
+            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+        except:
+            append_result("Failed setup git credentials")
+            raise Exception
+    except Exception as err:
+        print('Error: {0}'.format(err))
+        append_result("Failed to setup git credentials.", str(err))
+        AzureActions().remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
+        sys.exit(1)
+
+
+    if notebook_config['image_enabled'] == 'true':
+        try:
+            print('[CREATING IMAGE]')
+            image = AzureMeta().get_image(notebook_config['resource_group_name'], notebook_config['expected_image_name'])
+            if image == '':
+                print("Looks like it's first time we configure notebook server. Creating image.")
+                prepare_vm_for_image(True, notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+                AzureActions().create_image_from_instance(notebook_config['resource_group_name'],
+                                                          notebook_config['instance_name'],
+                                                          os.environ['azure_region'],
+                                                          notebook_config['expected_image_name'],
+                                                          json.dumps(notebook_config['image_tags']))
+                print("Image was successfully created.")
+                local("~/scripts/{}.py".format('common_prepare_notebook'))
+                instance_running = False
+                while not instance_running:
+                    if AzureMeta().get_instance_status(notebook_config['resource_group_name'],
+                                                       notebook_config['instance_name']) == 'running':
+                        instance_running = True
+                instance_hostname = AzureMeta().get_private_ip_address(notebook_config['resource_group_name'],
+                                                                       notebook_config['instance_name'])
+                remount_azure_disk(True, notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+                set_git_proxy(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name,
+                              'http://{}:3128'.format(edge_instance_private_hostname))
+                additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
+                params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
+                    .format(instance_hostname, notebook_config['instance_name'], keyfile_name,
+                            json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+                local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+        except Exception as err:
+            print('Error: {0}'.format(err))
+            append_result("Failed creating image from notebook.", str(err))
+            AzureActions().remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
+            sys.exit(1)
+
+    try:
+        print('[SETUP EDGE REVERSE PROXY TEMPLATE]')
+        logging.info('[SETUP EDGE REVERSE PROXY TEMPLATE]')
+        additional_info = {
+            'instance_hostname': instance_hostname,
+            'tensor': False
+        }
+        params = "--edge_hostname {} " \
+                 "--keyfile {} " \
+                 "--os_user {} " \
+                 "--type {} " \
+                 "--exploratory_name {} " \
+                 "--additional_info '{}'"\
+            .format(edge_instance_private_hostname,
+                    keyfile_name,
+                    notebook_config['dlab_ssh_user'],
+                    'jupyter',
+                    notebook_config['exploratory_name'],
+                    json.dumps(additional_info))
+        try:
+            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+        except:
+            append_result("Failed edge reverse proxy template")
+            raise Exception
+    except Exception as err:
+        print('Error: {0}'.format(err))
+        append_result("Failed to set edge reverse proxy template.", str(err))
+        AzureActions().remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
+        sys.exit(1)
+
+    # generating output information
+    try:
+        ip_address = AzureMeta().get_private_ip_address(notebook_config['resource_group_name'],
+                                                        notebook_config['instance_name'])
+        jupyter_ip_url = "http://" + ip_address + ":8888/{}/".format(notebook_config['exploratory_name'])
+        ungit_ip_url = "http://" + ip_address + ":8085/{}-ungit/".format(notebook_config['exploratory_name'])
+        jupyter_notebook_acces_url = "http://" + edge_instance_hostname + "/{}/".format(
+            notebook_config['exploratory_name'])
+        jupyter_ungit_acces_url = "http://" + edge_instance_hostname + "/{}-ungit/".format(
+            notebook_config['exploratory_name'])
+        print('[SUMMARY]')
+        logging.info('[SUMMARY]')
+        print("Instance name: {}".format(notebook_config['instance_name']))
+        print("Private IP: {}".format(ip_address))
+        print("Instance type: {}".format(notebook_config['instance_size']))
+        print("Key name: {}".format(notebook_config['key_name']))
+        print("User key name: {}".format(notebook_config['user_keyname']))
+        print("SG name: {}".format(notebook_config['security_group_name']))
+        print("Jupyter URL: {}".format(jupyter_ip_url))
+        print("Ungit URL: {}".format(ungit_ip_url))
+        print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.
+              format(notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+
+        with open("/root/result.json", 'w') as result:
+            res = {"ip": ip_address,
+                   "master_keyname": os.environ['conf_key_name'],
+                   "notebook_name": notebook_config['instance_name'],
+                   "instance_id": notebook_config['instance_name'],
+                   "Action": "Create new notebook server",
+                   "notebook_image_name": notebook_config['notebook_image_name'],
+                   "exploratory_url": [
+                       {"description": "Jupyter",
+                        "url": jupyter_notebook_acces_url},
+                       {"description": "Ungit",
+                        "url": jupyter_ungit_acces_url}#,
+                       #{"description": "Jupyter (via tunnel)",
+                       # "url": jupyter_ip_url},
+                       #{"description": "Ungit (via tunnel)",
+                       # "url": ungit_ip_url}
+                   ]}
+            result.write(json.dumps(res))
+    except Exception as err:
+        append_result("Failed to generate output information", str(err))
+        AzureActions().remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
+        sys.exit(1)
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/azure/ssn_configure.py b/infrastructure-provisioning/src/general/scripts/azure/ssn_configure.py
index 02c4eaa..4f35a62 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/ssn_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/ssn_configure.py
@@ -175,6 +175,7 @@ if __name__ == "__main__":
                              {"name": "edge", "tag": "latest"},
                              {"name": "project", "tag": "latest"},
                              {"name": "jupyter", "tag": "latest"},
+                             {"name": "jupyterlab", "tag": "latest"},
                              {"name": "rstudio", "tag": "latest"},
                              {"name": "zeppelin", "tag": "latest"},
                              {"name": "tensor", "tag": "latest"},
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_image/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_image/config.xml
index 7633fd5..f7a2715 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_image/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_image/config.xml
@@ -47,6 +47,7 @@ under the License.
           <choices class="java.util.Arrays$ArrayList">
             <a class="string-array">
               <string>jupyter</string>
+              <string>jupyterlab</string>
               <string>rstudio</string>
               <string>zeppelin</string>
               <string>tensor</string>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_server/config.xml
index 3c42f15..1c3967e 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_server/config.xml
@@ -47,6 +47,7 @@ under the License.
           <choices class="java.util.Arrays$ArrayList">
             <a class="string-array">
               <string>jupyter</string>
+              <string>jupyterlab</string>
               <string>rstudio</string>
               <string>zeppelin</string>
               <string>tensor</string>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/manage_git_credentials/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/manage_git_credentials/config.xml
index bebdc9e..4a5717d 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/manage_git_credentials/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/manage_git_credentials/config.xml
@@ -42,6 +42,7 @@ under the License.
           <choices class="java.util.Arrays$ArrayList">
             <a class="string-array">
               <string>jupyter</string>
+              <string>jupyterlab</string>
               <string>rstudio</string>
               <string>zeppelin</string>
               <string>tensor</string>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_notebook_server/config.xml
index 230ff9b..1344e62 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_notebook_server/config.xml
@@ -42,6 +42,7 @@ under the License.
           <choices class="java.util.Arrays$ArrayList">
             <a class="string-array">
               <string>jupyter</string>
+              <string>jupyterlab</string>
               <string>rstudio</string>
               <string>zeppelin</string>
               <string>tensor</string>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_notebook_server/config.xml
index 02da1ab..3611b2f 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_notebook_server/config.xml
@@ -42,6 +42,7 @@ under the License.
           <choices class="java.util.Arrays$ArrayList">
             <a class="string-array">
               <string>jupyter</string>
+              <string>jupyterlab</string>
               <string>rstudio</string>
               <string>zeppelin</string>
               <string>tensor</string>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_image/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_image/config.xml
index d8e5a0a..5fa3342 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_image/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_image/config.xml
@@ -42,6 +42,7 @@ under the License.
           <choices class="java.util.Arrays$ArrayList">
             <a class="string-array">
               <string>jupyter</string>
+              <string>jupyterlab</string>
               <string>rstudio</string>
               <string>zeppelin</string>
               <string>tensor</string>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_server/config.xml
index 23f2c32..57e4c1b 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_server/config.xml
@@ -42,6 +42,7 @@ under the License.
           <choices class="java.util.Arrays$ArrayList">
             <a class="string-array">
               <string>jupyter</string>
+              <string>jupyterlab</string>
               <string>rstudio</string>
               <string>zeppelin</string>
               <string>tensor</string>
diff --git a/infrastructure-provisioning/src/jupyterlab/scripts/configure_jupyterlab_node.py b/infrastructure-provisioning/src/jupyterlab/scripts/configure_jupyterlab_node.py
index 7872b5c..5f56ea8 100644
--- a/infrastructure-provisioning/src/jupyterlab/scripts/configure_jupyterlab_node.py
+++ b/infrastructure-provisioning/src/jupyterlab/scripts/configure_jupyterlab_node.py
@@ -95,13 +95,6 @@ if __name__ == "__main__":
     print("Mount additional volume")
     prepare_disk(args.os_user)
 
-    # INSTALL LANGUAGES
-    print("Install Java")
-    ensure_jre_jdk(args.os_user)
-    if os.environ['notebook_r_enabled'] == 'true':
-        print("Installing R")
-        ensure_r(args.os_user, r_libs, args.region, args.r_mirror)
-
     # INSTALL DOCKER
     print ("Install Docker")
     configure_docker(args.os_user)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org