profiles: improve SUPPORTED_DEVICES handling and profile identification#1533
profiles: improve SUPPORTED_DEVICES handling and profile identification#1533map-b wants to merge 5 commits into
Conversation
|
Hard NAK. Is this AI slop code? You've broken event logging, broken a bug fix and removed an important test case. As I've already explained to you several times, the root cause of this issue is incorrect metadata coming from upstream. Attempting to work around the upstream issue in the ASU server does not fix anything and leaves several other things broken (specifically both |
|
In those two reverts, included in this PR, you were mixing totally the translation or the DT compatible strings into actually profiles, that is not sanitize that is lose track of what are the strings sended by ASU clients(if they do not try to translate before sending them) and the actual profiles which are used in ImageBuilders. It is not AI sope code, a bit unrespectfully comment was that. If you do not want to reason, it is over, It is really sad. |
96024c1 to
e8bf73f
Compare
They share the same "compatible" in device tree causing some incompatibilities (ASU profile identification), assign a unique "compatible" and "model" to each variant.[1][2] Commit [3] just avoided ASU profile identification limitation[4] but not fixed the root cause. [1]: openwrt#20632 (comment) [2]: openwrt#20632 (comment) [3]: openwrt@b71f466 [4]: openwrt/asu#1533 Fixes: b71f466 ("mediatek: filogic: fix supported_devices list for gl-mt2500") Fixes: 8d30e07 ("mediatek: filogic: fix for new GL.iNet GL-MT2500/GL-MT2500A hardware revision") Fixes: openwrt#20566 Fixes(partially): openwrt/asu#1525 Signed-off-by: Mario Andrés Pérez <mapb_@outlook.com>
These devices share the same "compatible" in device tree causing some incompatibilities (sysupgrades, ASU profile identification), assign a unique "compatible" and "model" to each variant. Context: Commit [1] added each variant's dts compatible to the SUPPORTED_DEVICES field of the other variant to make easy sysupgrades between these physically indistinguishable devices variants possible. But there were found three issues which does not allow this: - the sysupgrade's stricter check still used in some sysupgrade paths(this check is being replaced(and redundant) with the newer fwtool's SUPPORTED_DEVICES check using the info in images METADATA), this check will fail when sysupgrading from a different board_name(compatible dts) that the image was created for (image profile name).[2] - ASU needs unique "dts compatible" to identify the devices profile. - and an ASU's profile identification limitation when several devices from a common target share SUPPORTED_DEVICES entries.[3] There is a proposal for these issues but not yet implemented [4][3]. Until these issues are fixed we won't allow "easy" sysupgrades between these two device variants. Commit [5] avoided the ASU profile identification limitation but missed the required two unique dts compatibles in order to make the two variants fully work, although not allowing easy sysupgrade between them. [1]: openwrt@8d30e07 [2]: sysupgrade stricter check openwrt#20566 (comment) [3]: ASU proposal openwrt/asu#1533 [4]: allow easy sysupgrade proposal openwrt#20947 [5]: openwrt@b71f466 Fixes: b71f466 ("mediatek: filogic: fix supported_devices list for gl-mt2500") Fixes: 8d30e07 ("mediatek: filogic: fix for new GL.iNet GL-MT2500/GL-MT2500A hardware revision") Fixes: openwrt#20566 Fixes: openwrt/asu#1525 Signed-off-by: Mario Andrés Pérez <mapb_@outlook.com>
These devices share the same "compatible" in device tree causing some incompatibilities (sysupgrades, ASU profile identification), assign a unique "compatible" and "model" to each variant. Context: Commit [1] added each variant's dts compatible to the SUPPORTED_DEVICES field of the other variant to make easy sysupgrades between these physically indistinguishable devices variants possible. But there were found three issues which does not allow this: - the sysupgrade's stricter check still used in some sysupgrade paths(this check is being replaced(and redundant) with the newer fwtool's SUPPORTED_DEVICES check using the info in images METADATA), this check will fail when sysupgrading from a different board_name(compatible dts) that the image was created for (image profile name).[2] - ASU needs unique "dts compatible" to identify the devices profile. - and an ASU's profile identification limitation when several devices from a common target share SUPPORTED_DEVICES entries.[3] There is a proposal for these issues but not yet implemented [4][3]. Until these issues are fixed we won't allow "easy" sysupgrades between these two device variants. Commit [5] avoided the ASU profile identification limitation but missed the required two unique dts compatibles in order to make the two variants fully work, although not allowing easy sysupgrade between them. [1]: openwrt@8d30e07 [2]: sysupgrade stricter check openwrt#20566 (comment) [3]: ASU proposal openwrt/asu#1533 [4]: allow easy sysupgrade proposal openwrt#20947 [5]: openwrt@b71f466 Fixes: b71f466 ("mediatek: filogic: fix supported_devices list for gl-mt2500") Fixes: 8d30e07 ("mediatek: filogic: fix for new GL.iNet GL-MT2500/GL-MT2500A hardware revision") Fixes: openwrt#20566 Fixes: openwrt/asu#1525 Signed-off-by: Mario Andrés Pérez <mapb_@outlook.com> Link: openwrt#21842 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
These devices share the same "compatible" in device tree causing some incompatibilities (sysupgrades, ASU profile identification), assign a unique "compatible" and "model" to each variant. Context: Commit [1] added each variant's dts compatible to the SUPPORTED_DEVICES field of the other variant to make easy sysupgrades between these physically indistinguishable devices variants possible. But there were found three issues which does not allow this: - the sysupgrade's stricter check still used in some sysupgrade paths(this check is being replaced(and redundant) with the newer fwtool's SUPPORTED_DEVICES check using the info in images METADATA), this check will fail when sysupgrading from a different board_name(compatible dts) that the image was created for (image profile name).[2] - ASU needs unique "dts compatible" to identify the devices profile. - and an ASU's profile identification limitation when several devices from a common target share SUPPORTED_DEVICES entries.[3] There is a proposal for these issues but not yet implemented [4][3]. Until these issues are fixed we won't allow "easy" sysupgrades between these two device variants. Commit [5] avoided the ASU profile identification limitation but missed the required two unique dts compatibles in order to make the two variants fully work, although not allowing easy sysupgrade between them. [1]: 8d30e07 [2]: sysupgrade stricter check #20566 (comment) [3]: ASU proposal openwrt/asu#1533 [4]: allow easy sysupgrade proposal #20947 [5]: b71f466 Fixes: b71f466 ("mediatek: filogic: fix supported_devices list for gl-mt2500") Fixes: 8d30e07 ("mediatek: filogic: fix for new GL.iNet GL-MT2500/GL-MT2500A hardware revision") Fixes: #20566 Fixes: openwrt/asu#1525 Signed-off-by: Mario Andrés Pérez <mapb_@outlook.com> Link: #21842 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> (cherry picked from commit 7aa1f7e)
| if profile in supported_devices: | ||
| return True | ||
|
|
||
| if len(profiles) == 1 and "generic" in profiles: |
There was a problem hiding this comment.
if (len(profiles) == 1 or "geos" in profiles) and "generic" in profiles:
To remark that "geos" case is an exception in the "generic" targets/platforms? Adding a comment too?
@efahl I can add a separate commit for that issue since this PR is "touching" this code
These devices share the same "compatible" in device tree causing some incompatibilities (sysupgrades, ASU profile identification), assign a unique "compatible" and "model" to each variant. Context: Commit [1] added each variant's dts compatible to the SUPPORTED_DEVICES field of the other variant to make easy sysupgrades between these physically indistinguishable devices variants possible. But there were found three issues which does not allow this: - the sysupgrade's stricter check still used in some sysupgrade paths(this check is being replaced(and redundant) with the newer fwtool's SUPPORTED_DEVICES check using the info in images METADATA), this check will fail when sysupgrading from a different board_name(compatible dts) that the image was created for (image profile name).[2] - ASU needs unique "dts compatible" to identify the devices profile. - and an ASU's profile identification limitation when several devices from a common target share SUPPORTED_DEVICES entries.[3] There is a proposal for these issues but not yet implemented [4][3]. Until these issues are fixed we won't allow "easy" sysupgrades between these two device variants. Commit [5] avoided the ASU profile identification limitation but missed the required two unique dts compatibles in order to make the two variants fully work, although not allowing easy sysupgrade between them. [1]: openwrt@8d30e07 [2]: sysupgrade stricter check openwrt#20566 (comment) [3]: ASU proposal openwrt/asu#1533 [4]: allow easy sysupgrade proposal openwrt#20947 [5]: openwrt@2c19228 Fixes: 2c19228 ("mediatek: filogic: fix supported_devices list for gl-mt2500") Fixes: 8d30e07 ("mediatek: filogic: fix for new GL.iNet GL-MT2500/GL-MT2500A hardware revision") Fixes: openwrt#20566 Fixes: openwrt/asu#1525 Signed-off-by: Mario Andrés Pérez <mapb_@outlook.com> Link: openwrt#21842 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
I have been checking for any possible side effect and I do not find any, it is the normal and well stablished use of SUPPORTED_DEVICES mechanism to allow "force-less" sysupgrades and everything works as intended except the ASU profile identification. List of issues that are pending of this little fix, basically any "advanced" use of SUPPORTED_DEVICES:
*"owut" which is the only ASU client doing a parallel translation in order to known the specific profile needed for its nice default packages analysis, for example. It must do the same translation as the ASU server. I am willing to propose the needed same little change there to mimic the ASU translation if efahl wish (TODO: this should be an api call to ASU server for doing the translation, centralizing and avoiding inconsistencies?) @aparcar @Ansuel, I tried too much with efahl and that path only got worse and worse, sorry for appealling and pinging to you directly but this seems to be an important missing bit to fully integrate the fwtool's SUPPORTED_DEVICES with the ASU subsystem, and avoid the actual proposed workarounds(remove shared entries) which is limititing the SUPPORTED_DEVICES mechanism too much. TLDR: The proposal is just: look at all the SUPPORTED_DEVICES lists in the target/platform (profiles.json) and select the profile which has the board_name(dts compatible) as first entry in the SUPPORTED_DEVICES list if the entry is shared by several profiles. |
So, what should I understand from the 5 months of completely silent, no single comment? That you completely agree with efahl's unrespectfully feedback without giving a truly reasonable reason? And you just wait hopefully for me disappearing or...idk. What would you think in my shoes? Can you point me to my own errors so I can learn from them, at least? If you both do not beat me definitively and I try to contribute in the future? The best would be you help efahl and me to find a common page... All my comments are public on GitHub and a few in the forum if you want to check. @aparcar |
|
Hey @map-b thanks for your patience. There are so many things to take care of, sometimes it takes a while. I used an AI to tackle this upstream, from my understanding this should improve the situation? I think the "supported devices" string is misleading when it secretly switches your underlying storage and thereby resets your device. This should generally be avoided... @dangowrt not sure how much time you have, but maybe you can also comment on this. We could also attach a single profile into each firmware image, by making devices "self aware", we'd avoid this entire shenanigans... |
|
This exactly what I am trying to avoid... 🙃. Upstream handles this correctly (manual sysupgrading) and its one of the usefulness of the fwtool's supported_devices mechanism. It's ASU who is silently swapping the images. Can't we generalize and consolidate the mapping/translation process in the ASU side? There are Limiting the ability to allow these cross-sysupgrades from "downstream"(ASU) does not seem correct to me. And we will be losing valuable information. But I'm repeating myself now. *@hauke also thought in the "selecting the first entry" idea. |
|
My 2 cent on the topic... but can't we fix this upstream? Upgrade tool shouldn't implement workaround if the project is active and things can be fixed upstream... |
|
I'm not sure if It's a workaround, the actual profile selection in the upgrade tool is a bit, too much simple. The upstream fix is to remove the ability...?
|
|
Do we have a clear view of the problem or not? IMO there are two cases:
*In both cases, ASU server is doing (during "validation request" step) a subtle translation/mapping, based on SUPPORTED_DEVICES entries from Bugs (in ASU side, I think):
*The actual state, mixing If the concern is to keep ASU server simple, then simplify it and only accept Since the mapping/translation is only required for the on-device ASU clients, leave to them the responsibility:
Regards. |
|
I fully agree with you that the fix should take place in ASU, but I think its much more simple than it seems:
This is completely irrelevant, two separate images should NEVER share a DTS compatible for the device. We define SUPPORTED_DEVICES to simply say that 2 images can work on 1 device, NOT that 2 identical images can work on 1 device. We don't generate identical images with different names...
This is the key, the profile is already in SUPPORTED_DEVICES, so either we use the profile entry or we don't care which image is used... we don't need to apply both fixes at the same time, just choose a path. However, there is no need to "allow" a compatible image that doesn't match the profile when in reality both images are available, in other words, ASU should not decide that it is ok to change profiles during sysupgrade, that should be only up to the user in a manual sysupgrade. so the path should be to use the profile entry only... my example: the two engenius devices After these definitions are called the SUPPORTED_DEVICES lines are
because in image.mk we have like hauke said, just select the first one (I can't find the comment where he said that idea, just that you mentioned he did) |
|
To keep the discussion simple, what this PR does is:
*If the ASU client sends a true valid profile, select the profile, don't do any mapping/translation with SUPPORTED_DEVICES. We have: Image profiles (vendor_device) and devices aka board_name aka DTS compatible (vendor,device), the way to map them, from ASU perspective, is the SUPPORTED_DEVICES entries. The shortcuts replacing the '_' with ',' to do this mapping don't help to see the full picture. Not always the board_name is equal to the profile replacing the comma by an underscore. Thanks @mcprat for dig in, I would make some corrections in your analysis explicitly but with this answer I hope you notice the oversights. |
|
my point is that it sounds like this change makes a 2 step process when really just 1 step is necessary. We do not have to "map" profiles in order to treat groups of profiles one way and a single matching profile another way. I have limited python experience and I don't want to figure out specifics right now and thats all we need... although, I understand in real life application it will take more lines to do the equivalent here. |
|
But, we allow mappings where it is not the first in the list (Look at And the idea is to only apply the stricter requirement (be the first in the list) when there are shared entries. So we allow shared entries (compatible images) but consciously implemented). |
These devices share the same "compatible" in device tree causing some incompatibilities (sysupgrades, ASU profile identification), assign a unique "compatible" and "model" to each variant. Context: Commit [1] added each variant's dts compatible to the SUPPORTED_DEVICES field of the other variant to make easy sysupgrades between these physically indistinguishable devices variants possible. But there were found three issues which does not allow this: - the sysupgrade's stricter check still used in some sysupgrade paths(this check is being replaced(and redundant) with the newer fwtool's SUPPORTED_DEVICES check using the info in images METADATA), this check will fail when sysupgrading from a different board_name(compatible dts) that the image was created for (image profile name).[2] - ASU needs unique "dts compatible" to identify the devices profile. - and an ASU's profile identification limitation when several devices from a common target share SUPPORTED_DEVICES entries.[3] There is a proposal for these issues but not yet implemented [4][3]. Until these issues are fixed we won't allow "easy" sysupgrades between these two device variants. Commit [5] avoided the ASU profile identification limitation but missed the required two unique dts compatibles in order to make the two variants fully work, although not allowing easy sysupgrade between them. [1]: openwrt@8d30e07 [2]: sysupgrade stricter check openwrt#20566 (comment) [3]: ASU proposal openwrt/asu#1533 [4]: allow easy sysupgrade proposal openwrt#20947 [5]: openwrt@b71f466 Fixes: b71f466 ("mediatek: filogic: fix supported_devices list for gl-mt2500") Fixes: 8d30e07 ("mediatek: filogic: fix for new GL.iNet GL-MT2500/GL-MT2500A hardware revision") Fixes: openwrt#20566 Fixes: openwrt/asu#1525 Signed-off-by: Mario Andrés Pérez <mapb_@outlook.com> Link: openwrt#21842 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
e8bf73f to
ce45dce
Compare
ce45dce to
e3a0393
Compare
This reverts commit 1579236. After commit 2e9edfd ("build-request: sanitize profile before use") sanitized the incoming profile but not the lookup table, clients sending DTS compatibles got "profile not found". This fixed the mismatch by sanitizing both sides. Same issue: conflates board_name with profile name. Link: openwrt#1516 Link: openwrt#1554 Signed-off-by: Mario Andrés Pérez <mapb_@outlook.com>
This reverts commit 2e9edfd. The ',' -> '_' replacement conflates board_name with profile name. The fix was guided by owut's pre-translation behavior, which sends profile names directly, not by how other clients actually work. The trigger was a profile name using 'bananapi' while the DTS compatible uses 'bpi'; no string replacement could bridge that. The real fix was upstream, syncing profile names with DTS compatibles (openwrt/openwrt@d871e95e, openwrt/openwrt#21095). Link: openwrt#1511 Link: openwrt#1554 Signed-off-by: Mario Andrés Pérez <mapb_@outlook.com>
The actual handling does not allow to several devices share a DTS compatible string to allow image compatibility between them. Take the lists as lists and select the profile after checking all possible candidates. Throw a new validation exception when it is not possible to identify a profile which will help to identify inconsistencies. This also can help to make a little bit clearer the difference between "profile" and "DTS compatible string". There is no need to add [profile] to SUPPORTED_DEVICES list anymore. The two preceding reverts removed the ',' -> '_' sanitization that conflated board_name with profile name. The examples below compare the flat dict (both raw and sanitized) against the new list format. Profiles data (profile: SUPPORTED_DEVICES list): engenius_esr1200: ["engenius,esr1200", "esr1200", "esr1750", "engenius,esr1750"] engenius_esr1750: ["engenius,esr1750", "esr1750", "esr1200", "engenius,esr1200"] ubnt_unifi-ap: ["ubnt,unifi-ap", "unifi", "ubnt,unifi"] ubnt_unifi-ap-lr: ["ubnt,unifi-ap-lr", "unifi", "ubnt,unifi", "ubnt,unifi-ap"] Input Flat raw Flat sanitized ───────────────────────── ───────────────────────────── ───────────────────────────── engenius_esr1200 engenius_esr1200 OK engenius_esr1750 <- engenius,esr1200 engenius_esr1750 <- engenius_esr1750 <- esr1200 engenius_esr1750 <- engenius_esr1750 <- esr1750 engenius_esr1750 <- engenius_esr1750 <- engenius,esr1750 engenius_esr1750 OK engenius_esr1750 OK engenius_esr1750 engenius_esr1750 OK engenius_esr1750 OK ubnt_unifi-ap ubnt_unifi-ap OK ubnt_unifi-ap-lr <- ubnt,unifi-ap ubnt_unifi-ap-lr <- ubnt_unifi-ap-lr <- unifi ubnt_unifi-ap-lr <- ubnt_unifi-ap-lr <- ubnt,unifi ubnt_unifi-ap-lr <- ubnt_unifi-ap-lr <- ubnt_unifi-ap-lr ubnt_unifi-ap-lr OK ubnt_unifi-ap-lr OK ubnt,unifi-ap-lr ubnt_unifi-ap-lr OK ubnt_unifi-ap-lr OK (<-) silently resolves to wrong profile List format (resolve_profile behavior): Input Result ───────────────────────── ───────────────────── engenius_esr1200 engenius_esr1200 OK engenius,esr1200 engenius_esr1200 OK esr1200 error OK esr1750 error OK engenius,esr1750 engenius_esr1750 OK engenius_esr1750 engenius_esr1750 OK ubnt_unifi-ap ubnt_unifi-ap OK ubnt,unifi-ap ubnt_unifi-ap OK unifi error OK ubnt,unifi error OK ubnt_unifi-ap-lr ubnt_unifi-ap-lr OK ubnt,unifi-ap-lr ubnt_unifi-ap-lr OK Sanitization (, -> _) collapsed DTS and profile keys into the same namespace, breaking profile name lookups that worked in the raw flat dict. The list format preserves all entries per profile and, when ambiguous, resolves to the profile where the input is first in its supported_devices list, or errors explicitly if no unique match exists. Signed-off-by: Mario Andrés Pérez <mapb_@outlook.com>
Extract DTS compatible -> profile name resolution into a dedicated resolve_profile() function. Merges the x86 generic fallback into it, removes the nested valid_profile() helper and the inline translation block. Fixes dict key error with next(iter(...)). Signed-off-by: Mario Andrés Pérez <mapb_@outlook.com>
Move get_request_hash() after validate_request() so the hash always
uses the canonical profile name, not the raw board_name input.
Remove the replace(',', '_') workaround from get_request_hash()
since the profile is always canonical at that point.
Previously, two clients sending different aliases for the same profile
(e.g. board_name vs. canonical name) would get different hash keys,
defeating the build cache.
e3a0393 to
0250c97
Compare
|
Time pass and new tools are available, I was going to propose make the translation a proper function but ended doing the next steps like make an API endpoint for ASU clients which do the profile identification. I have the proposal for an API endpoint for serve the profile resolution for owut and the required owut little adaptation code, I also have a proposal for the complementary required change to this PR for owut, just mimicking the new profile resolution logic. But by now, I have only updated this PR with a simplified and cleaner code. V2 changes: (two new commits to keep PR evolution clear)
The ASU job cache issue is there since the beginning, it mostly affects ASU LuCI app since it sends the raw board_name and it gets a different build request hash that owut and firmware-selector since these sends the profile name. (e.g. each x86 request made in ASU LuCI app gets a unique hash, not the shared "generic")
@aparcar I have thought many times about other possibilities to "attach" the used profile in the running image to uniquely identify the running image but... I cannot get anything better that DTS compatible string and the SUPPORTED_DEVICES map. It is not clear what are the concerns here, as you can see i am all for this (and fixing any other missing bits related to ASU) but please give some real feedback so i can work on it. *Completing the ASU integration tests is pending. Recap: What does this PR propose?
@efahl please, have a fresh new view on this |
The actual handling does not allow to several devices share a DTS compatible string to allow image compatibility between them.
Take the lists as lists and select the profile after checking all possible candidates.
Throw a new validation exception when it is not possible to identify a profile which will help to identify inconsistencies.
This also can help to make a little bit clearer the difference between "profile" and "DTS compatible string".
*There is not need to add [profile] to SUPPORTED_DEVICES list anymore.
asu/asu/util.py
Line 566 in 0328704
Reasoning about the reverts: #1511 (comment) I would like to add that those commits would make harder to understand how we are handling the translation from Device Tree compatible strings to actual profiles names.
Before: 1
After:
With this structure, select the profile where the board_name appear first in the list if the entry is shared.
Fixes: #1525
Fixes: openwrt/openwrt#20566
V2:
resolve_profile()function that handles DTS compatible → canonical profile name resolution with explicit ambiguity detection, replacing the inlinevalid_profile()helper.get_request_hash()handled the case where board_name equals profile_name after sanitization, but not aliases resolved via the supported_devices list or the x86/armsr/... generic fallback — those produced different cache keys than the canonical profile, defeating caching.Resolution behavior comparison (profile → list format vs flat dict):
Footnotes
https://github.com/openwrt/asu/issues/1525#issuecomment-3497242570 ↩