Skip to content
This repository has been archived by the owner on Feb 28, 2023. It is now read-only.

Commit

Permalink
Migrate from Travis, apply Black and more linters
Browse files Browse the repository at this point in the history
  • Loading branch information
JGoutin committed Jun 30, 2021
1 parent 97c108a commit 47b7778
Show file tree
Hide file tree
Showing 9 changed files with 174 additions and 69 deletions.
1 change: 1 addition & 0 deletions .ansible-lint
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
---
skip_list:
# Required to list with extra arguments
- '303'
4 changes: 4 additions & 0 deletions .flake8
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[flake8]
filename = *.py,src/
max-line-length = 88
extend-ignore = E203, E402
13 changes: 0 additions & 13 deletions .travis.yml

This file was deleted.

4 changes: 4 additions & 0 deletions .yamllint.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
extends: default
rules:
line-length: disable
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[![Build Status](https://travis-ci.org/Accelize/ansible-role-linux-kernel.svg?branch=master)](https://travis-ci.org/Accelize/ansible-role-ansible-drm)
[![Build Status](https://dev.azure.com/Accelize/DRM/_apis/build/status/Ansible%20-%20Linux%20Kernel?branchName=master)](https://dev.azure.com/Accelize/DRM/_build/latest?definitionId=26&branchName=master)

Linux Kernel Role
=================
Expand Down
100 changes: 100 additions & 0 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
---
name: Ansible Role Linux Kernel

trigger:
batch: true
branches:
include:
- master
tags:
include:
- "*"
paths:
exclude:
- "*.md"
- ".gitignore"
- "LICENSE"

pr: none

pool:
vmImage: ubuntu-20.04

jobs:
- job: tests
displayName: Tests
variables:
cacheDir: /tmp/.pipeline_cache
steps:

- checkout: self
fetchDepth: 1
path: ansible-role-linux-kernel # Must match role name in molecule/converge.yml

- task: Cache@2
inputs:
key: cache
path: $(cacheDir)
displayName: Cache packages

- script: |
echo "##vso[task.prependpath]$HOME/.local/bin"
pip install --disable-pip-version-check --cache-dir $(cacheDir)/.pip_packages -U ansible flake8 yamllint ansible-lint black bandit molecule-docker pytest-testinfra
displayName: Get dependencies
condition: always()
- script: flake8
displayName: Lint Python modules
condition: always()

- script: black . --check --diff
displayName: Check black style is applied
condition: always()

- script: bandit -r . -x ./molecule
displayName: Check Python security
condition: always()

- script: yamllint -s .
displayName: Lint YAML files
condition: always()

- script: ansible-lint .
displayName: Lint Ansible configuration
condition: always()

- script: molecule test
displayName: Test Ansible role
condition: always()
env:
ANSIBLE_STDOUT_CALLBACK: debug
ANSIBLE_FORCE_COLOR: "True"
ANSIBLE_NOCOLOR": "False"

- job:
displayName: Ansible Galaxy publish
dependsOn: tests
condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags'), ne(variables['Build.Reason'], 'Schedule'))
variables:
- group: ansibleGalaxy
steps:

- checkout: none

- script: ansible-galaxy role import --token $(AnsibleGalaxyToken) --role-name accelize.linux_kernel Accelize ansible-role-linux-kernel
displayName: Publish role to Ansible Galaxy

- task: GitHubRelease@1
displayName: Publish GitHub release
inputs:
gitHubConnection: Accelize-application
repositoryName: $(Build.Repository.Name)
action: create
target: $(Build.SourceVersion)
tagSource: gitTag
tagPattern: '[0-9]+\.[0-9]+\.[0-9]+'
isPreRelease: contains($(libraryVersion.version), '-')
releaseNotesSource: inline
releaseNotesInline: Role Available on Ansible galaxy.
changeLogCompareToRelease: lastFullRelease
changeLogType: commitBased
89 changes: 46 additions & 43 deletions filter_plugins/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,23 @@ def _rhel_kernel_info(packages, kernel_version, current_version):

# If current version match with required version, use this version
if current_version.startswith(kernel_version):
kernel_version = current_version.rsplit('.', 1)[0]
kernel_version = current_version.rsplit(".", 1)[0]

# List all available kernel version and associated repository
for line in packages['stdout'].splitlines():
if line.startswith('kernel.') and not line.startswith('kernel.src'):
for line in packages["stdout"].splitlines():
if line.startswith("kernel.") and not line.startswith("kernel.src"):
package = line.strip().split()
kernels.append(dict(version=package[1], repo=package[2]))

# Return more recent kernel version that match version requirement
for kernel in reversed(kernels):
if kernel['version'].startswith(kernel_version):
if kernel["version"].startswith(kernel_version):
return kernel

raise RuntimeError(
'No kernel matching to "%s". Available kernel versions: %s' % (
kernel_version,
', '.join(kernel['version'] for kernel in kernels)))
'No kernel matching to "%s". Available kernel versions: %s'
% (kernel_version, ", ".join(kernel["version"] for kernel in kernels))
)


def rhel_kernel(packages, kernel_version, current_version):
Expand All @@ -48,8 +48,7 @@ def rhel_kernel(packages, kernel_version, current_version):
Returns:
str: kernel version.
"""
return _rhel_kernel_info(
packages, kernel_version, current_version)['version']
return _rhel_kernel_info(packages, kernel_version, current_version)["version"]


def rhel_repo(packages, kernel_version, current_version):
Expand All @@ -64,8 +63,7 @@ def rhel_repo(packages, kernel_version, current_version):
Returns:
str: repository name
"""
return _rhel_kernel_info(
packages, kernel_version, current_version)['repo']
return _rhel_kernel_info(packages, kernel_version, current_version)["repo"]


def deb_kernel(packages, kernel_version, current_version):
Expand All @@ -87,16 +85,16 @@ def deb_kernel(packages, kernel_version, current_version):
kernel_version = current_version

# List all available kernel version and associated repository
for line in packages['stdout'].splitlines():
for line in packages["stdout"].splitlines():
line = line.strip()
if line.startswith('Package: ') and (
line.endswith('-common') or # Debian
line.endswith('-generic')): # Ubuntu
if line.startswith("Package: ") and (
line.endswith("-common") or line.endswith("-generic") # Debian
): # Ubuntu
kernel = line.split()[1]

for string in ('linux-headers-', 'common', 'generic'):
kernel = kernel.replace(string, '')
kernel = kernel.strip('-')
for string in ("linux-headers-", "common", "generic"):
kernel = kernel.replace(string, "")
kernel = kernel.strip("-")

if kernel:
kernels.add(kernel)
Expand All @@ -105,12 +103,11 @@ def deb_kernel(packages, kernel_version, current_version):
versions = {}
for kernel in kernels:
try:
version, build = kernel.split('-', 1)
version, build = kernel.split("-", 1)
except ValueError:
version = kernel
build = ''
versions[kernel] = list(
int(ver) for ver in version.split('.')) + [build]
build = ""
versions[kernel] = list(int(ver) for ver in version.split(".")) + [build]
kernels = sorted(versions.keys(), key=versions.get, reverse=True)

# Return more recent kernel package that match version requirement
Expand All @@ -119,8 +116,9 @@ def deb_kernel(packages, kernel_version, current_version):
return kernel

raise RuntimeError(
'No kernel matching to "%s". Available kernel versions: %s' % (
kernel_version, ', '.join(reversed(kernels))))
'No kernel matching to "%s". Available kernel versions: %s'
% (kernel_version, ", ".join(reversed(kernels)))
)


def _deb_kernel_package(kernel, dist, arch, name):
Expand All @@ -137,14 +135,14 @@ def _deb_kernel_package(kernel, dist, arch, name):
str: kernel package.
"""
# Define package suffix
if dist == 'Ubuntu':
suffix = 'generic'
elif name == 'linux-image':
suffix = arch.replace('x86_64', 'amd64')
if dist == "Ubuntu":
suffix = "generic"
elif name == "linux-image":
suffix = arch.replace("x86_64", "amd64")
else:
suffix = 'common'
suffix = "common"

return '-'.join((name, kernel, suffix))
return "-".join((name, kernel, suffix))


def deb_kernel_pkg(packages, kernel_version, current_version, dist, arch, name):
Expand All @@ -163,7 +161,8 @@ def deb_kernel_pkg(packages, kernel_version, current_version, dist, arch, name):
str: kernel package to install.
"""
return _deb_kernel_package(
deb_kernel(packages, kernel_version, current_version), dist, arch, name)
deb_kernel(packages, kernel_version, current_version), dist, arch, name
)


def deb_installed_kernel(installed, packages, kernel_version, current_version):
Expand All @@ -184,15 +183,17 @@ def deb_installed_kernel(installed, packages, kernel_version, current_version):

# Return installed package to remove
to_remove = []
for line in installed['stdout'].splitlines():
if ' linux-' not in line:
for line in installed["stdout"].splitlines():
if " linux-" not in line:
continue

package = line.split()[1]
if ((package.startswith('linux-image-') or
package.startswith('linux-headers-')) and not (
package.startswith('linux-image-' + to_keep) or
package.startswith('linux-headers-' + to_keep))):
if (
package.startswith("linux-image-") or package.startswith("linux-headers-")
) and not (
package.startswith("linux-image-" + to_keep)
or package.startswith("linux-headers-" + to_keep)
):
to_remove.append(package)

return to_remove
Expand All @@ -218,9 +219,11 @@ class FilterModule(object):
@staticmethod
def filters():
"""Return filter"""
return {'rhel_kernel': rhel_kernel,
'rhel_repo': rhel_repo,
'deb_kernel': deb_kernel,
'deb_kernel_pkg': deb_kernel_pkg,
'deb_installed_kernel': deb_installed_kernel,
'kernel_match': kernel_match}
return {
"rhel_kernel": rhel_kernel,
"rhel_repo": rhel_repo,
"deb_kernel": deb_kernel,
"deb_kernel_pkg": deb_kernel_pkg,
"deb_installed_kernel": deb_installed_kernel,
"kernel_match": kernel_match,
}
8 changes: 4 additions & 4 deletions molecule/default/molecule.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

dependency:
name: galaxy

driver:
name: docker
lint:
name: yamllint

platforms:
- name: centos_7
image: centos:7
Expand All @@ -15,6 +15,7 @@ platforms:
image: debian:buster
- name: ubuntu_bionic
image: ubuntu:bionic

provisioner:
name: ansible
lint:
Expand All @@ -30,7 +31,6 @@ provisioner:
kernel_version: 4.15.0-55
debian_buster:
kernel_version: 4.19.0

verifier:
name: testinfra
lint:
name: flake8
22 changes: 14 additions & 8 deletions molecule/default/tests/test_default.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,33 @@
import testinfra.utils.ansible_runner

testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')
os.environ["MOLECULE_INVENTORY_FILE"]
).get_hosts("all")


def test_packages_installed(host):
"""
Test that packages are installed
"""
installed = False
for name in ("kernel", "kernel-common",
"kernel-devel", "kernel-headers",
"linux-headers", "linux-image"):
for name in (
"kernel",
"kernel-common",
"kernel-devel",
"kernel-headers",
"linux-headers",
"linux-image",
):
package = host.package(name)
if not package.is_installed:
continue

version = '-'.join(ver for ver in (
package.version, package.release) if ver)
version = "-".join(ver for ver in (package.version, package.release) if ver)
assert version.startswith(
host.ansible.get_variables().get('kernel_version', ''))
host.ansible.get_variables().get("kernel_version", "")
)
installed = True

if not installed:
# Packages names does not match for Debian/Ubuntu packages
skip('No kernel package found')
skip("No kernel package found")

0 comments on commit 47b7778

Please sign in to comment.