Redfish message registries, plus translation

James Feist james.feist at linux.intel.com
Thu Feb 20 05:03:06 AEDT 2020


On 2/19/20 9:07 AM, Joseph Reynolds wrote:
> On 2/18/20 4:02 PM, James Feist wrote:
>> On 2/18/20 11:25 AM, Bills, Jason M wrote:
>>>
>>>
>>> On 2/17/2020 5:53 PM, Joseph Reynolds wrote:
>>>> On 2/16/20 5:37 PM, Andrew Jeffery wrote:
>>>>>
>>>>> On Sat, 15 Feb 2020, at 06:27, Matt Spinler wrote:
>>>>>> Hi James,
>>>>>>
>>>>>> It's looking like in our future we will have to provide:
>>>>>>
>>>>>> 1) Redfish logs using multiple message registries that probably 
>>>>>> can't be
>>>>>>      hardcoded into hpp files and checked in.
>>>>>>      - For example, a registry for our host firmware and 
>>>>>> hypervisor errors,
>>>>>>        as our BMC handles displaying logs for them, that we would 
>>>>>> pick up
>>>>>>        during our build process.
>>>>>> and
>>>>>>
>>>>>> 2) Message registry text in multiple languages
>>>>>>
>>>>>> Those being my goals, I have a few questions:
>>>>>>
>>>>>> In general, is the multi-language strategy to just provide a 
>>>>>> standalone
>>>>>> registry array for each language which the code then selects based 
>>>>>> on the
>>>>>> Language property?
>>>>>>
>>>>>> To support both of the above, would you be open to having 
>>>>>> functionality
>>>>>> added
>>>>>> to read in registries from data files, including based on 
>>>>>> language? Or,
>>>>>> would you
>>>>>> have any other ideas for how to support these items?
>>>>> Bit of a drive-by question, but shouldn't we be using GNU 
>>>>> gettext[1] to
>>>>> handle translation?
>>>>
>>>> Matt's proposal is for BMCWeb to have two languages:
>>>>
>>>> 1. The implementation language.  When BMCWeb writes internal log 
>>>> entries, these will be in English.  The BMCWeb developers will use 
>>>> these to understand what is going on,  and the BMC admin may be able 
>>>> to read the, but they are not for BMC users.
>>>> We can certainly use gettext to internationalize this. But it is not 
>>>> what Matt is asking about.
>>>>
>>>> 2. The languages used for Redfish messages.  These message are added 
>>>> to the HTTP response body.  These are meant to be read by any BMC 
>>>> REST API user.  For example, messages from the Redfish "Base" 
>>>> message registry Base.1.7.0.json within DSP8011.  BMCWeb has a 
>>>> hard-coded version of a subset of these messages, for example, the 
>>>> AccountModified message in 
>>>> https://github.com/openbmc/bmcweb/blob/master/redfish-core/src/error_messages.cpp 
>>>>
>>>> These messages are defined in English and meant to be translated. 
>>>> That's what Matt is asking about.
>>>>
>>>>
>>>> Here's my drive-by response.
>>>>
>>>> The current implementation is locked into English-only. BMCWeb code 
>>>> sends messages like this:
>>>> 1. #include 
>>>> https://github.com/openbmc/bmcweb/blob/master/redfish-core/include/error_messages.hpp 
>>>>
>>>> 2. Write code like: propertyValueModified(res, "myProperty", 
>>>> myModifiedValue);
>>>> This calls the function in error_messages.cpp which is hard-coded 
>>>> English.
>>>>
>>>> Having hard-coded function calls and hard-coded implementations 
>>>> helps with BMCWeb's goal for performance and startup times.
>>>> https://github.com/openbmc/bmcweb/blob/master/DEVELOPING.md
>>>>
>>>> However, IMHO, the development process to add new Redfish messages 
>>>> to BMCWeb is cumbersome.  It should be as easy as copying Redfish's 
>>>> new JSON file.
>>> To ease this, there is a script in bmcweb that is designed to parse 
>>> the JSON message registries into the header file.  I just ran it and 
>>> it has a couple minor bugs that were introduced when we changed the 
>>> format to fix build warnings.  I'll push a fix.
>>>
>>> One possible solution would be to adapt this script to run 
>>> automatically at build time.  Then any JSON message registry files 
>>> that get added either to bmcweb or as an append could be 
>>> transparently converted to the header file.
>>
>> An added benefit of this is that it could verify JSON is in legal 
>> format before it makes it to the BMC.
> 
> Agreed.  As an alternative, we could enhance the BMCWeb build to 
> validate the JSON message registry files that are destined for use by 
> BMCWeb.  That would catch most errors, but be weaker than converting 
> them to header files: it leaves a window where those files could be 
> modified after they are packaged into the image and before they are read 
> into bmcweb.

Also if someone uses a bbappend and patches in their own files after the 
build completes (or using a different recipe entirely), they won't be 
validated.

> 
>>
>>>
>>>>
>>>> IMHO, the easiest way to to support multiple languages (including 
>>>> English) is to keep the prototypes in error_messages.hpp so all the 
>>>> existing uses will continue to work.  Then change the implementation 
>>>> to select a message from a JSON file based on the hard-coded message 
>>>> name (example: AccountNotModified) and language (en-us, zh-cn, or 
>>>> whatever).
>>
>>
>> Is there any reason to have this update-able at runtime? Regardless to 
>> limit the possibility of errors I'd like to avoid constant pulling 
>> from JSON. I'd rather see the JSON being pulled at application start, 
>> so we take any impact (timing or bugs/crashes) early. However I'm not 
>> sure I know of a use-case to have this be done at runtime.
> 
> I did not mean for the JSON files to be modifiable at runtime; I see no 
> use case for that.  I imagined that BMCWeb would read any given JSON 
> file exactly once and stay in bmcweb heap storage until the server 
> terminates.  The simplest design is to read all of the JSON files from 
> its message registry directory: all messages files (Base, Oem.Redfish, 
> etc.) and all language versions (en-us, cn-zh, etc.). If the registry 
> gets large because of many messages multiplied by many translated 
> versions and memory consumption is a concern, then we can consider 
> just-in-time reading JSON files for that language. (But let's not go 
> there now.)
> 
> To be clear: I am also not advocating for the JSON message translation 
> files to be updatable by any BMC interface.  As far as I am concerned, 
> they can be baked into the image.  Doing it this way, the messages can 
> be updated by a firmware update.

Great, I was just wondering if there was some use case I missed.

> 
> - Joseph
> 
>>
>>>>
>>>> All of the usual issues come up with approach:
>>>> - Will BMCWeb pre-load or load-on-demand the JSON file would be 
>>>> pre-loaded.  It certainly will not be loaded for every message.
>>>> - Fallbacks.  For example, if the ja-jp message files does not have 
>>>> the AccountNotModified message, format the en-us message instead.
>>>> - Need a default message.  For example, if BMCWeb tries to sent the 
>>>> message "NotARealMessage" which is not defined in any message file, 
>>>> it might be useful to send the raw data instead.
>>> bmcweb currently provides the given MessageId with a blank Message 
>>> field if it cannot be found in a registry.
>>>
>>>> - We use the Redfish "Base" message registry, and I think we also 
>>>> use an OpenBMC Oem message registry as well.  So BMCWeb will have to 
>>>> load multiple message registries per language.
>>>>
>>>> More:
>>>> - Will a initial set of supported languages be baked into the 
>>>> firmware image (on the BMC's file system) in English or some other 
>>>> languages?
>>>> - Can the BMC admin add and remove supported languages (by adding or 
>>>> deleting JSON message registry files)?
>>>> - Will there be REST APIs for that?
>>>> - Supported by the Redfish spec?
>>>>
>>>> So what the the requirements?
>>>>
>>>> - Joseph
>>>>
>>>> You can see one open source project's work here: 
>>>> http://userguide.icu-project.org/formatparse/messages
>>>>
>>>>>
>>>>> [1] https://www.gnu.org/software/gettext/
>>>>>
>>>>> Andrew
>>>>
> 


More information about the openbmc mailing list