Make frozenage less reliant on changing _frozenlinks

The mtime of a file in OBS is the time this content was created for the
first time. As such if the target project isn't moving for a week,
staging select will keep asking you to freeze - even if you just froze.

So instead of relying on OBS to tell the true mtime, set an attribute
in the staging project and read from it. This also gives a way to check
in the webui for the last freeze time

Fixes #2462
This commit is contained in:
Stephan Kulow 2022-03-03 18:09:57 +01:00
parent 003f010579
commit 66b778144f
3 changed files with 14 additions and 0 deletions

5
dist/obs/OSRT:FreezeTime.xml vendored Normal file
View File

@ -0,0 +1,5 @@
<definition name="FreezeTime" namespace="OSRT">
<description>Date and time of the last call of freeze (updating _frozenlinks)</description>
<count>1</count>
<modifiable_by role="maintainer"/>
</definition>

View File

@ -1,7 +1,9 @@
import time import time
from datetime import datetime, timezone
from urllib.error import HTTPError from urllib.error import HTTPError
from lxml import etree as ET from lxml import etree as ET
import osc.core import osc.core
from osclib.core import attribute_value_save
MAX_FROZEN_AGE = 6.5 MAX_FROZEN_AGE = 6.5
@ -197,6 +199,7 @@ class FreezeCommand(object):
url = self.api.makeurl(['source', self.prj, '_project', '_frozenlinks'], {'meta': '1'}) url = self.api.makeurl(['source', self.prj, '_project', '_frozenlinks'], {'meta': '1'})
self.api.retried_PUT(url, ET.tostring(flink)) self.api.retried_PUT(url, ET.tostring(flink))
attribute_value_save(self.api.apiurl, self.prj, 'FreezeTime', datetime.now(timezone.utc).isoformat())
def receive_sources(self, prj, sources, flink): def receive_sources(self, prj, sources, flink):
url = self.api.makeurl(['source', prj], {'view': 'info', 'nofilename': '1'}) url = self.api.makeurl(['source', prj], {'view': 'info', 'nofilename': '1'})

View File

@ -879,6 +879,12 @@ class StagingAPI(object):
:param project: project to check :param project: project to check
:return age in days(float) of the last update :return age in days(float) of the last update
""" """
freezetime = attribute_value_load(self.apiurl, project, 'FreezeTime')
if freezetime:
freezetime = datetime.fromisoformat(freezetime)
tz_info = freezetime.tzinfo
return (datetime.now(tz_info) - freezetime).total_seconds() / 3600 / 24
# fallback: old method
root = ET.fromstring(self._fetch_project_meta(project)) root = ET.fromstring(self._fetch_project_meta(project))
for entry in root.findall('entry'): for entry in root.findall('entry'):
if entry.get('name') == '_frozenlinks': if entry.get('name') == '_frozenlinks':