:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : Copyright (c) 2017 Enea AB, Cavium and others. : : All rights reserved. This program and the accompanying materials : are made available under the terms of the Apache License, Version 2.0 : which accompanies this distribution, and is available at : http://www.apache.org/licenses/LICENSE-2.0 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: From: Florin Dumitrascu Date: Thu, 17 Mar 2016 18:15:42 +0100 Subject: [PATCH] ODL leveldb, leveldbjni: Enable arm64 support. ODL depends on a native library (leveldb). ODL Beryllium and Boron versions are still using a native x86 version of this library (wrapped in leveldbjni). There is no upstream version of leveldbjni supporting arm64 leveldb, so we need to compile it when deploying ODL. This is done when running odl-install puppet manifest. For more info about this ODL limitation, see [1]. [ Alexandru.Avadanii@enea.com ] Remove JAVA8 changes after upstream rework. Convert puppet patching to prebuilt DEB package, as part of [2]. Rebase for Fuel Newton. [ Dan.Andresan@enea.com ] Modify Puppet recipe to restart Opendaylight service after leveldbjni This avoids a cache corruption described in [3] Fix leveldbjni on x86_64, since it should be silently skipped. [1] https://bugs.opendaylight.org/show_bug.cgi?id=3973 [2] https://jira.opnfv.org/browse/ARMBAND-114 [3] https://jira.opnfv.org/browse/ARMBAND-211 Change-Id: Ia7abf375ffd122ff0ac7b12422f64526ff2c78fd Signed-off-by: Florin Dumitrascu Signed-off-by: Stanislaw Kardach Signed-off-by: Alexandru Avadanii Signed-off-by: Dan Andresan --- .../puppet/modules/opendaylight/manifests/init.pp | 8 ++++++ .../modules/opendaylight/manifests/install.pp | 3 ++ .../modules/opendaylight/manifests/leveldbjni.pp | 32 ++++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 deployment_scripts/puppet/modules/opendaylight/manifests/leveldbjni.pp diff --git a/deployment_scripts/puppet/modules/opendaylight/manifests/init.pp b/deployment_scripts/puppet/modules/opendaylight/manifests/init.pp index 69cc23a..791ceba 100644 --- a/deployment_scripts/puppet/modules/opendaylight/manifests/init.pp +++ b/deployment_scripts/puppet/modules/opendaylight/manifests/init.pp @@ -9,4 +9,12 @@ class opendaylight { $odl_mgmt_ips = values($odl_mgmt_ips_hash) $odl_nodes_names = keys($odl_mgmt_ips_hash) $node_internal_address = $odl_mgmt_ips_hash["node-${node_uid}"] + + $arch = $::architecture ? { + 'aarch64' => $::osfamily ? { + 'Debian' => 'arm64', + default => 'aarch64', + }, + default => $::architecture, + } } diff --git a/deployment_scripts/puppet/modules/opendaylight/manifests/install.pp b/deployment_scripts/puppet/modules/opendaylight/manifests/install.pp index 2c3d776..22ab204 100644 --- a/deployment_scripts/puppet/modules/opendaylight/manifests/install.pp +++ b/deployment_scripts/puppet/modules/opendaylight/manifests/install.pp @@ -85,9 +85,12 @@ class opendaylight::install ( value => $enabled_features, } + include opendaylight::leveldbjni + Package['opendaylight'] -> Ini_setting <||> -> Firewall <||> -> + Class['opendaylight::leveldbjni'] -> File <||> ~> Service['opendaylight'] } diff --git a/deployment_scripts/puppet/modules/opendaylight/manifests/leveldbjni.pp b/deployment_scripts/puppet/modules/opendaylight/manifests/leveldbjni.pp new file mode 100644 index 0000000..71c3635 --- /dev/null +++ b/deployment_scripts/puppet/modules/opendaylight/manifests/leveldbjni.pp @@ -0,0 +1,32 @@ +# == Class opendaylight::leveldbjni +# +# Manages patching of JNI for leveldb on arm64. +# +# It fetches a prebuilt DEB package containing leveldbjni, +# patched so that it's properly detected by maven on arm64 systems. +# +# DEB: http://linux.enea.com/mos-repos/ubuntu/9.0/ \ +# pool/main/a/armband-odl-leveldb-fix/ +# JIRA: https://jira.opnfv.org/browse/ARMBAND-114 +# +class opendaylight::leveldbjni { + case $::osfamily { + 'Debian', 'Ubuntu': {} + default: { + fail('Not supported on OS other than Debian based.') + } + } + + if $::osfamily == 'Debian' and $::opendaylight::arch == 'arm64' and ! defined(Package['armband-odl-leveldb-fix']) { + exec {'hotfix-odl': + command => 'systemctl stop opendaylight; rm -rf /opt/opendaylight/data/cache', + onlyif => 'test 0 -eq $(dpkg -l | grep -c armband-odl-leveldb-fix)', + path => ['/bin', '/usr/bin'] + } + + package { 'armband-odl-leveldb-fix': + ensure => 'present', + require => Exec['hotfix-odl'] + } + } +}