Initial commit
This commit is contained in:
109
skills/list-components/list_components.py
Executable file
109
skills/list-components/list_components.py
Executable file
@@ -0,0 +1,109 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Script to fetch component names from Sippy component readiness API.
|
||||
|
||||
Usage:
|
||||
python3 list_components.py --release <release>
|
||||
|
||||
Example:
|
||||
python3 list_components.py --release 4.21
|
||||
python3 list_components.py --release 4.20
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import sys
|
||||
import urllib.request
|
||||
import urllib.error
|
||||
|
||||
|
||||
def fetch_components(release: str) -> list:
|
||||
"""
|
||||
Fetch component names from the component readiness API.
|
||||
|
||||
Args:
|
||||
release: The release version (e.g., "4.21", "4.20")
|
||||
|
||||
Returns:
|
||||
List of unique component names
|
||||
|
||||
Raises:
|
||||
urllib.error.URLError: If the request fails
|
||||
"""
|
||||
# Construct the view parameter (e.g., "4.21-main")
|
||||
view = f"{release}-main"
|
||||
|
||||
# Construct the URL
|
||||
url = f"https://sippy.dptools.openshift.org/api/component_readiness?view={view}"
|
||||
|
||||
print(f"Fetching components from: {url}", file=sys.stderr)
|
||||
|
||||
try:
|
||||
with urllib.request.urlopen(url, timeout=30) as response:
|
||||
if response.status == 200:
|
||||
data = json.loads(response.read().decode('utf-8'))
|
||||
|
||||
# Extract component names from rows
|
||||
components = []
|
||||
if 'rows' in data:
|
||||
for row in data['rows']:
|
||||
if 'component' in row and row['component']:
|
||||
components.append(row['component'])
|
||||
|
||||
# Return unique components, sorted alphabetically
|
||||
unique_components = sorted(set(components))
|
||||
|
||||
print(f"Found {len(unique_components)} unique components", file=sys.stderr)
|
||||
|
||||
return unique_components
|
||||
else:
|
||||
raise Exception(f"HTTP {response.status}: {response.reason}")
|
||||
except urllib.error.HTTPError as e:
|
||||
print(f"HTTP Error {e.code}: {e.reason}", file=sys.stderr)
|
||||
if e.code == 404:
|
||||
print(f"View '{view}' not found. Please check the release version.", file=sys.stderr)
|
||||
raise
|
||||
except urllib.error.URLError as e:
|
||||
print(f"URL Error: {e.reason}", file=sys.stderr)
|
||||
raise
|
||||
except Exception as e:
|
||||
print(f"Error: {e}", file=sys.stderr)
|
||||
raise
|
||||
|
||||
|
||||
def main():
|
||||
"""Main entry point for the script."""
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Fetch component names from Sippy component readiness API'
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
'--release',
|
||||
type=str,
|
||||
required=True,
|
||||
help='Release version (e.g., "4.21", "4.20")'
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
try:
|
||||
# Fetch components
|
||||
components = fetch_components(args.release)
|
||||
|
||||
# Output as JSON array
|
||||
output = {
|
||||
"release": args.release,
|
||||
"view": f"{args.release}-main",
|
||||
"component_count": len(components),
|
||||
"components": components
|
||||
}
|
||||
|
||||
print(json.dumps(output, indent=2))
|
||||
|
||||
except Exception as e:
|
||||
print(f"Failed to fetch components: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user