Allow the user to select master or release during the install
[vpp.git] / extras / vpp_config / vpplib / VPPUtil.py
index 07d65b0..a1c64a3 100644 (file)
@@ -16,13 +16,10 @@ import logging
 import re
 import subprocess
 import platform
+import requests
 
 from collections import Counter
 
-# VPP_VERSION = '1707'
-# VPP_VERSION = '1710'
-VPP_VERSION = '1801'
-
 
 class VPPUtil(object):
     """General class for any VPP related methods/functions."""
@@ -112,16 +109,15 @@ class VPPUtil(object):
             raise RuntimeError('{} failed on node {} {} {}'.format(
                 cmd, node['host'], stdout, stderr))
 
-    def _install_vpp_ubuntu(self, node, fdio_release=VPP_VERSION,
-                            ubuntu_version='xenial'):
+    def _install_vpp_ubuntu(self, node, branch, ubuntu_version='xenial'):
         """
         Install the VPP packages
 
         :param node: Node dictionary with cpuinfo.
-        :param fdio_release: VPP release number
+        :param branch: VPP branch
         :param ubuntu_version: Ubuntu Version
         :type node: dict
-        :type fdio_release: string
+        :type branch: string
         :type ubuntu_version: string
         """
 
@@ -131,22 +127,16 @@ class VPPUtil(object):
         # Backup the sources list
         self._autoconfig_backup_file(sfile)
 
-        # Remove the current file
-        cmd = 'rm {}'.format(sfile)
-        (ret, stdout, stderr) = self.exec_command(cmd)
-        if ret != 0:
-            logging.debug('{} failed on node {} {}'.format(
-                cmd,
-                node['host'],
-                stderr))
+        reps = 'deb [trusted=yes] https://packagecloud.io/fdio/'
+        reps += '{}/ubuntu {} main ./\n'.format(branch, ubuntu_version)
 
-        reps = 'deb [trusted=yes] https://nexus.fd.io/content/'
-        # When using a stable branch
-        # reps += 'repositories/fd.io.stable.{}.ubuntu.{}.main/ ./\n'.format(fdio_release, ubuntu_version)
-        # When using release
-        reps += 'repositories/fd.io.ubuntu.{}.main/ ./\n'.format(ubuntu_version)
+        with open(sfile, 'w') as sfd:
+            sfd.write(reps)
+            sfd.close()
 
-        cmd = 'echo "{0}" | sudo tee {1}'.format(reps, sfile)
+        # Add the key
+        key = requests.get('https://packagecloud.io/fdio/{}/gpgkey'.format(branch))
+        cmd = 'echo "{}" | apt-key add -'.format(key.content)
         (ret, stdout, stderr) = self.exec_command(cmd)
         if ret != 0:
             raise RuntimeError('{} failed on node {} {}'.format(
@@ -166,27 +156,39 @@ class VPPUtil(object):
         self._install_vpp_pkg_ubuntu(node, 'vpp-lib')
         self._install_vpp_pkg_ubuntu(node, 'vpp')
         self._install_vpp_pkg_ubuntu(node, 'vpp-plugins')
-        self._install_vpp_pkg_ubuntu(node, 'vpp-dpdk-dkms')
-        self._install_vpp_pkg_ubuntu(node, 'vpp-dpdk-dev')
         self._install_vpp_pkg_ubuntu(node, 'vpp-api-python')
         self._install_vpp_pkg_ubuntu(node, 'vpp-api-java')
         self._install_vpp_pkg_ubuntu(node, 'vpp-api-lua')
         self._install_vpp_pkg_ubuntu(node, 'vpp-dev')
         self._install_vpp_pkg_ubuntu(node, 'vpp-dbg')
 
-    def _install_vpp_centos(self, node, fdio_release=VPP_VERSION,
-                            centos_version='centos7'):
+    def _install_vpp_centos(self, node, branch):
         """
         Install the VPP packages
 
         :param node: Node dictionary with cpuinfo.
-        :param fdio_release: VPP release number
-        :param centos_version: Ubuntu Version
+        :param branch: The branch name  release or master
         :type node: dict
-        :type fdio_release: string
-        :type centos_version: string
+        :type branch: string
         """
 
+        # Be sure the correct system packages are installed
+        cmd = 'yum -y update'
+        (ret, stdout, stderr) = self.exec_command(cmd)
+        if ret != 0:
+            logging.debug('{} failed on node {} {}'.format(
+                cmd,
+                node['host'],
+                stderr))
+
+        cmd = 'yum -y install pygpgme yum-utils'
+        (ret, stdout, stderr) = self.exec_command(cmd)
+        if ret != 0:
+            logging.debug('{} failed on node {} {}'.format(
+                cmd,
+                node['host'],
+                stderr))
+
         # Modify the sources list
         sfile = '/etc/yum.repos.d/fdio-release.repo'
 
@@ -202,51 +204,83 @@ class VPPUtil(object):
                 node['host'],
                 stderr))
 
-        reps = '[fdio-stable-{}]\n'.format(fdio_release)
-        reps += 'name=fd.io stable/{} branch latest merge\n'.format(fdio_release)
-        # When using stable
-        # reps += 'baseurl=https://nexus.fd.io/content/repositories/fd.io.stable.{}.{}/\n'.\
-        #     format(fdio_release, centos_version)
-        # When using release
-        reps += 'baseurl=https://nexus.fd.io/content/repositories/fd.io.{}/\n'.format(centos_version)
+        # Get the file contents
+        reps = '[fdio_{}]\n'.format(branch)
+        reps += 'name=fdio_{}\n'.format(branch)
+        reps += 'baseurl=https://packagecloud.io/fdio/{}/el/7/$basearch\n'.format(branch)
+        reps += 'repo_gpgcheck=1\n'
+        reps += 'gpgcheck=0\n'
+        reps += 'enabled=1\n'
+        reps += 'gpgkey=https://packagecloud.io/fdio/{}/gpgkey\n'.format(branch)
+        reps += 'sslverify=1\n'
+        reps += 'sslcacert=/etc/pki/tls/certs/ca-bundle.crt\n'
+        reps += 'metadata_expire=300\n'
+        reps += '\n'
+        reps += '[fdio_{}-source]\n'.format(branch)
+        reps += 'name=fdio_{}-source\n'.format(branch)
+        reps += 'baseurl=https://packagecloud.io/fdio/{}/el/7/SRPMS\n'.format(branch)
+        reps += 'repo_gpgcheck=1\n'
+        reps += 'gpgcheck=0\n'
         reps += 'enabled=1\n'
-        reps += 'gpgcheck=0'
+        reps += 'gpgkey=https://packagecloud.io/fdio/{}/gpgkey\n'.format(branch)
+        reps += 'sslverify =1\n'
+        reps += 'sslcacert=/etc/pki/tls/certs/ca-bundle.crt\n'
+        reps += 'metadata_expire=300\n'
+
+        with open(sfile, 'w') as sfd:
+            sfd.write(reps)
+            sfd.close()
 
-        cmd = 'echo "{0}" | sudo tee {1}'.format(reps, sfile)
+        # Update the fdio repo
+        cmd = 'yum clean all'
         (ret, stdout, stderr) = self.exec_command(cmd)
         if ret != 0:
-            raise RuntimeError('{} failed on node {} {}'.format(
+            logging.debug('{} failed on node {} {}'.format(
+                cmd,
+                node['host'],
+                stderr))
+
+        cmd = "yum -q makecache -y --disablerepo='*' --enablerepo='fdio_{}'".format(branch)
+        (ret, stdout, stderr) = self.exec_command(cmd)
+        if ret != 0:
+            logging.debug('{} failed on node {} {}'.format(
                 cmd,
                 node['host'],
                 stderr))
 
         # Install the packages
+        self._install_vpp_pkg_centos(node, 'vpp-selinux-policy')
         self._install_vpp_pkg_centos(node, 'vpp-lib')
         self._install_vpp_pkg_centos(node, 'vpp')
         self._install_vpp_pkg_centos(node, 'vpp-plugins')
-        # jadfix Check with Ole
-        # self._install_vpp_pkg_centos(node, 'vpp-dpdk-devel')
         self._install_vpp_pkg_centos(node, 'vpp-api-python')
         self._install_vpp_pkg_centos(node, 'vpp-api-java')
         self._install_vpp_pkg_centos(node, 'vpp-api-lua')
         self._install_vpp_pkg_centos(node, 'vpp-devel')
+        self._install_vpp_pkg_centos(node, 'vpp-debuginfo')
 
-    def install_vpp(self, node):
+    def install_vpp(self, node, branch):
         """
         Install the VPP packages
 
         :param node: Node dictionary with cpuinfo.
+        :param branch: The branch name
         :type node: dict
+        :type branch: string
+
         """
         distro = self.get_linux_distro()
+        logging.info("  {}".format(distro[0]))
         if distro[0] == 'Ubuntu':
-            self._install_vpp_ubuntu(node)
+            logging.info("Install Ubuntu")
+            self._install_vpp_ubuntu(node, branch, ubuntu_version=distro[2])
         elif distro[0] == 'CentOS Linux':
             logging.info("Install CentOS")
-            self._install_vpp_centos(node)
+            self._install_vpp_centos(node, branch)
         else:
-            return
+            logging.info("Install CentOS (default)")
+            self._install_vpp_centos(node, branch)
+        return
 
     def _uninstall_vpp_pkg_ubuntu(self, node, pkg):
         """
@@ -290,14 +324,12 @@ class VPPUtil(object):
         if len(pkgs) > 0:
             if 'version' in pkgs[0]:
                 logging.info("Uninstall Ubuntu Packages")
+                self._uninstall_vpp_pkg_ubuntu(node, 'vpp-dbg')
+                self._uninstall_vpp_pkg_ubuntu(node, 'vpp-dev')
                 self._uninstall_vpp_pkg_ubuntu(node, 'vpp-api-python')
                 self._uninstall_vpp_pkg_ubuntu(node, 'vpp-api-java')
                 self._uninstall_vpp_pkg_ubuntu(node, 'vpp-api-lua')
                 self._uninstall_vpp_pkg_ubuntu(node, 'vpp-plugins')
-                self._uninstall_vpp_pkg_ubuntu(node, 'vpp-dpdk-dev')
-                self._uninstall_vpp_pkg_ubuntu(node, 'vpp-dpdk-dkms')
-                self._uninstall_vpp_pkg_ubuntu(node, 'vpp-dev')
-                self._uninstall_vpp_pkg_ubuntu(node, 'vpp-dbg')
                 self._uninstall_vpp_pkg_ubuntu(node, 'vpp')
                 self._uninstall_vpp_pkg_ubuntu(node, 'vpp-lib')
             else:
@@ -320,14 +352,15 @@ class VPPUtil(object):
         if len(pkgs) > 0:
             if 'version' in pkgs[0]:
                 logging.info("Uninstall CentOS Packages")
+                self._install_vpp_pkg_centos(node, 'vpp-debuginfo')
+                self._uninstall_vpp_pkg_centos(node, 'vpp-devel')
                 self._uninstall_vpp_pkg_centos(node, 'vpp-api-python')
                 self._uninstall_vpp_pkg_centos(node, 'vpp-api-java')
                 self._uninstall_vpp_pkg_centos(node, 'vpp-api-lua')
                 self._uninstall_vpp_pkg_centos(node, 'vpp-plugins')
-                self._uninstall_vpp_pkg_centos(node, 'vpp-dpdk-devel')
-                self._uninstall_vpp_pkg_centos(node, 'vpp-devel')
                 self._uninstall_vpp_pkg_centos(node, 'vpp')
                 self._uninstall_vpp_pkg_centos(node, 'vpp-lib')
+                self._uninstall_vpp_pkg_centos(node, 'vpp-selinux-policy')
             else:
                 logging.info("Uninstall locally installed CentOS Packages")
                 for pkg in pkgs:
@@ -348,11 +381,14 @@ class VPPUtil(object):
 
         distro = self.get_linux_distro()
         if distro[0] == 'Ubuntu':
+            logging.info("Uninstall Ubuntu")
             self._uninstall_vpp_ubuntu(node)
         elif distro[0] == 'CentOS Linux':
             logging.info("Uninstall CentOS")
             self._uninstall_vpp_centos(node)
         else:
+            logging.info("Uninstall CentOS (Default)")
+            self._uninstall_vpp_centos(node)
             return
 
     def show_vpp_settings(self, *additional_cmds):
@@ -488,27 +524,35 @@ class VPPUtil(object):
                 interfaces[name]['carrier'] = spl[1]
 
             # Socket
-            rfall = re.findall(r'cpu socket', line)
+            rfall = re.findall(r'numa \d+', line)
             if rfall:
-                spl = line.split('cpu socket ')
-                interfaces[name]['cpu socket'] = spl[1]
+                spl = rfall[0].split()
+                interfaces[name]['numa'] = rfall[0].split()[1]
 
             # Queues and Descriptors
-            rfall = re.findall(r'rx queues', line)
+            rfall = re.findall(r'rx\: queues \d+', line)
             if rfall:
-                spl = line.split(',')
-                interfaces[name]['rx queues'] = spl[0].lstrip(' ').split(' ')[2]
-                interfaces[name]['rx descs'] = spl[1].split(' ')[3]
-                interfaces[name]['tx queues'] = spl[2].split(' ')[3]
-                interfaces[name]['tx descs'] = spl[3].split(' ')[3]
+                interfaces[name]['rx queues'] = rfall[0].split()[2]
+                rdesc = re.findall(r'desc \d+', line)
+                if rdesc:
+                    interfaces[name]['rx descs'] = rdesc[0].split()[1]
+
+            rfall = re.findall(r'tx\: queues \d+', line)
+            if rfall:
+                interfaces[name]['tx queues'] = rfall[0].split()[2]
+                rdesc = re.findall(r'desc \d+', line)
+                if rdesc:
+                    interfaces[name]['tx descs'] = rdesc[0].split()[1]
 
         return interfaces
 
-    def _get_installed_vpp_pkgs_ubuntu(self):
+    def _get_installed_vpp_pkgs_ubuntu(self, distro):
         """
         Get the VPP hardware information and return it in a
         dictionary
 
+        :param distro: The linux distro
+        :type distro: dict
         :returns: List of the packages installed
         :rtype: list
         """
@@ -570,10 +614,11 @@ class VPPUtil(object):
 
         distro = self.get_linux_distro()
         if distro[0] == 'Ubuntu':
-            pkgs = self._get_installed_vpp_pkgs_ubuntu()
+            pkgs = self._get_installed_vpp_pkgs_ubuntu(distro)
         elif distro[0] == 'CentOS Linux':
             pkgs = self._get_installed_vpp_pkgs_centos()
         else:
+            pkgs = self._get_installed_vpp_pkgs_centos()
             return []
 
         return pkgs
@@ -657,9 +702,7 @@ class VPPUtil(object):
         cmd = 'service vpp stop'
         (ret, stdout, stderr) = VPPUtil.exec_command(cmd)
         if ret != 0:
-            raise RuntimeError('{} failed on node {} {} {}'.
-                               format(cmd, node['host'],
-                                      stdout, stderr))
+            logging.debug('{} failed on node {} {} {}'.format(cmd, node['host'], stdout, stderr))
 
     # noinspection RegExpRedundantEscape
     @staticmethod
@@ -712,7 +755,7 @@ class VPPUtil(object):
         distro = platform.linux_distribution()
         if distro[0] == 'Ubuntu' or \
                         distro[0] == 'CentOS Linux' or \
-                        distro[:26] == 'Linux Distribution Red Hat':
+                        distro[:7] == 'Red Hat':
             return distro
         else:
             raise RuntimeError('Linux Distribution {} is not supported'.format(distro[0]))
@@ -788,8 +831,8 @@ class VPPUtil(object):
         for line in lines:
             iface = re.findall(r'[a-zA-z]+\d+/\d+/\d+', line)
             if len(iface):
-                ifcidx ={'name': iface[0], 'index': line.split()[1] }
+                ifcidx = {'name': iface[0], 'index': line.split()[1]}
                 ifaces.append(ifcidx)
 
         print stdout
-        return ifaces
\ No newline at end of file
+        return ifaces