Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ART-8472: make in fight not required #316

Merged
merged 9 commits into from
Jan 29, 2024
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
1 change: 1 addition & 0 deletions artcommon/artcommonlib/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
RHCOS_RELEASES_BASE_URL = "https://releases-rhcos-art.apps.ocp-virt.prod.psi.redhat.com/storage/releases"
BREW_HUB = "https://brewhub.engineering.redhat.com/brewhub"
BREW_DOWNLOAD_URL = "https://download.eng.bos.redhat.com/brewroot"
RELEASE_SCHEDULES = "https://pp.engineering.redhat.com/api/v7/releases"
67 changes: 66 additions & 1 deletion artcommon/artcommonlib/util.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import re
from typing import OrderedDict, Optional
from datetime import datetime
from artcommonlib.constants import RELEASE_SCHEDULES
import requests
import re


def remove_prefix(s: str, prefix: str) -> str:
Expand Down Expand Up @@ -85,6 +88,58 @@ def merge_objects(a, b):
return c


def is_future_release_date(date_str):
"""
If the input date is in future then return True elase False
"""
try:
target_date = datetime.strptime(date_str, "%Y-%m-%d")
except ValueError:
return False
current_date = datetime.now()
if target_date > current_date:
return True
else:
return False


def get_assembly_release_date(assembly, group):
"""
Get assembly release release date from release schedule API
"""
assembly_release_date = None
release_schedules = requests.get(f'{RELEASE_SCHEDULES}/{group}.z/?fields=all_ga_tasks', headers={'Accept': 'application/json'})
for release in release_schedules.json()['all_ga_tasks']:
if assembly in release['name']:
assembly_release_date = datetime.strptime(release['date_start'], "%Y-%m-%d").strftime("%Y-%b-%d")
break
return assembly_release_date


def get_inflight(assembly, group):
"""
Get inflight release name from current assembly release
"""
inflight_release = None
assembly_release_date = get_assembly_release_date(assembly, group)
if not assembly_release_date:
raise ValueError(f'Assembly release date not found for {assembly}')
major, minor = get_ocp_version_from_group(group)
release_schedules = requests.get(f'{RELEASE_SCHEDULES}/openshift-{major}.{minor-1}.z/?fields=all_ga_tasks', headers={'Accept': 'application/json'})
for release in release_schedules.json()['all_ga_tasks']:
is_future = is_future_release_date(release['date_start'])
if is_future:
thegreyd marked this conversation as resolved.
Show resolved Hide resolved
days_diff = abs((datetime.strptime(assembly_release_date, "%Y-%m-%d") - datetime.strptime(release['date_start'], "%Y-%m-%d")).days)
if days_diff <= 5: # if next Y-1 release and assembly release in the same week
match = re.search(r'\d+\.\d+\.\d+', release['name'])
if match:
inflight_release = match.group()
break
else:
raise ValueError(f"Didn't find in_inflight release in {release['name']}")
return inflight_release


def isolate_rhel_major_from_version(version: str) -> Optional[int]:
"""
E.g. '9.2' => 9
Expand All @@ -94,3 +149,13 @@ def isolate_rhel_major_from_version(version: str) -> Optional[int]:
if match:
return int(match[1])
return None


def get_ocp_version_from_group(group):
"""
Extract ocp version from group value openshift-4.15 --> 4, 15
"""
match = re.fullmatch(r"openshift-(\d+).(\d+)", group)
if not match:
raise ValueError(f"Invalid group name: {group}")
return int(match[1]), int(match[2])
6 changes: 2 additions & 4 deletions pyartcd/pyartcd/pipelines/build_microshift.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import click

from artcommonlib.arch_util import brew_arch_for_go_arch
from artcommonlib.util import get_ocp_version_from_group
from doozerlib.assembly import AssemblyTypes
from doozerlib.util import isolate_nightly_name_components
from ghapi.all import GhApi
Expand Down Expand Up @@ -54,10 +55,7 @@ def __init__(self, runtime: Runtime, group: str, assembly: str, payloads: Tuple[
self.slack_client.bind_channel(group)

# determines OCP version
match = re.fullmatch(r"openshift-(\d+).(\d+)", group)
if not match:
raise ValueError(f"Invalid group name: {group}")
self._ocp_version = (int(match[1]), int(match[2]))
self._ocp_version = get_ocp_version_from_group(group)

# sets environment variables for Elliott and Doozer
self._elliott_env_vars = os.environ.copy()
Expand Down
6 changes: 3 additions & 3 deletions pyartcd/pyartcd/pipelines/gen_assembly.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import click
from ghapi.all import GhApi

from artcommonlib.util import split_git_url, merge_objects
from artcommonlib.util import split_git_url, merge_objects, get_inflight
from pyartcd import exectools, constants, jenkins
from pyartcd.cli import cli, click_coroutine, pass_runtime
from pyartcd.git import GitRepository
Expand Down Expand Up @@ -43,7 +43,7 @@ def __init__(self, runtime: Runtime, group: str, assembly: str, data_path: str,
self.auto_trigger_build_sync = auto_trigger_build_sync
self.custom = custom
self.arches = arches
self.in_flight = in_flight
self.in_flight = in_flight if in_flight else get_inflight(assembly, group)
thegreyd marked this conversation as resolved.
Show resolved Hide resolved
self.previous_list = previous_list
self.auto_previous = auto_previous
self.pre_ga_mode = pre_ga_mode
Expand Down Expand Up @@ -91,7 +91,7 @@ async def run(self):
pr = await self._create_or_update_pull_request(assembly_definition)

# Sends a slack message
message = f"Hi @release-artists , please review assembly definition for {self.assembly}: {pr.html_url}"
message = f"Hi @release-artists , please review assembly definition for {self.assembly}: {pr.html_url}\n\nthe inflight release is {self.in_flight}"
await self._slack_client.say(message, slack_thread)

except Exception as err:
Expand Down
6 changes: 4 additions & 2 deletions pyartcd/pyartcd/pipelines/prepare_release.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from ruamel.yaml import YAML
from tenacity import retry, stop_after_attempt, wait_fixed

from artcommonlib.util import get_assembly_release_date
from doozerlib.assembly import AssemblyTypes
from elliottlib.assembly import assembly_group_config
from elliottlib.errata import set_blocking_advisory, get_blocking_advisories
Expand Down Expand Up @@ -85,7 +86,7 @@ def __init__(
if default_advisories:
raise ValueError("default_advisories cannot be set for a non-stream assembly.")

self.release_date = date
self.release_date = date if date else get_assembly_release_date(assembly, group)
self.package_owner = package_owner or self.runtime.config["advisory"]["package_owner"]
self._slack_client = slack_client
self.working_dir = self.runtime.working_dir.absolute()
Expand Down Expand Up @@ -148,6 +149,7 @@ async def run(self):
for ad in advisories:
if advisories[ad] < 0:
advisories[ad] = self.create_advisory(advisory_type=advisory_type, art_advisory_key=ad)
await self._slack_client.say_in_thread(f"Advisories created with release date {self.release_date}")

await self.set_advisory_dependencies(advisories)

Expand Down Expand Up @@ -711,7 +713,7 @@ async def verify_attached_operators(self, *advisories: List[int], gather_depende
help="The name of an assembly to rebase & build for. e.g. 4.9.1")
@click.option("--name", metavar="RELEASE_NAME",
help="release name (e.g. 4.6.42)")
@click.option("--date", metavar="YYYY-MMM-DD", required=True,
@click.option("--date", metavar="YYYY-MMM-DD",
help="Expected release date (e.g. 2020-11-25)")
@click.option("--package-owner", metavar='EMAIL',
help="Advisory package owner; Must be an individual email address; May be anyone who wants random advisory spam")
Expand Down
6 changes: 2 additions & 4 deletions pyartcd/pyartcd/pipelines/rebuild.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import yaml
from aioredlock import LockError
from doozerlib.assembly import AssemblyTypes
from artcommonlib.util import get_ocp_version_from_group
from pyartcd import constants, exectools, locks, jenkins
from pyartcd.cli import cli, click_coroutine, pass_runtime
from pyartcd.record import parse_record_log
Expand Down Expand Up @@ -52,10 +53,7 @@ def __init__(self, runtime: Runtime, group: str, assembly: str,
self.ocp_build_data_url = ocp_build_data_url

# determines OCP version
match = re.fullmatch(r"openshift-(\d+).(\d+)", group)
if not match:
raise ValueError(f"Invalid group name: {group}")
self._ocp_version = (int(match[1]), int(match[2]))
self._ocp_version = get_ocp_version_from_group(group)

# sets environment variables for Doozer
self._doozer_env_vars = os.environ.copy()
Expand Down
6 changes: 3 additions & 3 deletions pyartcd/tests/pipelines/test_gen_assembly.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def test_get_nightlies(self, cmd_gather_async: AsyncMock):
runtime = MagicMock()
pipeline = GenAssemblyPipeline(runtime, "openshift-4.12", "4.12.99", "https://example.com/ocp-build-data.git",
nightlies=(), allow_pending=False, allow_rejected=False,
allow_inconsistency=False, custom=False, arches=(), in_flight=None,
allow_inconsistency=False, custom=False, arches=(), in_flight="4.11.88",
previous_list=(), auto_previous=True, auto_trigger_build_sync=False,
pre_ga_mode="none")
actual = asyncio.run(pipeline._get_nightlies())
Expand Down Expand Up @@ -97,7 +97,7 @@ def test_create_or_update_pull_request(self, git_repo: MagicMock, yaml: MagicMoc
}})
pipeline = GenAssemblyPipeline(runtime, "openshift-4.12", "4.12.99", "https://example.com/ocp-build-data.git",
nightlies=(), allow_pending=False, allow_rejected=False,
allow_inconsistency=False, custom=False, arches=(), in_flight=None,
allow_inconsistency=False, custom=False, arches=(), in_flight="4.11.88",
previous_list=(), auto_previous=True, auto_trigger_build_sync=False,
pre_ga_mode="none")
pipeline._working_dir = Path("/path/to/working")
Expand Down Expand Up @@ -147,7 +147,7 @@ async def test_run(self, get_nightlies: AsyncMock, _gen_assembly_from_releases:

pipeline = GenAssemblyPipeline(runtime, "openshift-4.12", "4.12.99", "https://example.com/ocp-build-data.git",
nightlies=(), allow_pending=False, allow_rejected=False,
allow_inconsistency=False, custom=False, arches=(), in_flight=None,
allow_inconsistency=False, custom=False, arches=(), in_flight="4.11.88",
previous_list=(), auto_previous=True, auto_trigger_build_sync=False,
pre_ga_mode="none")
pipeline._working_dir = Path("/path/to/working")
Expand Down
Loading