Replace ``python-apt`` functionality

The ``python-apt`` package is a wrapper around the ``apt`` C++
library which is tightly connected to the version of the
distribution it is shipped on.

This in turn makes it incredibly hard to distribute as a wheel for
a charm that supports a large span of distro versions.

We do not want to rely on system installed Python packages but
distribute the direct charm dependencies as part of the charms
wheelhouse.

As the span of distributions we need to support with reactive
charms widens we will run into compability problems with the
current model.

For further reference see discussion in LP: #1824112 and
juju-solutions/layer-basic#135

Change-Id: I292dcba7cf2de18e53ae80339d07c6e1fe5c90fc
This commit is contained in:
Frode Nordahl 2019-07-23 17:48:26 +02:00
parent 032ae3dbe2
commit 9995c45ef6
No known key found for this signature in database
GPG Key ID: 6A5D59A3BA48373F
7 changed files with 13 additions and 44 deletions

View File

@ -24,7 +24,6 @@ from charms_openstack.charm.core import (
get_snap_version,
)
from charms_openstack.charm.utils import (
get_upstream_version,
is_data_changed,
)
import charms_openstack.adapters as os_adapters
@ -201,7 +200,7 @@ class OpenStackCharm(BaseOpenStackCharm,
else:
if not self.version_package:
self.version_package = self.packages[0]
version = get_upstream_version(
version = fetch.get_upstream_version(
self.version_package
)
if not version:

View File

@ -6,8 +6,6 @@ import os
import re
import subprocess
import apt_pkg as apt
import charmhelpers.contrib.openstack.templating as os_templating
import charmhelpers.contrib.openstack.utils as os_utils
import charmhelpers.core.hookenv as hookenv
@ -505,7 +503,7 @@ class BaseOpenStackCharm(object, metaclass=BaseOpenStackCharmMeta):
if not fatal:
return None
vers = apt.upstream_version(pkg.current_ver.ver_str)
vers = fetch.apt_pkg.upstream_version(pkg.current_ver.ver_str)
# x.y match only for 20XX.X
# and ignore patch level for other packages
match = re.match('^(\d+)\.(\d+)', vers)
@ -905,8 +903,8 @@ class BaseOpenStackCharmActions(object):
cur_vers = self.get_os_version_snap(snap)
else:
cur_vers = self.get_os_version_package(package)
apt.init()
return apt.version_compare(avail_vers, cur_vers) == 1
fetch.apt_pkg.init()
return fetch.apt_pkg.version_compare(avail_vers, cur_vers) == 1
def run_upgrade(self, interfaces_list=None):
"""Upgrade OpenStack.

View File

@ -2,29 +2,6 @@ import json
import hashlib
import charmhelpers.core as core
import charmhelpers.fetch as fetch
# TODO: drop once charmhelpers releases a new version
# with this function in the fetch helper (> 0.9.1)
def get_upstream_version(package):
"""Determine upstream version based on installed package
@returns None (if not installed) or the upstream version
"""
import apt_pkg
cache = fetch.apt_cache()
try:
pkg = cache[package]
except:
# the package is unknown to the current apt cache.
return None
if not pkg.current_ver:
# package is known, but no version is currently installed.
return None
return apt_pkg.upstream_version(pkg.current_ver.ver_str)
# TODO(AJK): Once this is in charms.reactive, drop it here and just reference

View File

@ -2,17 +2,13 @@ import sys
import mock
charmhelpers = None
apt_pkg = None
def mock_charmhelpers():
# Mock out charmhelpers so that we can test without it.
# also stops sideeffects from occuring.
global charmhelpers
global apt_pkg
charmhelpers = mock.MagicMock()
apt_pkg = mock.MagicMock()
sys.modules['apt_pkg'] = apt_pkg
sys.modules['charmhelpers'] = charmhelpers
sys.modules['charmhelpers.core'] = charmhelpers.core
sys.modules['charmhelpers.core.hookenv'] = charmhelpers.core.hookenv

View File

@ -17,9 +17,7 @@ import mock
import os
# mock out some charmhelpers libraries as they have apt install side effects
apt_pkg = mock.MagicMock()
charmhelpers = mock.MagicMock()
sys.modules['apt_pkg'] = apt_pkg
sys.modules['charmhelpers'] = charmhelpers
sys.modules['charmhelpers.core'] = charmhelpers.core
sys.modules['charmhelpers.core.decorators'] = charmhelpers.core.decorators

View File

@ -267,7 +267,7 @@ class TestMyOpenStackCharm(BaseOpenStackCharmTest):
def test_application_version_unspecified(self):
self.patch_object(chm.os_utils, 'os_release')
self.patch_object(chm, 'get_upstream_version',
self.patch_object(chm_core.charmhelpers.fetch, 'get_upstream_version',
return_value='1.2.3')
self.patch_object(chm.os_utils, 'snap_install_requested',
return_value=False)
@ -277,7 +277,7 @@ class TestMyOpenStackCharm(BaseOpenStackCharmTest):
def test_application_version_package(self):
self.patch_object(chm.os_utils, 'os_release')
self.patch_object(chm, 'get_upstream_version',
self.patch_object(chm_core.charmhelpers.fetch, 'get_upstream_version',
return_value='1.2.3')
self.patch_object(chm.os_utils, 'snap_install_requested',
return_value=False)
@ -295,7 +295,7 @@ class TestMyOpenStackCharm(BaseOpenStackCharmTest):
def test_application_version_dfs(self):
self.patch_object(chm.os_utils, 'os_release',
return_value='mitaka')
self.patch_object(chm, 'get_upstream_version',
self.patch_object(chm_core.charmhelpers.fetch, 'get_upstream_version',
return_value=None)
self.patch_object(chm.os_utils, 'snap_install_requested',
return_value=False)

View File

@ -765,7 +765,8 @@ class TestMyOpenStackCharm(BaseOpenStackCharmTest):
pkg_mock = mock.MagicMock()
self.apt_cache.return_value = {
'testpkg': pkg_mock}
self.patch_object(chm_core.apt, 'upstream_version')
self.patch_object(chm_core.charmhelpers.fetch.apt_pkg,
'upstream_version')
self.patch_object(chm_core.os_utils, 'snap_install_requested',
return_value=False)
self.upstream_version.return_value = '3.0.0~b1'
@ -800,7 +801,7 @@ class TestMyOpenStackCharm(BaseOpenStackCharmTest):
def test_openstack_upgrade_available_package(self):
self.patch_target('get_os_version_package')
self.patch_object(chm_core.os_utils, 'get_os_version_install_source')
self.patch_object(chm_core, 'apt')
self.patch_object(chm_core.charmhelpers.fetch, 'apt_pkg')
self.patch_target('config',
new={'openstack-origin': 'cloud:natty-folsom'})
self.patch_object(chm_core.os_utils, 'snap_install_requested',
@ -808,12 +809,12 @@ class TestMyOpenStackCharm(BaseOpenStackCharmTest):
self.get_os_version_package.return_value = 2
self.get_os_version_install_source.return_value = 3
self.target.openstack_upgrade_available(package='testpkg')
self.apt.version_compare.assert_called_once_with(3, 2)
self.apt_pkg.version_compare.assert_called_once_with(3, 2)
def test_openstack_upgrade_available_snap(self):
self.patch_target('get_os_version_snap')
self.patch_object(chm_core.os_utils, 'get_os_version_install_source')
self.patch_object(chm_core, 'apt')
self.patch_object(chm_core.charmhelpers.fetch, 'apt_pkg')
self.patch_target('config',
new={'openstack-origin': 'snap:ocata/stable'})
self.patch_object(chm_core.os_utils, 'snap_install_requested',
@ -822,7 +823,7 @@ class TestMyOpenStackCharm(BaseOpenStackCharmTest):
self.get_os_version_install_source.return_value = 3
self.target.openstack_upgrade_available(snap='testsnap')
self.get_os_version_snap.assert_called_once_with('testsnap')
self.apt.version_compare.assert_called_once_with(3, 2)
self.apt_pkg.version_compare.assert_called_once_with(3, 2)
def test_upgrade_if_available(self):
self.patch_target('run_upgrade')