def get_version(): """Derive Ceph release from an installed package.""" import apt_pkg as apt cache = apt_cache() package = "ceph" try: pkg = cache[package] except: # the package is unknown to the current apt cache. e = 'Could not determine version of package with no installation ' \ 'candidate: %s' % package error_out(e) if not pkg.current_ver: # package is known, but no version is currently installed. e = 'Could not determine version of uninstalled package: %s' % package error_out(e) vers = apt.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) if match: vers = match.group(0) return float(vers)
def get_package_version(package): cache = fetch.apt_cache() if package not in cache: return None pkgver = cache[package].current_ver if pkgver is not None: return pkgver.ver_str return None
def get_os_codename_package(package, fatal=True): '''Derive OpenStack release codename from an installed package.''' import apt_pkg as apt cache = apt_cache() try: pkg = cache[package] except: if not fatal: return None # the package is unknown to the current apt cache. e = 'Could not determine version of package with no installation '\ 'candidate: %s' % package error_out(e) if not pkg.current_ver: if not fatal: return None # package is known, but no version is currently installed. e = 'Could not determine version of uninstalled package: %s' % package error_out(e) vers = apt.upstream_version(pkg.current_ver.ver_str) if 'swift' in pkg.name: # Fully x.y.z match for swift versions match = re.match('^(\d+)\.(\d+)\.(\d+)', vers) else: # x.y match only for 20XX.X # and ignore patch level for other packages match = re.match('^(\d+)\.(\d+)', vers) if match: vers = match.group(0) # >= Liberty independent project versions if (package in PACKAGE_CODENAMES and vers in PACKAGE_CODENAMES[package]): return PACKAGE_CODENAMES[package][vers] else: # < Liberty co-ordinated project versions try: if 'swift' in pkg.name: return SWIFT_CODENAMES[vers] else: return OPENSTACK_CODENAMES[vers] except KeyError: if not fatal: return None e = 'Could not determine OpenStack codename for version %s' % vers error_out(e)
def cmp_pkgrevno(package, revno, pkgcache=None): '''Compare supplied revno with the revno of the installed package * 1 => Installed revno is greater than supplied arg * 0 => Installed revno is the same as supplied arg * -1 => Installed revno is less than supplied arg ''' import apt_pkg from charmhelpers.fetch import apt_cache if not pkgcache: pkgcache = apt_cache() pkg = pkgcache[package] return apt_pkg.version_compare(pkg.current_ver.ver_str, revno)
def cmp_pkgrevno(package, revno, pkgcache=None): '''Compare supplied revno with the revno of the installed package * 1 => Installed revno is greater than supplied arg * 0 => Installed revno is the same as supplied arg * -1 => Installed revno is less than supplied arg ''' import apt_pkg if not pkgcache: from charmhelpers.fetch import apt_cache pkgcache = apt_cache() pkg = pkgcache[package] return apt_pkg.version_compare(pkg.current_ver.ver_str, revno)
def get_os_codename_package(package, codenames, fatal=True): """Derive OpenStack release codename from an installed package. :param package: str Package name to lookup (ie. in apt cache) :param codenames: dict of OrderedDict eg (not applicable for snap pkgs) { 'pkg1': collections.OrderedDict([ ('2', 'mitaka'), ('3', 'newton'), ('4', 'ocata'), ]), 'pkg2': collections.OrderedDict([ ('12.6', 'mitaka'), ('13.2', 'newton'), ('14.7', 'ocata'), ]), } :param fatal: bool Raise exception if pkg not installed :returns: str OpenStack version name corresponding to package """ cache = fetch.apt_cache() try: pkg = cache[package] except KeyError: if not fatal: return None # the package is unknown to the current apt cache. e = ('Could not determine version of package with no installation ' 'candidate: {}'.format(package)) raise Exception(e) if not pkg.current_ver: if not fatal: return None vers = apt.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) if match: vers = match.group(0) # Generate a major version number for newer semantic # versions of openstack projects major_vers = vers.split('.')[0] if (package in codenames and major_vers in codenames[package]): return codenames[package][major_vers]
def cmp_pkgrevno(package, revno, pkgcache=None): """Compare supplied revno with the revno of the installed package. * 1 => Installed revno is greater than supplied arg * 0 => Installed revno is the same as supplied arg * -1 => Installed revno is less than supplied arg This function imports apt_cache function from charmhelpers.fetch if the pkgcache argument is None. Be sure to add charmhelpers.fetch if you call this function, or pass an apt_pkg.Cache() instance. """ import apt_pkg if not pkgcache: from charmhelpers.fetch import apt_cache pkgcache = apt_cache() pkg = pkgcache[package] return apt_pkg.version_compare(pkg.current_ver.ver_str, revno)
def cmp_pkgrevno(package, revno, pkgcache=None): """Compare supplied revno with the revno of the installed package * 1 => Installed revno is greater than supplied arg * 0 => Installed revno is the same as supplied arg * -1 => Installed revno is less than supplied arg This function imports apt_cache function from charmhelpers.fetch if the pkgcache argument is None. Be sure to add charmhelpers.fetch if you call this function, or pass an apt_pkg.Cache() instance. """ import apt_pkg if not pkgcache: from charmhelpers.fetch import apt_cache pkgcache = apt_cache() pkg = pkgcache[package] return apt_pkg.version_compare(pkg.current_ver.ver_str, revno)
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)
def ensure_compliance(self): cache = apt_cache() for p in self.pkgs: if p not in cache: continue pkg = cache[p] if not self.is_virtual_package(pkg): if not pkg.current_ver: log("Package '%s' is not installed." % pkg.name, level=DEBUG) continue else: log("Restricted package '%s' is installed" % pkg.name, level=WARNING) self.delete_package(cache, pkg) else: log("Checking restricted virtual package '%s' provides" % pkg.name, level=DEBUG) self.delete_package(cache, pkg)
def get_os_codename_package(package, fatal=True): '''Derive OpenStack release codename from an installed package.''' import apt_pkg as apt cache = apt_cache() try: pkg = cache[package] except: if not fatal: return None # the package is unknown to the current apt cache. e = 'Could not determine version of package with no installation '\ 'candidate: %s' % package error_out(e) if not pkg.current_ver: if not fatal: return None # package is known, but no version is currently installed. e = 'Could not determine version of uninstalled package: %s' % package error_out(e) vers = apt.upstream_version(pkg.current_ver.ver_str) try: if 'swift' in pkg.name: swift_vers = vers[:5] if swift_vers not in SWIFT_CODENAMES: # Deal with 1.10.0 upward swift_vers = vers[:6] return SWIFT_CODENAMES[swift_vers] else: vers = vers[:6] return OPENSTACK_CODENAMES[vers] except KeyError: e = 'Could not determine OpenStack codename for version %s' % vers error_out(e)
def determine_packages(): ''' Returns list of packages required to be installed alongside neutron to enable PLUMgrid in Openstack. ''' pkgs = [] for pkg in PG_PACKAGES: tag = '' if pkg == 'plumgrid-pythonlib': tag = config('plumgrid-build') elif (pkg == 'networking-plumgrid' and config('enable-deb-networking-install')): tag = config('networking-build') if tag == 'latest': pkgs.append(pkg) elif tag: if tag in [i.ver_str for i in apt_cache()[pkg].version_list]: pkgs.append('%s=%s' % (pkg, tag)) else: error_msg = \ "Build version '%s' for package '%s' not available" \ % (tag, pkg) raise ValueError(error_msg) return pkgs
def determine_packages(): ''' Returns list of packages required by PLUMgrid director as specified in the neutron_plugins dictionary in charmhelpers. ''' pkgs = [] tag = 'latest' for pkg in neutron_plugin_attribute('plumgrid', 'packages', 'neutron'): if 'plumgrid' in pkg: tag = config('plumgrid-build') elif pkg == 'iovisor-dkms': tag = config('iovisor-build') if tag == 'latest': pkgs.append(pkg) else: if tag in [i.ver_str for i in apt_cache()[pkg].version_list]: pkgs.append('%s=%s' % (pkg, tag)) else: error_msg = \ "Build version '%s' for package '%s' not available" \ % (tag, pkg) raise ValueError(error_msg) return pkgs
def determine_packages(): ''' Returns list of packages required by PLUMgrid Gateway as specified in the neutron_plugins dictionary in charmhelpers. ''' pkgs = [] tag = 'latest' for pkg in neutron_plugin_attribute('plumgrid', 'packages', 'neutron'): if 'plumgrid' in pkg: tag = config('plumgrid-build') elif pkg == 'iovisor-dkms': tag = config('iovisor-build') if tag == 'latest': pkgs.append(pkg) else: if tag in [i.ver_str for i in apt_cache()[pkg].version_list]: pkgs.append('%s=%s' % (pkg, tag)) else: error_msg = \ "Build version '%s' for package '%s' not available" \ % (tag, pkg) raise ValueError(error_msg) return pkgs
def get_pkg_version(name): from apt import apt_pkg pkg = apt_cache()[name] version = apt_pkg.upstream_version(pkg.current_ver.ver_str) return version
def get_pkg_version(name): pkg = apt_cache()[name] version = None if pkg.current_ver: version = apt_pkg.upstream_version(pkg.current_ver.ver_str) return version