Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ci/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,7 @@ The analyzer uses library modules organized under `ci/lib/`:
**ci/lib/prow-api.sh** - Prow deck API integration:
- Uses Prow deck API at `https://prow.ci.openshift.org/prowjobs.js` (publicly accessible, no auth required)
- `get_job_executions()` - Get recent job executions (count parameter, default: 1)
- `get_job_metadata()` - Fetch job details (status, timestamps)
- `get_job_metadata(job_id, [job_name])` - Fetch job details (status, timestamps); job_name optional (defaults to DEFAULT_JOB_NAME)
- `download_job_directory_gcs()` - Download entire job directory using `gcloud storage cp -r`
- `find_gap_analysis_reports()` - Find gap-analysis reports in downloaded artifacts directory

Expand Down
4 changes: 2 additions & 2 deletions ci/analyze-prow-failure.sh
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ main() {

# Get job metadata
local job_metadata
job_metadata=$(get_job_metadata "${job_id}")
job_metadata=$(get_job_metadata "${job_id}" "${job_name}")

if [ -n "${job_metadata}" ]; then
echo "${job_metadata}" | jq .
Expand Down Expand Up @@ -413,7 +413,7 @@ main() {

# Get job metadata
local job_metadata
job_metadata=$(get_job_metadata "${candidate_job_id}")
job_metadata=$(get_job_metadata "${candidate_job_id}" "${job_name}")

if [ -n "${job_metadata}" ]; then
echo "${job_metadata}" | jq .
Expand Down
60 changes: 48 additions & 12 deletions ci/lib/generate-fixes.py
Original file line number Diff line number Diff line change
Expand Up @@ -657,6 +657,42 @@ def generate_wif_template(version, output_dir):
return {'vanilla.yaml': wif_template}


def calculate_previous_version(target_minor):
"""
Calculate the previous version(s) for acknowledgment files.

Upgrade edges:
- 4.22 → 4.23 (normal)
- 4.22 → 5.0 (major version jump)
- 4.23 → 4.24 (normal)
- 4.23 → 5.1 (major version jump)
- 5.0 → 5.1 (normal within 5.x)
- 5.1 → 5.2 (normal)
- etc.

Args:
target_minor: Target version (e.g., "5.0", "5.1", "4.22")

Returns:
List of previous version strings (e.g., ["4.22"] for "5.0", ["4.23", "5.0"] for "5.1")
"""
parts = target_minor.split('.')
major = int(parts[0])
minor = int(parts[1])

# Special case: 5.0 comes after 4.22
if major == 5 and minor == 0:
return ["4.22"]

# Special case: 5.1 comes after BOTH 4.23 AND 5.0
if major == 5 and minor == 1:
return ["4.23", "5.0"]

# Normal case: subtract 1 from minor version
previous_minor = minor - 1
return [f"{major}.{previous_minor}"]


def generate_sts_ack_files(target_version):
"""
Generate STS acknowledgment files.
Expand All @@ -667,9 +703,9 @@ def generate_sts_ack_files(target_version):
"""
target_minor = extract_minor_version(target_version)

# Calculate baseline (target - 1)
parts = target_minor.split('.')
baseline_minor = f"{parts[0]}.{int(parts[1]) - 1}"
# Calculate baseline (target - 1) with special handling for major version transitions
baseline_versions = calculate_previous_version(target_minor)
versions_yaml = ', '.join([f'"{v}"' for v in baseline_versions])

files = {}

Expand All @@ -679,7 +715,7 @@ def generate_sts_ack_files(target_version):
matchExpressions:
- key: hive.openshift.io/version-major-minor
operator: In
values: ["{baseline_minor}"]
values: [{versions_yaml}]
- key: api.openshift.com/sts
operator: In
values: ["true"]
Expand Down Expand Up @@ -709,9 +745,9 @@ def generate_wif_ack_files(target_version):
"""
target_minor = extract_minor_version(target_version)

# Calculate baseline (target - 1)
parts = target_minor.split('.')
baseline_minor = f"{parts[0]}.{int(parts[1]) - 1}"
# Calculate baseline (target - 1) with special handling for major version transitions
baseline_versions = calculate_previous_version(target_minor)
versions_yaml = ', '.join([f'"{v}"' for v in baseline_versions])

files = {}

Expand All @@ -721,7 +757,7 @@ def generate_wif_ack_files(target_version):
matchExpressions:
- key: hive.openshift.io/version-major-minor
operator: In
values: ["{baseline_minor}"]
values: [{versions_yaml}]
- key: api.openshift.com/wif
operator: In
values: ["true"]
Expand Down Expand Up @@ -749,9 +785,9 @@ def generate_ocp_ack_files(target_version):
"""
target_minor = extract_minor_version(target_version)

# Calculate baseline (target - 1)
parts = target_minor.split('.')
baseline_minor = f"{parts[0]}.{int(parts[1]) - 1}"
# Calculate baseline (target - 1) with special handling for major version transitions
baseline_versions = calculate_previous_version(target_minor)
versions_yaml = ', '.join([f'"{v}"' for v in baseline_versions])

files = {}

Expand All @@ -761,7 +797,7 @@ def generate_ocp_ack_files(target_version):
matchExpressions:
- key: hive.openshift.io/version-major-minor
operator: In
values: ["{baseline_minor}"]
values: [{versions_yaml}]
"""
files['config.yaml'] = config_yaml

Expand Down
5 changes: 3 additions & 2 deletions ci/lib/prow-api.sh
Original file line number Diff line number Diff line change
Expand Up @@ -172,13 +172,14 @@ find_gap_analysis_reports() {
}

# Get job metadata (versions, timestamps)
# Args: $1 = job_id
# Args: $1 = job_id, $2 = job_name (optional)
# Returns: JSON object with metadata
get_job_metadata() {
local job_id="$1"
local job_name="${2:-${DEFAULT_JOB_NAME}}"
local job_details

job_details=$(get_job_execution "${job_id}")
job_details=$(get_job_execution "${job_id}" "${job_name}")

if [ -z "${job_details}" ] || [ "${job_details}" = "null" ]; then
echo "ERROR: Failed to fetch job details" >&2
Expand Down
4 changes: 2 additions & 2 deletions ci/lib/validate-wif-template.sh
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ while IFS= read -r ID; do
fi

# Correct format examples:
# role_name_v4.17 (custom names)
# role_name_v4.17 or role_name_v5.0 (custom names with v4 or v5 version)
# compute.storageAdmin (gcp permission format)
if [[ ! ( "$ID" =~ ^[a-z0-9_]+_v4\.[0-9]+$ || "$ID" =~ ^[a-zA-Z]+(\.[a-zA-Z]+)+(\.\*)?$ ) ]]; then
if [[ ! ( "$ID" =~ ^[a-z0-9_]+_v[45]\.[0-9]+$ || "$ID" =~ ^[a-zA-Z]+(\.[a-zA-Z]+)+(\.\*)?$ ) ]]; then
ERROR_MESSAGE+=$"ROLE: '$ID' wrong format.\n"
fi
done <<< "$ROLE_IDS"
Expand Down