<div dir="ltr"><div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Fri, Oct 19, 2018 at 3:46 PM Zane Bitter <<a href="mailto:zbitter@redhat.com">zbitter@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 19/10/18 12:30 PM, Clark Boylan wrote:<br>
> On Fri, Oct 19, 2018, at 8:17 AM, Zane Bitter wrote:<br>
>> Unit Tests<br>
>> ----------<br>
>><br>
>> For unit tests, the most important thing is to test on the versions of<br>
>> Python we target. It's less important to be using the exact distro that<br>
>> we want to target, because unit tests generally won't interact with<br>
>> stuff outside of Python.<br>
>><br>
>> I'd like to propose that we handle this by setting up a unit test<br>
>> template in openstack-zuul-jobs for each release. So for Stein we'd have<br>
>> openstack-python3-stein-jobs. This template would contain:<br>
> <br>
> Because zuul config is branch specific we could set up every project to use a `openstack-python3-jobs` template then define that template differently on each branch. This would mean you only have to update the location where the template is defined and not need to update every other project after cutting a stable branch. I would suggest we take advantage of that to reduce churn.<br>
<br>
There was a reason I didn't propose that approach: in practice you can't <br>
add a new gating test to a centralised zuul template definition. If you <br>
do, many projects will break because the change is not self-testing. At <br>
best you'll be pitchforked by an angry mob of people who can't get <br>
anything but py37 fixes through the gate, and at worst they'll all stop <br>
using the template to get unblocked and then never go back to it.<br>
<br>
We don't need everyone to cut over at the same time. We just need them <br>
to do it in the space of one release cycle. One patch every 6 months is <br>
not an excessive amount of churn.<br>
<br>
>> * A voting gate job for the highest minor version of py3 we want to<br>
>> support in that release.<br>
>> * A voting gate job for the lowest minor version of py3 we want to<br>
>> support in that release.<br>
>> * A periodic job for any interim minor releases.<br>
>> * (Starting late in the cycle) a non-voting check job for the highest<br>
>> minor version of py3 we want to support in the *next* release (if<br>
>> different), on the master branch only.<br>
>><br>
>> So, for example, (and this is still under active debate) for Stein we<br>
>> might have gating jobs for py35 and py37, with a periodic job for py36.<br>
>> The T jobs might only have voting py36 and py37 jobs, but late in the T<br>
>> cycle we might add a non-voting py38 job on master so that people who<br>
>> haven't switched to the U template yet can see what, if anything,<br>
>> they'll need to fix.<br>
>><br>
>> We'll run the unit tests on any distro we can find that supports the<br>
>> version of Python we want. It could be a non-LTS Ubuntu, Fedora, Debian<br>
>> unstable, whatever it takes. We won't wait for an LTS Ubuntu to have a<br>
>> particular Python version before trying to test it.<br>
>><br>
>> Before the start of each cycle, the TC would determine which range of<br>
>> versions we want to support, on the basis of the latest one we can find<br>
>> in any distro and the earliest one we're likely to need in one of the<br>
>> supported Linux distros. There will be a project-wide goal to switch the<br>
>> testing template from e.g. openstack-python3-stein-jobs to<br>
>> openstack-python3-treasure-jobs for every repo before the end of the<br>
>> cycle. We'll have goal champions as usual following up and helping teams<br>
>> with the process. We'll know where the problem areas are because we'll<br>
>> have added non-voting jobs for any new Python versions to the previous<br>
>> release's template.<br>
> <br>
> I don't know that this needs to be a project wide goal if you can just update the template on the master branch where the template is defined. Do that then every project is now running with the up to date version of the template. We should probably advertise when this is happening with some links to python version x.y breakages/features, but the process itself should be quick.<br>
<br>
Either way, it'll be project teams themselves fixing any broken tests <br>
due to a new version being added. So we can either have a formal <br>
project-wide goal where we project-manage that process across the space <br>
of a release, or a de-facto project-wide goal where we break everybody <br>
and then nothing gets merged until they fix it.<br>
<br>
> As for python version range selection I worry that that the criteria about relies on too much guesswork.<br>
<br>
Some guesswork is going to be inevitable, unfortunately, (we have no way <br>
of knowing what will be in CentOS 8, for example) but I agree that we <br>
should try to tighten up the criteria as much as possible.<br>
<br>
> I do think we should do our best to test future incoming versions of python even while not officially supporting them. We will have to support them at some point, either directly or via some later version that includes the changes from that intermediate version.<br>
<br>
+1, I think we should try to add support for higher versions as soon as <br>
possible. It may take a long time to get into an LTS release, but <br>
there's bound to be _some_ distro out there where people want to use it. <br>
(Case in point: Debian really wanted py37 support in Rocky, at which <br>
point a working 3.7 wasn't even available in _any_ Ubuntu release, let <br>
alone an LTS). That's why I said "the latest one we can find in any <br>
distro" - if we have any way to test it at all then we should.<br>
<br>
> Could the criteria be:<br>
> Support the lowest version of python on a supported distro release and the highest version of python on a supported distro<br>
<br>
As of now we can't objectively determine the minimum version because it <br>
isn't the future yet. That may change once every distro is on Python 3 <br>
though.<br>
<br>
> and test (but not support so we can drop testing for this python version on stable branches) the current latest release of python?<br>
<br>
That's certainly worth considering; we could tighten up the range on <br>
stable branches. I think we'd need to hear from Ubuntu and Debian folks <br>
what they think about that. My guess is that they'd prefer even stable <br>
branches to continue testing recent versions, so that they could be used <br>
on Debian unstable and on Ubuntu between LTS releases.<br>
<br></blockquote><div><br>Zane and all, thanks very much for pushing this initiative forward. The general approach makes sense to me. Proactively testing with the latest python versions would be awesome and would close a much needed gap.<br><br>As for testing stable branches with the latest Python versions. I believe this refers to the latest Python version available anywhere, ie. perhaps an unstable release from sid. In general it would make sense to to continue testing the most recent stable release the same way it was tested when it was master. There's a good chance that by the time stable/xyz branches are cut from master, the unstable Python version that was being tested in master is now in a stable distro release. For example, for the OpenStack U release this will most likely be the case for Ubuntu with Python 3.8.</div><div><br></div><div>Here are the versions we support in Ubuntu, and (most likely) will support in the future, in case it's helpful:<br><br>Queens: py3.5 (16.04); py3.6 (18.04)<br>Rocky: py3.6 (18.04); py3.6 (18.10)<br>Stein: py3.6 (18.04); py3.7 (19.04)<br>T: py3.6 (18.04); py3.7 (19.10)<br>U: py3.6 (18.04); py3.8 (20.04)<br>V: py3.8 (20.04); py3.? (20.10)<br><br>Thanks,<br>Corey<br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> This is objective and doesn't require anyone to guess at what versions need to be supported.<br>
> <br>
>><br>
>> Integration Tests<br>
>> -----------------<br>
>><br>
>> Integration tests do test, amongst other things, integration with<br>
>> non-openstack-supplied things in the distro, so it's important that we<br>
>> test on the actual distros we have identified as popular.[2] It's also<br>
>> important that every project be testing on the same distro at the end of<br>
>> a release, so we can be sure they all work together for users.<br>
>><br>
>> When a new release of CentOS or a new LTS release of Ubuntu comes out,<br>
>> the TC will create a project-wide goal for the *next* release cycle to<br>
>> switch all integration tests over to that distro. It's up to individual<br>
>> projects to make the switch for the tests that they own (e.g. it'd be<br>
>> the QA team for Tempest, but other individual projects for their own<br>
>> jobs). Again, there'll be a goal champion to monitor and follow up.<br>
>><br>
>><br>
>> [1]<br>
>> <a href="https://governance.openstack.org/tc/resolutions/20180529-python2-deprecation-timeline.html" rel="noreferrer" target="_blank">https://governance.openstack.org/tc/resolutions/20180529-python2-deprecation-timeline.html</a><br>
>> [2]<br>
>> <a href="https://governance.openstack.org/tc/reference/project-testing-interface.html#linux-distributions" rel="noreferrer" target="_blank">https://governance.openstack.org/tc/reference/project-testing-interface.html#linux-distributions</a><br>
> <br>
> Overall this approach seems fine. It is basically the approach we've used in the past with the addition of explicit testing of future python (which we've never really done before). I do think we need to avoid letting every project move at their own pace. This is what we did with the last python and distro switchover (trusty to xenial) and a number of projects failed to get it done within the release cycle. Instead I think we should rely on shared branch specific zuul templates that can be updated centrally when the next release is cut.<br>
<br>
For those just joining, we discussed this on IRC yesterday.[1] fungi <br>
mentioned that we tried two different approaches for precise->trusty and <br>
trusty->xenial, and they both failed in different ways. The first time <br>
infra gave teams time to prepare and then eventually cut the build over <br>
for everyone, with the result that lots of things broke. The second time <br>
infra allowed teams to switch over in their own time, with the result <br>
that a lot of things released with tests running on an outdated LTS release.<br>
<br>
We do have one new tool in our toolbox: project-wide goals. They're not <br>
magically going to solve the problem, but at least they give us some <br>
visibility into what has and has not happened. Perhaps we could provide <br>
periodic, rather than experimental, jobs to test with so that the goal <br>
champions can track where the likely problems are in the lead-up to a <br>
switchover? As far as the LTS distro goes, I don't have a strong opinion <br>
on which approach is the least worst. I think if we want to have a <br>
switchover (just after milestone-2 maybe?) then we should just write <br>
that into the project-wide goal.<br>
<br>
cheers,<br>
Zane.<br>
<br>
[1] <br>
<a href="http://eavesdrop.openstack.org/irclogs/%23openstack-tc/%23openstack-tc.2018-10-18.log.html#t2018-10-18T15:16:13" rel="noreferrer" target="_blank">http://eavesdrop.openstack.org/irclogs/%23openstack-tc/%23openstack-tc.2018-10-18.log.html#t2018-10-18T15:16:13</a><br>
<br>
__________________________________________________________________________<br>
OpenStack Development Mailing List (not for usage questions)<br>
Unsubscribe: <a href="http://OpenStack-dev-request@lists.openstack.org?subject:unsubscribe" rel="noreferrer" target="_blank">OpenStack-dev-request@lists.openstack.org?subject:unsubscribe</a><br>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" rel="noreferrer" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
</blockquote></div></div></div>