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

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

commit c1d23dc763b0ca777fb6fd1add9770e67c497b60
Author: leonidfrolov <[email protected]>
AuthorDate: Tue Jul 28 18:14:27 2020 +0300

    [DLAB-1966]: fixed R package installation for dataengine-service, yum 
installation, some other pip, R and apt improvements
---
 .../src/general/lib/os/debian/notebook_lib.py      |  6 ++-
 .../src/general/lib/os/fab.py                      | 14 +++++--
 .../src/general/lib/os/redhat/notebook_lib.py      | 47 +++++++++++++++++++---
 .../general/scripts/os/install_additional_libs.py  |  3 ++
 4 files changed, 58 insertions(+), 12 deletions(-)

diff --git 
a/infrastructure-provisioning/src/general/lib/os/debian/notebook_lib.py 
b/infrastructure-provisioning/src/general/lib/os/debian/notebook_lib.py
index d3bcefa..7a9a12b 100644
--- a/infrastructure-provisioning/src/general/lib/os/debian/notebook_lib.py
+++ b/infrastructure-provisioning/src/general/lib/os/debian/notebook_lib.py
@@ -380,7 +380,7 @@ def install_os_pkg(requisites):
             sudo('DEBIAN_FRONTEND=noninteractive apt-get -y install 
--allow-downgrades {0} 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({1})" 
/tmp/tee.tmp > '
                  '/tmp/os_install_{0}.log; then echo "" > 
/tmp/os_install_{0}.log;fi'.format(os_pkg, error_parser))
             err = sudo('cat 
/tmp/os_install_{}.log'.format(os_pkg)).replace('"', "'")
-            sudo('cat /tmp/tee.tmp | if ! grep -w -E -A 20 "({1})" 
/tmp/tee.tmp > '
+            sudo('cat /tmp/tee.tmp | if ! grep -w -E -A 30 "({1})" 
/tmp/tee.tmp > '
                  '/tmp/os_install_{0}.log; then echo "" > 
/tmp/os_install_{0}.log;fi'.format(os_pkg, new_pkgs_parser))
             dep = sudo('cat /tmp/os_install_{}.log'.format(os_pkg))
             if dep == '':
@@ -390,7 +390,9 @@ def install_os_pkg(requisites):
                         .replace('\n', '').replace('  ', ' ').replace(' {} 
'.format(os_pkg.split("=")[0]),
                                                                       ' 
').strip().split(' ')
                 for n, i in enumerate(dep):
-                    dep[n] = sudo('apt show {} 2>&1 | grep 
Version:'.format(i)).replace('Version: ', '{} v.'.format(i))
+                    sudo('apt show {0} 2>&1 | if ! grep Version: > '
+                 '/tmp/os_install_{0}.log; then echo "" > 
/tmp/os_install_{0}.log;fi'.format(i))
+                    dep[n] =sudo('cat 
/tmp/os_install_{}.log'.format(i)).replace('Version: ', '{} v.'.format(i))
                 dep = [i for i in dep if i]
             versions = []
             sudo('apt list --installed | if ! grep {0}/ > 
/tmp/os_install_{1}.list; then  echo "" > 
/tmp/os_install_{1}.list;fi'.format(os_pkg.split("=")[0], os_pkg))
diff --git a/infrastructure-provisioning/src/general/lib/os/fab.py 
b/infrastructure-provisioning/src/general/lib/os/fab.py
index a277cf1..6b9d47c 100644
--- a/infrastructure-provisioning/src/general/lib/os/fab.py
+++ b/infrastructure-provisioning/src/general/lib/os/fab.py
@@ -54,7 +54,7 @@ def dataengine_dir_prepare(cluster_dir):
 
 def install_pip_pkg(requisites, pip_version, lib_group):
     status = list()
-    error_parser = "Could not|No 
matching|ImportError:|failed|EnvironmentError:|requires"
+    error_parser = "Could not|No 
matching|ImportError:|failed|EnvironmentError:|requires|FileNotFoundError:|RuntimeError:|error:"
     try:
         if pip_version == 'pip3' and not exists('/bin/pip3'):
             sudo('ln -s /bin/pip3.5 /bin/pip3')
@@ -111,7 +111,9 @@ def install_pip_pkg(requisites, pip_version, lib_group):
                     if i == pip_pkg.split("==")[0]:
                         dep[n] = ''
                     else:
-                        dep[n] = sudo('{} show {} 2>&1 | grep 
Version:'.format(pip_version, i)).replace('Version: ', '{} v.'.format(i))
+                        sudo('{0} show {1} 2>&1 | if ! grep Version: 
/tmp/tee.tmp > '
+                             '/tmp/{0}_install_{1}.log; then echo "" > 
/tmp/{0}_install_{1}.log;fi'.format(pip_version, i))
+                        dep[n] = sudo('cat 
/tmp/{0}_install_{1}.log'.format(pip_version, i)).replace('Version: ', '{} 
v.'.format(i))
                 dep = [i for i in dep if i]
             status.append({"group": lib_group, "name": pip_pkg.split("==")[0], 
"version": version, "status": status_msg,
                            "error_message": err, "available_versions": 
versions, "add_pkgs": dep})
@@ -439,7 +441,10 @@ def install_r_pkg(requisites):
             else:
                 dep = dep.split(' ')
                 for n, i in enumerate(dep):
-                    dep[n] = '{} v.{}'.format(dep[n], dep_ver[n])
+                    if i == name:
+                        dep[n] = ''
+                    else:
+                        dep[n] = '{} v.{}'.format(dep[n], dep_ver[n])
                 dep = [i for i in dep if i]
             err = sudo('cat /tmp/install_{0}.log'.format(name)).replace('"', 
"'")
             sudo('R -e \'installed.packages()[,c(3:4)]\' | if ! grep -w {0} > 
/tmp/install_{0}.list; then  echo "" > /tmp/install_{0}.list;fi'.format(name))
@@ -454,7 +459,8 @@ def install_r_pkg(requisites):
                 sudo('R -e \'install.packages("versions", 
repos="https://cloud.r-project.org";, dep=TRUE)\'')
                 versions = sudo('R -e \'library(versions); 
available.versions("' + name + '")\' 2>&1 | grep -A 50 '
                                     '\'date available\' | awk \'{print 
$2}\'').replace('\r\n', ' ')[5:].split(' ')
-                status_msg = 'invalid_version'
+                if versions != '':
+                    status_msg = 'invalid_version'
             else:
                 versions = []
             status.append({"group": "r_pkg", "name": name, "version": version, 
"status": status_msg, "error_message": err, "available_versions": versions, 
"add_pkgs": dep})
diff --git 
a/infrastructure-provisioning/src/general/lib/os/redhat/notebook_lib.py 
b/infrastructure-provisioning/src/general/lib/os/redhat/notebook_lib.py
index ce075c0..cf7d8d1 100644
--- a/infrastructure-provisioning/src/general/lib/os/redhat/notebook_lib.py
+++ b/infrastructure-provisioning/src/general/lib/os/redhat/notebook_lib.py
@@ -346,19 +346,54 @@ def install_nodejs(os_user):
 def install_os_pkg(requisites):
     status = list()
     error_parser = "Could not|No matching|Error:|failed|Requires:|Errno"
+    new_pkgs_parser = "Dependency Installed:"
     try:
         print("Updating repositories and installing requested tools: 
{}".format(requisites))
         manage_pkg('update-minimal --security -y --skip-broken', 'remote', '')
         sudo('export LC_ALL=C')
         for os_pkg in requisites:
-            manage_pkg('-y install', 'remote', '{0} --nogpgcheck 2>&1 | if ! 
grep -w -E  "({1})" >  /tmp/os_install_{0}.log; then  echo "" > 
/tmp/os_install_{0}.log;fi'.format(os_pkg, error_parser))
+            name, vers = os_pkg
+            if vers != '' and vers !='N/A':
+                version = vers
+                os_pkg = "{}-{}".format(name, vers)
+            else:
+                version = 'N/A'
+                os_pkg = name
+            manage_pkg('-y install', 'remote', '{0} --nogpgcheck 2>&1 | tee 
/tmp/tee.tmp; if ! grep -w -E  "({1})" /tmp/tee.tmp >  /tmp/os_install_{0}.log; 
then  echo "" > /tmp/os_install_{0}.log;fi'.format(os_pkg, error_parser))
+            install_output = sudo('cat /tmp/tee.tmp')
             err = sudo('cat 
/tmp/os_install_{}.log'.format(os_pkg)).replace('"', "'")
-            try:
-                res = sudo('python -c "import os,sys,yum; yb = yum.YumBase(); 
pl = yb.doPackageLists(); print [pkg.vr for pkg in pl.installed if pkg.name == 
\'{0}\'][0]"'.format(os_pkg))
+            sudo('cat /tmp/tee.tmp | if ! grep -w -E -A 30 "({1})" 
/tmp/tee.tmp > '
+                 '/tmp/os_install_{0}.log; then echo "" > 
/tmp/os_install_{0}.log;fi'.format(os_pkg, new_pkgs_parser))
+            dep = sudo('cat /tmp/os_install_{}.log'.format(os_pkg))
+            if dep == '':
+                dep = []
+            else:
+                dep = dep[len(new_pkgs_parser): dep.find("Complete!") - 
1].replace('  ', '').strip().split('\r\n')
+                for n, i in enumerate(dep):
+                    i = i.split('.')[0]
+                    sudo('yum info {0} 2>&1 | if ! grep Version > 
/tmp/os_install_{0}.log; then echo "" > /tmp/os_install_{0}.log;fi'.format(i))
+                    dep[n] =sudo('cat 
/tmp/os_install_{}.log'.format(i)).replace('Version     : ', '{} v.'.format(i))
+                dep = [i for i in dep if i]
+            versions = []
+            res = sudo(
+                'python -c "import os,sys,yum; yb = yum.YumBase(); pl = 
yb.doPackageLists(); print [pkg.vr for pkg in pl.installed if pkg.name == 
\'{0}\'][0]"'.format(
+                    name))
+            if err:
+                status_msg = 'installation_error'
+            elif res:
                 version = res.split('\r\n')[1].replace("'", "\"")
-                status.append({"group": "os_pkg", "name": os_pkg, "version": 
version, "status": "installed"})
-            except:
-                status.append({"group": "os_pkg", "name": os_pkg, "status": 
"failed", "error_message": err})
+                status_msg = "installed"
+            if 'No package {} available'.format(os_pkg) in install_output:
+                versions = sudo ('yum --showduplicates list ' + name + ' | 
expand | grep -A 10 "Available Packages" | grep -v "Available Packages"| awk 
\'{print $2}\'').replace('\r\n', '').split(' ')
+                if versions != '':
+                    status_msg = 'invalid_version'
+                    for n, i in enumerate(versions):
+                        if ':' in i:
+                            versions[n] = i.split(':')[1].split('-')[0]
+                        else:
+                            versions[n] = i.split('-')[0]
+            status.append({"group": "os_pkg", "name": name, "version": 
version, "status": status_msg,
+                           "error_message": err, "add_pkgs": dep, 
"available_versions": versions})
         return status
     except Exception as err:
         for os_pkg in requisites:
diff --git 
a/infrastructure-provisioning/src/general/scripts/os/install_additional_libs.py 
b/infrastructure-provisioning/src/general/scripts/os/install_additional_libs.py
index ca81a97..075175c 100644
--- 
a/infrastructure-provisioning/src/general/scripts/os/install_additional_libs.py
+++ 
b/infrastructure-provisioning/src/general/scripts/os/install_additional_libs.py
@@ -115,6 +115,9 @@ if __name__ == "__main__":
             or os.environ['application'] in ('rstudio', 'tensor-rstudio'):
         try:
             print('Installing R packages: 
{}'.format(pkgs['libraries']['r_pkg']))
+            if os.environ['conf_resource'] in ('dataengine-service'):
+                manage_pkg('-y install', 'remote', 'libcurl libcurl-devel')
+                sudo('R -e "install.packages(\'devtools\', repos = 
\'https://cloud.r-project.org\')"')
             status = install_r_pkg(pkgs['libraries']['r_pkg'])
             general_status = general_status + status
         except KeyError:


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to