From 47b77782f8d6c2d93db3c789e751da660912514b Mon Sep 17 00:00:00 2001 From: jgoutin Date: Wed, 30 Jun 2021 10:10:47 +0200 Subject: [PATCH] Migrate from Travis, apply Black and more linters --- .ansible-lint | 1 + .flake8 | 4 + .travis.yml | 13 ---- .yamllint.yaml | 4 + README.md | 2 +- azure-pipelines.yml | 100 +++++++++++++++++++++++++ filter_plugins/main.py | 89 +++++++++++----------- molecule/default/molecule.yml | 8 +- molecule/default/tests/test_default.py | 22 ++++-- 9 files changed, 174 insertions(+), 69 deletions(-) create mode 100644 .flake8 delete mode 100644 .travis.yml create mode 100644 .yamllint.yaml create mode 100644 azure-pipelines.yml diff --git a/.ansible-lint b/.ansible-lint index 405d644..7cdf6d5 100644 --- a/.ansible-lint +++ b/.ansible-lint @@ -1,3 +1,4 @@ +--- skip_list: # Required to list with extra arguments - '303' diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..0f47db6 --- /dev/null +++ b/.flake8 @@ -0,0 +1,4 @@ +[flake8] +filename = *.py,src/ +max-line-length = 88 +extend-ignore = E203, E402 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 4684730..0000000 --- a/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -sudo: required -language: python -services: docker - -install: - - pip install molecule[docker] --pre - -script: - - molecule test - -notifications: - webhooks: https://galaxy.ansible.com/api/v1/notifications/ diff --git a/.yamllint.yaml b/.yamllint.yaml new file mode 100644 index 0000000..cc55376 --- /dev/null +++ b/.yamllint.yaml @@ -0,0 +1,4 @@ +--- +extends: default +rules: + line-length: disable diff --git a/README.md b/README.md index 0c7efc8..b8792f6 100644 --- a/README.md +++ b/README.md @@ -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 ================= diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 0000000..2909f7c --- /dev/null +++ b/azure-pipelines.yml @@ -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 diff --git a/filter_plugins/main.py b/filter_plugins/main.py index ef8bf3e..a7e9419 100644 --- a/filter_plugins/main.py +++ b/filter_plugins/main.py @@ -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): @@ -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): @@ -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): @@ -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) @@ -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 @@ -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): @@ -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): @@ -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): @@ -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 @@ -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, + } diff --git a/molecule/default/molecule.yml b/molecule/default/molecule.yml index dccf6a8..b4e4336 100644 --- a/molecule/default/molecule.yml +++ b/molecule/default/molecule.yml @@ -2,10 +2,10 @@ dependency: name: galaxy + driver: name: docker -lint: - name: yamllint + platforms: - name: centos_7 image: centos:7 @@ -15,6 +15,7 @@ platforms: image: debian:buster - name: ubuntu_bionic image: ubuntu:bionic + provisioner: name: ansible lint: @@ -30,7 +31,6 @@ provisioner: kernel_version: 4.15.0-55 debian_buster: kernel_version: 4.19.0 + verifier: name: testinfra - lint: - name: flake8 diff --git a/molecule/default/tests/test_default.py b/molecule/default/tests/test_default.py index 3547592..67efae1 100644 --- a/molecule/default/tests/test_default.py +++ b/molecule/default/tests/test_default.py @@ -4,7 +4,8 @@ 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): @@ -12,19 +13,24 @@ 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")