Linux Foundation Release Engineering Tools
Project description
LF Tools UV
This project's documentation is available on ReadTheDocs (RTD) and GitHub Pages:
- Official Documentation: https://lftools-uv.readthedocs.io
- GitHub Pages: https://modeseven-lfit.github.io/lftools-uv/
LF Tools UV is a collection of scripts and utilities that are useful to Linux Foundation projects' CI and Releng related activities. We try to create these tools to be as generic as possible such that they are reusable in other CI environments.
CLI Interface
lftools-uv uses Typer as the CLI library. For CI/CD environments that
require the previous Click-based output format, use LEGACY_CLI=1.
Installation
Using uv (Recommended)
This project uses uv for fast Python package management.
-
Install uv:
curl -LsSf https://astral.sh/uv/install.sh | sh
-
Install lftools-uv:
uv pip install lftools-uv
-
Or install with all extras for development:
uv pip install "lftools-uv[all]"
Using pip
pip install lftools-uv
Configuration
lftools uses configuration files in the standard ~/.config/lftools/
directory for Jenkins, OpenStack, and other service credentials.
Quick Setup
Use the setup helper to create example configuration files:
# Clone the repository first (if not already done)
git clone https://github.com/lfit/lftools-uv.git
cd lftools-uv
# Run the configuration setup helper
./scripts/setup-config.sh
This creates:
~/.config/lftools/jenkins_job.ini- Jenkins server configurations~/.config/lftools/clouds.yaml- OpenStack cloud configurations
Manual Configuration
Create the configuration directory:
mkdir -p ~/.config/lftools
Copy and customize the example files:
# Jenkins configuration
cp etc/lftools/jenkins_job.ini.example ~/.config/lftools/jenkins_job.ini
# Edit with your Jenkins credentials
# OpenStack configuration
cp etc/lftools/clouds.yaml.example ~/.config/lftools/clouds.yaml
# Edit with your OpenStack credentials
Testing Configuration
Test your configuration with basic commands:
# Test Jenkins connectivity
lftools jenkins -s onap-prod plugins list
# Test OpenStack connectivity
lftools openstack --os-cloud production image list
# Run comprehensive functional tests (see Functional Testing section below)
./scripts/run_functional_tests.sh
For detailed configuration instructions, see: docs/configuration.md
Functional Testing
The repository includes a comprehensive functional test harness that validates lftools-uv commands against real infrastructure (Jenkins, OpenStack, Nexus, GitHub, etc.).
Basic Usage
# Run all Category 1 (safe/read-access) tests
./scripts/run_functional_tests.sh
# Run with debug output (shows command output to terminal)
./scripts/run_functional_tests.sh debug
# Filter tests by substring
TEST_FILTER=jenkins ./scripts/run_functional_tests.sh
# Run specific category with debug output
TEST_CATEGORY=1 DEBUG=1 ./scripts/run_functional_tests.sh
Configuration Requirements
The functional tests work with standard lftools configuration files:
Jenkins Tests
- File:
~/.config/lftools/jenkins_job.ini - Environment:
JENKINS_URL,LFTOOLS_USERNAME,LFTOOLS_PASSWORD - Default: Uses
jenkins.onap.org(read-access operations)
OpenStack Tests
- File:
~/.config/lftools/clouds.yaml - Environment:
OS_CLOUD(default:ecompci) - Required: Valid OpenStack credentials for cloud operations
Nexus Tests
- Environment:
NEXUS2_FQDN(default:nexus.onap.org),NEXUS3_FQDN(default:nexus3.onap.org) - Operations: Read-access repository queries
GitHub Tests
- Environment:
GITHUB_ORG(default:onap),GITHUB_TOKEN - File: Can use lftools config for token storage
Test Categories
- Category 1: Safe, read-access operations (default)
- Category 2: Reversible operations (disabled by default)
- Category 3: Destructive operations (disabled by default)
Advanced Options
# Environment variables
TEST_CATEGORY=1,2 # Run two categories
TEST_FILTER=openstack # Filter by substring
STOP_ON_FAILURE=1 # Stop after first failure
DRY_RUN=1 # Show what would run
DEBUG=1 # Show command output
VERBOSE=1 # More logging
OUTPUT_FORMAT=json # JSON output format
# Examples
TEST_FILTER=nexus DEBUG=1 ./scripts/run_functional_tests.sh
STOP_ON_FAILURE=1 ./scripts/run_functional_tests.sh debug
Debug Mode
Debug mode displays actual command output to the terminal while tests run:
# Enable debug mode
./scripts/run_functional_tests.sh debug
DEBUG=1 ./scripts/run_functional_tests.sh
# Debug specific tests
TEST_FILTER=openstack ./scripts/run_functional_tests.sh debug
```text
**Debug Output Example:**
```text
2025-09-20T09:12:32Z [INFO] DEBUG mode active (displaying command output)
2025-09-20T09:12:32Z [INFO] Running (1) core.version - Show lftools-uv version
2025-09-20T09:12:32Z [INFO] === Command Output for core.version ===
lftools-uv 0.1.5.dev2
2025-09-20T09:12:32Z [INFO] === End Output for core.version ===
2025-09-20T09:12:32Z [OK] PASS core.version (0 ms)
Log Files
Test output is always logged to files regardless of debug mode:
- Location:
.functional_logs/directory - Format:
{test_id}.logfiles - Content: Complete command output for analysis
Quick Setup for Testing
# 1. Set up configuration files
./scripts/setup-config.sh
# 2. Run some basic tests
TEST_FILTER=core ./scripts/run_functional_tests.sh debug
# 3. Test specific functionality
TEST_FILTER=jenkins ./scripts/run_functional_tests.sh debug
TEST_FILTER=openstack ./scripts/run_functional_tests.sh debug
# 4. Run all safe tests
./scripts/run_functional_tests.sh
Most tests pass with default ONAP/ECOMPCI configurations, making it easy to verify your lftools-uv installation and basic connectivity.
Using uvx for CI/CD (Recommended)
uvx is ideal for CI/CD environments and one-off executions where you want to run lftools-uv without affecting the existing Python environment. It creates an isolated virtual environment for each execution, preventing dependency conflicts with other tools in your pipeline.
uvx Basic Usage
Run lftools-uv commands directly without installation:
# Basic command execution
uvx lftools-uv version
# Run with help
uvx lftools-uv --help
Using Optional Dependencies
When using features that require optional dependencies (like LDAP or OpenStack), you need to specify the extras:
# For LDAP functionality - note the quotes to prevent shell expansion
uvx "lftools-uv[ldap]" ldap --help
# For OpenStack functionality
uvx "lftools-uv[openstack]" openstack --help
# Combined extras
uvx "lftools-uv[ldap,openstack]" --help
# All extras for full functionality
uvx "lftools-uv[all]" --help
Alternative uvx Syntax
You can also use the --from flag for clarity:
# Same as the above
uvx --from "lftools-uv[ldap]" lftools-uv ldap csv mygroup
uvx --from "lftools-uv[openstack]" lftools-uv openstack --help
CI/CD Pipeline Examples
GitHub Actions:
- name: Deploy artifacts with lftools-uv
run: |
uvx lftools-uv deploy nexus-zip \
--nexus-url ${{ secrets.NEXUS_URL }} \
--nexus-repo releases \
./artifacts/*.zip
GitLab CI:
deploy:
script:
- uvx "lftools-uv[all]" deploy logs --help
- uvx lftools-uv sign sigul ./artifacts/
Jenkins Pipeline:
pipeline {
agent any
stages {
stage('Deploy') {
steps {
sh 'uvx lftools-uv version'
sh 'uvx "lftools-uv[ldap]" ldap csv project-committers'
}
}
}
}
Benefits of uvx in CI/CD
- Isolation: No interference with existing Python packages in the CI environment
- Speed: Automatic caching of environments between runs
- Consistency: Same tool version across different pipeline stages
- No Setup: No need to manage virtual environments or installations
- Clean: Environments are automatically cleaned up after execution
Development Setup
Prerequisites
- Python 3.8+
- uv (recommended) or pip
Quick Start with uv
-
Clone the repository:
git clone https://github.com/lfit/lftools-uv.git cd lftools-uv
-
Install development dependencies:
make install-dev # or manually: uv sync --extra dev --extra test --extra docs --extra ldap --extra openstack
-
Run tests:
make test # or manually: uv run pytest
-
Format and lint code:
make format make lint
Available Make Targets
make help- Show all available targetsmake install- Install project dependenciesmake install-dev- Install with all development dependenciesmake test- Run testsmake lint- Run lintingmake format- Format codemake build- Build packagemake docs- Build documentationmake clean- Clean build artifactsmake all- Run full development pipeline
Ubuntu Dependencies
For development on Ubuntu, you may need:
- build-essential
- python3-dev
- libldap2-dev
- libsasl2-dev
- libssl-dev
Repository Information
Development Repository
For development and testing, we maintain this project at:
- Development:
https://github.com/modeseven-lfit/lftools-uv.git
Production Repository
Once tested and approved, we publish releases from:
- Production:
https://github.com/lfit/lftools-uv.git
Local Git Setup
Configure your local git remote for the development repository:
git remote -v
# origin https://github.com/modeseven-lfit/lftools-uv.git (fetch)
# origin https://github.com/modeseven-lfit/lftools-uv.git (push)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file lftools_uv-0.1.6.tar.gz.
File metadata
- Download URL: lftools_uv-0.1.6.tar.gz
- Upload date:
- Size: 198.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b1049293a1aec0ffa4b52e7b037259548297d22bc6811b35253a3bbe95de5c11
|
|
| MD5 |
08e7dfcf4416553ca1ab4f2f8c3c2602
|
|
| BLAKE2b-256 |
d6516122b24d4b039de4721450cf7f0cd6b13d7b8e1bcc22d45ffcecc973a3c6
|
Provenance
The following attestation bundles were made for lftools_uv-0.1.6.tar.gz:
Publisher:
build-test-release.yaml on modeseven-lfit/lftools-uv
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lftools_uv-0.1.6.tar.gz -
Subject digest:
b1049293a1aec0ffa4b52e7b037259548297d22bc6811b35253a3bbe95de5c11 - Sigstore transparency entry: 929950036
- Sigstore integration time:
-
Permalink:
modeseven-lfit/lftools-uv@2d5a8764ae8760377f713b70c68fcc3eecbda676 -
Branch / Tag:
refs/tags/v0.1.6 - Owner: https://github.com/modeseven-lfit
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-test-release.yaml@2d5a8764ae8760377f713b70c68fcc3eecbda676 -
Trigger Event:
push
-
Statement type:
File details
Details for the file lftools_uv-0.1.6-py3-none-any.whl.
File metadata
- Download URL: lftools_uv-0.1.6-py3-none-any.whl
- Upload date:
- Size: 202.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d1f3ab5b6e8de248926acc000ee546b7c42195fb7aefe07ff1acb40d7dfd3701
|
|
| MD5 |
35b3847aa935311b3e1cb1f7bdc6e98e
|
|
| BLAKE2b-256 |
6650a426a89f434d1be353df68b0c850ef3286b2ab153040e8c3f09ee73a1e6b
|
Provenance
The following attestation bundles were made for lftools_uv-0.1.6-py3-none-any.whl:
Publisher:
build-test-release.yaml on modeseven-lfit/lftools-uv
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lftools_uv-0.1.6-py3-none-any.whl -
Subject digest:
d1f3ab5b6e8de248926acc000ee546b7c42195fb7aefe07ff1acb40d7dfd3701 - Sigstore transparency entry: 929950039
- Sigstore integration time:
-
Permalink:
modeseven-lfit/lftools-uv@2d5a8764ae8760377f713b70c68fcc3eecbda676 -
Branch / Tag:
refs/tags/v0.1.6 - Owner: https://github.com/modeseven-lfit
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-test-release.yaml@2d5a8764ae8760377f713b70c68fcc3eecbda676 -
Trigger Event:
push
-
Statement type: