You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by om...@apache.org on 2019/03/25 15:21:49 UTC

[incubator-dlab] branch test_branch updated: [DLAB-77] Added TensorFlow-Rstudio template

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

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


The following commit(s) were added to refs/heads/test_branch by this push:
     new 59ea784  [DLAB-77] Added TensorFlow-Rstudio template
     new b2146a1  Merge pull request #58 from Dyoma33/DLAB-77
59ea784 is described below

commit 59ea784e421e0b09754b68e4c6b63869cd429ded
Author: Dyoma33 <de...@gmail.com>
AuthorDate: Mon Mar 25 17:15:17 2019 +0200

    [DLAB-77] Added TensorFlow-Rstudio template
---
 .../general/files/gcp/tensor-rstudio_Dockerfile    |  37 +++
 .../files/gcp/tensor-rstudio_description.json      |  20 ++
 .../src/general/scripts/gcp/ssn_configure.py       |   1 +
 .../scripts/gcp/tensor-rstudio_configure.py        | 303 +++++++++++++++++++++
 .../gcp/jenkins_jobs/create_data_engine/config.xml |   1 +
 .../jenkins_jobs/create_notebook_server/config.xml |   1 +
 .../jenkins_jobs/start_notebook_server/config.xml  |   1 +
 .../jenkins_jobs/stop_notebook_server/config.xml   |   1 +
 .../terminate_notebook_server/config.xml           |   1 +
 .../src/ssn/files/gcp/mongo_roles.json             |  10 +
 10 files changed, 376 insertions(+)

diff --git a/infrastructure-provisioning/src/general/files/gcp/tensor-rstudio_Dockerfile b/infrastructure-provisioning/src/general/files/gcp/tensor-rstudio_Dockerfile
new file mode 100644
index 0000000..06468f8
--- /dev/null
+++ b/infrastructure-provisioning/src/general/files/gcp/tensor-rstudio_Dockerfile
@@ -0,0 +1,37 @@
+# *****************************************************************************
+#
+# 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 tensor-rstudio/ /root/
+COPY general/scripts/os/* /root/scripts/
+COPY general/scripts/gcp/tensor-rstudio_* /root/scripts/
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/templates/os/${OS}/ungit.service /root/templates/
+COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
+COPY general/templates/os/${OS}/ungit.service /root/templates/
+COPY general/templates/os/tensorboard.service /root/templates/
+
+RUN chmod a+x /root/fabfile.py; \
+    chmod a+x /root/scripts/*
diff --git a/infrastructure-provisioning/src/general/files/gcp/tensor-rstudio_description.json b/infrastructure-provisioning/src/general/files/gcp/tensor-rstudio_description.json
new file mode 100644
index 0000000..31714cc
--- /dev/null
+++ b/infrastructure-provisioning/src/general/files/gcp/tensor-rstudio_description.json
@@ -0,0 +1,20 @@
+{
+  "exploratory_environment_shapes" :
+  {
+    "GPU optimized": [
+      {"Size": "S", "Description": "n1-standard-2", "Type": "n1-standard-2","Ram": "7.50 GB","Cpu": "2"},
+      {"Size": "M", "Description": "n1-highcpu-8", "Type": "n1-highcpu-8","Ram": "7.20 GB","Cpu": "8"},
+      {"Size": "L", "Description": "n1-highmem-32", "Type": "n1-highmem-32","Ram": "208 GB","Cpu": "32"}
+    ]
+  },
+  "exploratory_environment_versions" :
+  [
+    {
+       "template_name": "RStudio with TensorFlow 1.8.0",
+      "description": "Base image with TensorFlow and RStudio node creation routines",
+      "environment_type": "exploratory",
+      "version": "tensorflow_gpu-1.8.0",
+      "vendor": "GCP"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/ssn_configure.py b/infrastructure-provisioning/src/general/scripts/gcp/ssn_configure.py
index 591fd77..fe8235f 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/ssn_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/ssn_configure.py
@@ -220,6 +220,7 @@ if __name__ == "__main__":
                              {"name": "rstudio", "tag": "latest"},
                              {"name": "zeppelin", "tag": "latest"},
                              {"name": "tensor", "tag": "latest"},
+                             {"name": "tensor-rstudio", "tag": "latest"},
                              {"name": "deeplearning", "tag": "latest"},
                              {"name": "dataengine", "tag": "latest"},
                              {"name": "dataengine-service", "tag": "latest"}]
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/tensor-rstudio_configure.py b/infrastructure-provisioning/src/general/scripts/gcp/tensor-rstudio_configure.py
new file mode 100644
index 0000000..f4d1661
--- /dev/null
+++ b/infrastructure-provisioning/src/general/scripts/gcp/tensor-rstudio_configure.py
@@ -0,0 +1,303 @@
+#!/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
+import argparse
+import traceback
+
+
+if __name__ == "__main__":
+    instance_class = 'notebook'
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_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)
+
+    notebook_config = dict()
+    try:
+        notebook_config['exploratory_name'] = os.environ['exploratory_name']
+    except:
+        notebook_config['exploratory_name'] = ''
+    notebook_config['service_base_name'] = os.environ['conf_service_base_name']
+    notebook_config['instance_type'] = os.environ['gcp_notebook_instance_size']
+    notebook_config['key_name'] = os.environ['conf_key_name']
+    notebook_config['user_keyname'] = os.environ['edge_user_name']
+    notebook_config['network_type'] = os.environ['conf_network_type']
+    notebook_config['instance_name'] = '{}-{}-nb-{}-{}'.format(notebook_config['service_base_name'],
+                                                               os.environ['edge_user_name'],
+                                                               notebook_config['exploratory_name'], args.uuid)
+    notebook_config['expected_image_name'] = '{}-{}-notebook-image'.format(notebook_config['service_base_name'],
+                                                                           os.environ['application'])
+    notebook_config['notebook_image_name'] = str(os.environ.get('notebook_image_name'))
+    notebook_config['role_profile_name'] = '{}-{}-nb-de-Profile' \
+        .format(notebook_config['service_base_name'].lower().replace('-', '_'), os.environ['edge_user_name'])
+    notebook_config['security_group_name'] = '{}-{}-nb-SG'.format(notebook_config['service_base_name'],
+                                                                  os.environ['edge_user_name'])
+    notebook_config['tag_name'] = '{}-Tag'.format(notebook_config['service_base_name'])
+    notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+    notebook_config['shared_image_enabled'] = os.environ['conf_shared_image_enabled']
+    tag = {"Key": notebook_config['tag_name'],
+           "Value": "{}-{}-subnet".format(notebook_config['service_base_name'], os.environ['edge_user_name'])}
+    notebook_config['subnet_cidr'] = get_subnet_by_tag(tag)
+    notebook_config['rstudio_pass'] = id_generator()
+
+    # generating variables regarding EDGE proxy on Notebook instance
+    instance_hostname = get_instance_hostname(notebook_config['tag_name'], notebook_config['instance_name'])
+    edge_instance_name = os.environ['conf_service_base_name'] + "-" + os.environ['edge_user_name'] + '-edge'
+    edge_instance_hostname = get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
+    if notebook_config['network_type'] == 'private':
+        edge_instance_ip = get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get('Private')
+    else:
+        edge_instance_ip = get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get('Public')
+    keyfile_name = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
+
+    try:
+        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'
+
+        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'.", str(err))
+        GCPActions().remove_instance(notebook_config['instance_name'], notebook_config['zone'])
+        sys.exit(1)
+
+    # configuring proxy on Notebook instance
+    try:
+        logging.info('[CONFIGURE PROXY ON TENSORFLOW-RSTUDIO INSTANCE]')
+        print('[CONFIGURE PROXY ON TENSORFLOW-RSTUDIO INSTANCE]')
+        additional_config = {"proxy_host": edge_instance_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))
+        GCPActions().remove_instance(notebook_config['instance_name'], notebook_config['zone'])
+        sys.exit(1)
+
+    # updating repositories & installing python packages
+    try:
+        logging.info('[INSTALLING PREREQUISITES TO TENSORFLOW-RSTUDIO NOTEBOOK INSTANCE]')
+        print('[INSTALLING PREREQUISITES TO TENSORFLOW-RSTUDIO NOTEBOOK INSTANCE]')
+        params = "--hostname {} --keyfile {} --user {} --region {}". \
+            format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['dlab_ssh_user'], os.environ['gcp_region'])
+        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))
+        GCPActions().remove_instance(notebook_config['instance_name'], notebook_config['zone'])
+        sys.exit(1)
+
+    # installing and configuring TensorFlow and RSTUDIO and all dependencies
+    try:
+        logging.info('[CONFIGURE TENSORFLOW-RSTUDIO NOTEBOOK INSTANCE]')
+        print('[CONFIGURE TENSORFLOW-RSTUDIO NOTEBOOK INSTANCE]')
+        params = "--hostname {}  --keyfile {} " \
+                 "--region {} --rstudio_pass {} " \
+                 "--rstudio_version {} --os_user {} " \
+                 "--r_mirror {} --exploratory_name {}" \
+            .format(instance_hostname, keyfile_name,
+                    os.environ['aws_region'], notebook_config['rstudio_pass'],
+                    os.environ['notebook_rstudio_version'], notebook_config['dlab_ssh_user'],
+                    os.environ['notebook_r_mirror'], notebook_config['exploratory_name'])
+        try:
+            local("~/scripts/{}.py {}".format('configure_tensor-rstudio_node', params))
+        except:
+            traceback.print_exc()
+            raise Exception
+    except Exception as err:
+        print('Error: {0}'.format(err))
+        append_result("Failed to configure tensoflow-rstudio.", str(err))
+        GCPActions().remove_instance(notebook_config['instance_name'], notebook_config['zone'])
+        sys.exit(1)
+
+    try:
+        print('[INSTALLING USERs KEY]')
+        logging.info('[INSTALLING USERs KEY]')
+        additional_config = {"user_keyname": os.environ['edge_user_name'],
+                             "user_keydir": os.environ['conf_key_dir']}
+        params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
+            instance_hostname, notebook_config['ssh_key_path'], 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))
+        GCPActions().remove_instance(notebook_config['instance_name'], notebook_config['zone'])
+        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, notebook_config['ssh_key_path'])
+        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))
+        GCPActions().remove_instance(notebook_config['instance_name'], notebook_config['zone'])
+        sys.exit(1)
+
+    if notebook_config['shared_image_enabled'] == 'true':
+        try:
+            print('[CREATING IMAGE]')
+            primary_image_id = GCPMeta().get_image_by_name(notebook_config['expected_primary_image_name'])
+            secondary_image_id = GCPMeta().get_image_by_name(notebook_config['expected_secondary_image_name'])
+            if primary_image_id == '':
+                print("Looks like it's first time we configure notebook server. Creating images.")
+                primary_image_id = GCPActions().create_image_from_instance_disk(
+                    notebook_config['expected_primary_image_name'], 'primary',
+                    notebook_config['instance_name'], notebook_config['zone'])
+                if primary_image_id != '':
+                    print("Image of primary disk was successfully created. It's ID is {}".format(primary_image_id))
+            if secondary_image_id == '':
+                secondary_image_id = GCPActions().create_image_from_instance_disk(
+                    notebook_config['expected_secondary_image_name'], 'secondary', notebook_config['instance_name'],
+                    notebook_config['zone'])
+                if secondary_image_id != '':
+                    print("Image of secondary disk was successfully created. It's ID is {}".format(secondary_image_id))
+        except Exception as err:
+            print('Error: {0}'.format(err))
+            append_result("Failed creating image.", str(err))
+            GCPActions().remove_instance(notebook_config['instance_name'], notebook_config['zone'])
+            GCPActions().remove_image(notebook_config['expected_primary_image_name'])
+            GCPActions().remove_image(notebook_config['expected_secondary_image_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_hostname,
+                    notebook_config['ssh_key_path'],
+                    notebook_config['dlab_ssh_user'],
+                    'rstudio',
+                    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))
+        GCPActions().remove_instance(notebook_config['instance_name'], notebook_config['zone'])
+        sys.exit(1)
+
+    # generating output information
+    ip_address = GCPMeta().get_private_ip_address(notebook_config['instance_name'])
+    rstudio_ip_url = "http://" + ip_address + ":8787/"
+    ungit_ip_url = "http://" + ip_address + ":8085/{}-ungit/".format(notebook_config['exploratory_name'])
+    rstudio_notebook_acces_url = "http://" + edge_instance_hostname + "/{}/".format(notebook_config['exploratory_name'])
+    rstudio_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_type']))
+    print("Key name: {}".format(notebook_config['key_name']))
+    print("User key name: {}".format(os.environ['edge_user_name']))
+    print("Rstudio URL: {}".format(rstudio_ip_url))
+    print("Rstudio user: {}".format(notebook_config['dlab_ssh_user']))
+    print("Rstudio pass: {}".format(notebook_config['rstudio_pass']))
+    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 = {"hostname": dns_name,
+               "ip": ip_address,
+               "instance_id": get_instance_by_name(notebook_config['tag_name'], notebook_config['instance_name']),
+               "master_keyname": os.environ['conf_key_name'],
+               "tensorboard_log_dir": "/var/log/tensorboard",
+               "notebook_name": notebook_config['instance_name'],
+               "notebook_image_name": notebook_config['notebook_image_name'],
+               "Action": "Create new notebook server",
+               "exploratory_url": [
+                   {"description": "RStudio",
+                    "url": rstudio_notebook_acces_url},
+                   {"description": "TensorBoard",
+                    "url": tensorboard_acces_url},
+                   {"description": "Ungit",
+                    "url": rstudio_ungit_acces_url},
+                   {"description": "RStudio (via tunnel)",
+                    "url": rstudio_ip_url},
+                   {"description": "TensorBoard (via tunnel)",
+                    "url": tensorboard_url},
+                   {"description": "Ungit (via tunnel)",
+                    "url": ungit_ip_url}
+               ],
+               "exploratory_user": notebook_config['dlab_ssh_user'],
+               "exploratory_pass": notebook_config['rstudio_pass']}
+        result.write(json.dumps(res))
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_data_engine/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_data_engine/config.xml
index 1f28970..0fe5f41 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_data_engine/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_data_engine/config.xml
@@ -70,6 +70,7 @@ under the License.
                             <string>rstudio</string>
                             <string>zeppelin</string>
                             <string>tensor</string>
+                            <string>tensor-rstudio</string>
                         </a>
                     </choices>
                 </hudson.model.ChoiceParameterDefinition>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_notebook_server/config.xml
index c09b1f8..dc5353e 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_notebook_server/config.xml
@@ -40,6 +40,7 @@ under the License.
               <string>rstudio</string>
               <string>zeppelin</string>
               <string>tensor</string>
+              <string>tensor-rstudio</string>
               <string>deeplearning</string>
             </a>
           </choices>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_notebook_server/config.xml
index 157cbf6..cff88ae 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_notebook_server/config.xml
@@ -45,6 +45,7 @@ under the License.
               <string>rstudio</string>
               <string>zeppelin</string>
               <string>tensor</string>
+              <string>tensor-rstudio</string>
             </a>
           </choices>
         </hudson.model.ChoiceParameterDefinition>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_notebook_server/config.xml
index 58a10a6..736431f 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_notebook_server/config.xml
@@ -45,6 +45,7 @@ under the License.
               <string>rstudio</string>
               <string>zeppelin</string>
               <string>tensor</string>
+              <string>tensor-rstudio</string>
               <string>deeplearning</string>
             </a>
           </choices>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_notebook_server/config.xml
index e2a04be..a466df4 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_notebook_server/config.xml
@@ -45,6 +45,7 @@ under the License.
               <string>rstudio</string>
               <string>zeppelin</string>
               <string>tensor</string>
+              <string>tensor-rstudio</string>
             </a>
           </choices>
         </hudson.model.ChoiceParameterDefinition>
diff --git a/infrastructure-provisioning/src/ssn/files/gcp/mongo_roles.json b/infrastructure-provisioning/src/ssn/files/gcp/mongo_roles.json
index 20f81d9..3cdb601 100644
--- a/infrastructure-provisioning/src/ssn/files/gcp/mongo_roles.json
+++ b/infrastructure-provisioning/src/ssn/files/gcp/mongo_roles.json
@@ -119,6 +119,16 @@
       "$anyuser"
     ]
   },
+    {
+    "_id": "nbCreateTensorRstudio",
+    "description": "Create Notebook RStudio with TensorFlow",
+    "exploratories": [
+      "docker.dlab-tensor-rstudio"
+    ],
+    "groups": [
+      "$anyuser"
+    ]
+  },
   {
     "_id": "nbCreateZeppelin",
     "description": "Create Notebook Apache Zeppelin",


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