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:08 UTC

[incubator-dlab] branch DLAB-625 created (now 868e4b0)

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

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


      at 868e4b0  [DLAB-625] Created Jupyterlab template for Azure

This branch includes the following new commits:

     new 868e4b0  [DLAB-625] Created Jupyterlab template for Azure

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



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


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

Posted by dm...@apache.org.
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