)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"c580da6b5974dfaa0ec85cfec9c515d8a6b475b2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"9ba18ddb_ab14b288","updated":"2025-08-21 05:08:45.000000000","message":"Screenshot before feature implementation:\n- without parameters while creating audit: https://imgur.com/wZwPq4Z \n\n- Audit info : https://imgur.com/ZcsM7fZ\n\n\nBelow are the screenshot after feature implementation:\n- Create Audit with parameters with Zone Migration Strategy: https://i.imgur.com/9QZlhrL.png\n\n- Create Audit with Host maintainenance strategy with user input as a parameters line by line: https://i.imgur.com/o2vebGA.png\n\n- Audit Info showing host maintenance parameters: https://i.imgur.com/P2X5LmS.png\n\n- Audit infor showing host maintenance audit successfully completed: https://i.imgur.com/xxZGACD.png\n\nThe same is also added in the bug https://bugs.launchpad.net/watcher-dashboard/+bug/2120704/comments/1","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"62ce6627e0b668f01706e8ddf87bc9f5aed66d36","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"773dfc7c_febdcfeb","updated":"2025-08-21 08:43:57.000000000","message":"overall, looks good to me. I left some comments. Other than that:\n\n- It\u0027d be cool to also document the parameters in the strategy detailed view. (as seen in Optimization -\u003e Strategies -\u003e (click on uuid). Maybe, there we may expand more and show the entire information about parameters including max, min, etc... not only defaults (which i think it\u0027s good for the create audit screen), although it may be too long, dunno.\n\n- It\u0027d be nice if we could create a dynamic form with a box for each parameter instead of a box for all the parameters. I have no idea how hard/easy that would be, and maybe it requires more js experience that we have, but it\u0027d be good dig a bit into it. There is a very elaborated implementation in the metadata tab of the \"Edit image\" (under Compute -\u003e Image) screen. Anywayt that may be beyond our posibilities at this point. Current approach is probably good enough.\n\nThanks!","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"e55840dfe2918d51db3796d2ca4282fd1ef9713e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"df1d11bd_0f358bbf","in_reply_to":"773dfc7c_febdcfeb","updated":"2025-08-29 11:56:07.000000000","message":"Thank you @amoralej@redhat.com for the review, for first improvement I have logged the bug https://bugs.launchpad.net/watcher-dashboard/+bug/2121648 . For second one it would skip it. The current implementation is much clean. we can pass the data in text format instead of forms.","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"28eb4cd2ed4223e35526f56015af6c6e55e33744","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"a3936d88_ea5bf161","updated":"2025-08-29 17:31:39.000000000","message":"I was able to test it, and it works fine in my env. Waiting more comments from other reviewers to see if we proceed as is, if we address some comments as follow ups/bugs.\nThanks for the hard work here Chandan, this is a really must-have feature to have in the ui.","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"ca28ae2a18b2ce23e0057833c382c0275ba2f328","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"0961ab43_16c1b8e6","updated":"2025-09-01 17:33:27.000000000","message":"change lgtm, we just need to improve the test coverage in the future. I also have tested the previous PS and was working fine.","commit_id":"599dff913f1046d449629c92c8a9773fc1c65a3a"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"4138ffbb47b52633832847e81cf2d0a6cae55746","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"356a2d5f_ad27d392","updated":"2025-09-05 18:16:48.000000000","message":"Thanks for the improvements in the last PS. I didn\u0027t have a chance to test this lastest PS, but the screenshots looks good. Thanks","commit_id":"6552f02ca69dacb4532bcfc3d0a3eb066f7e1a27"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"fe912f1c96cdc94bbc273d3bc0371f464a88588e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"812166e7_b6a83546","updated":"2025-09-05 07:56:48.000000000","message":"Updated screenshot\n- Create Audit with Strategy Parameters as Json Object: https://i.imgur.com/YHvuqjZ.png\n- Audit info view with parameters: https://i.imgur.com/n5btncx.png","commit_id":"6552f02ca69dacb4532bcfc3d0a3eb066f7e1a27"}],"releasenotes/notes/audit-parameters-support-0a1e3b1e9d9f.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be1b9df964414a3ed5d4e2b40b8b592fb44c0b0d","unresolved":true,"context_lines":[{"line_number":5,"context_line":"    audits, matching the OpenStack CLI ``openstack optimize audit create -p"},{"line_number":6,"context_line":"    \u003cname\u003dvalue\u003e``."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    A new \"Strategy Parameters\" field accepts all the parameters as a JSON object. "},{"line_number":9,"context_line":"    Server-side validation parses and validates the input, and the field remains"},{"line_number":10,"context_line":"    backward compatible when left empty."},{"line_number":11,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":9,"id":"7fb67373_2c429d51","line":8,"updated":"2025-09-16 17:01:13.000000000","message":"nit we shoudl fix whitespace issues like this.","commit_id":"6552f02ca69dacb4532bcfc3d0a3eb066f7e1a27"}],"watcher_dashboard/content/audits/forms.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"62ce6627e0b668f01706e8ddf87bc9f5aed66d36","unresolved":true,"context_lines":[{"line_number":115,"context_line":"            line \u003d line.strip()"},{"line_number":116,"context_line":"            if not line:"},{"line_number":117,"context_line":"                continue"},{"line_number":118,"context_line":"            if \u0027\u003d\u0027 not in line:"},{"line_number":119,"context_line":"                raise forms.ValidationError("},{"line_number":120,"context_line":"                    _(\u0027Parameters must be in key\u003dvalue format. \u0027"},{"line_number":121,"context_line":"                      \u0027Invalid parameter: %s\u0027) % line)"}],"source_content_type":"text/x-python","patch_set":3,"id":"14a5853e_4cb88210","line":118,"updated":"2025-08-21 08:43:57.000000000","message":"+1 for basic validation here.","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"e55840dfe2918d51db3796d2ca4282fd1ef9713e","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            line \u003d line.strip()"},{"line_number":116,"context_line":"            if not line:"},{"line_number":117,"context_line":"                continue"},{"line_number":118,"context_line":"            if \u0027\u003d\u0027 not in line:"},{"line_number":119,"context_line":"                raise forms.ValidationError("},{"line_number":120,"context_line":"                    _(\u0027Parameters must be in key\u003dvalue format. \u0027"},{"line_number":121,"context_line":"                      \u0027Invalid parameter: %s\u0027) % line)"}],"source_content_type":"text/x-python","patch_set":3,"id":"a30803f8_d0508897","line":118,"in_reply_to":"14a5853e_4cb88210","updated":"2025-08-29 11:56:07.000000000","message":"Done","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"62ce6627e0b668f01706e8ddf87bc9f5aed66d36","unresolved":true,"context_lines":[{"line_number":129,"context_line":"                import json"},{"line_number":130,"context_line":"                try:"},{"line_number":131,"context_line":"                    value \u003d json.loads(value)"},{"line_number":132,"context_line":"                except (ValueError, json.JSONDecodeError):"},{"line_number":133,"context_line":"                    # If JSON parsing fails, keep as string"},{"line_number":134,"context_line":"                    pass"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ec9607de_45866376","line":132,"updated":"2025-08-21 08:43:57.000000000","message":"watcherclients only accepts ValueError, https://github.com/openstack/python-watcherclient/blob/489d8c3e746d4c8ed6481b201f880a6e26c5bb7d/watcherclient/common/utils.py#L92-L93 , is there any reason to also accept JSONDecodeError, that may accept inproperly formatted json content.","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"e55840dfe2918d51db3796d2ca4282fd1ef9713e","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                import json"},{"line_number":130,"context_line":"                try:"},{"line_number":131,"context_line":"                    value \u003d json.loads(value)"},{"line_number":132,"context_line":"                except (ValueError, json.JSONDecodeError):"},{"line_number":133,"context_line":"                    # If JSON parsing fails, keep as string"},{"line_number":134,"context_line":"                    pass"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"a70a36af_4c41edd3","line":132,"in_reply_to":"ec9607de_45866376","updated":"2025-08-29 11:56:07.000000000","message":"Done","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"28eb4cd2ed4223e35526f56015af6c6e55e33744","unresolved":true,"context_lines":[{"line_number":115,"context_line":"            line \u003d line.strip()"},{"line_number":116,"context_line":"            if not line:"},{"line_number":117,"context_line":"                continue"},{"line_number":118,"context_line":"            if \u0027\u003d\u0027 not in line:"},{"line_number":119,"context_line":"                raise forms.ValidationError("},{"line_number":120,"context_line":"                    _(\u0027Parameters must be in key\u003dvalue format. \u0027"},{"line_number":121,"context_line":"                      \u0027Invalid parameter: %s\u0027) % line)"}],"source_content_type":"text/x-python","patch_set":6,"id":"943c7d62_0c084510","line":118,"range":{"start_line":118,"start_character":0,"end_line":118,"end_character":31},"updated":"2025-08-29 17:31:39.000000000","message":"nit: we can improve by allowing only one \u0027\u003d\u0027 per line. Suppose that the user by mistake forget to add a new line between two paramenters.\ne.g: it accepted and the result and `metric` ended:\n`metrics: instance_cpu_usage period\u003d300``","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"439863d9637e0943d7f454ed7f73c599e0929f32","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            line \u003d line.strip()"},{"line_number":116,"context_line":"            if not line:"},{"line_number":117,"context_line":"                continue"},{"line_number":118,"context_line":"            if \u0027\u003d\u0027 not in line:"},{"line_number":119,"context_line":"                raise forms.ValidationError("},{"line_number":120,"context_line":"                    _(\u0027Parameters must be in key\u003dvalue format. \u0027"},{"line_number":121,"context_line":"                      \u0027Invalid parameter: %s\u0027) % line)"}],"source_content_type":"text/x-python","patch_set":6,"id":"4886d9c6_890ffd04","line":118,"range":{"start_line":118,"start_character":0,"end_line":118,"end_character":31},"in_reply_to":"943c7d62_0c084510","updated":"2025-09-01 04:18:32.000000000","message":"Done","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"68de81f601adaf929c980ce1e722c6028a9ba3cc","unresolved":true,"context_lines":[{"line_number":129,"context_line":"                value \u003d value.strip()"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"                # Try to convert value to appropriate type using JSON"},{"line_number":132,"context_line":"                import json"},{"line_number":133,"context_line":"                try:"},{"line_number":134,"context_line":"                    value \u003d json.loads(value)"},{"line_number":135,"context_line":"                except ValueError:"}],"source_content_type":"text/x-python","patch_set":7,"id":"36dafc1c_2b5ac1ab","line":132,"updated":"2025-09-01 13:40:28.000000000","message":"this import should go at the top of the file","commit_id":"1d9575e9014e777d811306d786813b69465a60fd"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"013719158c75fbacd268b64feac988c66dbe4127","unresolved":true,"context_lines":[{"line_number":129,"context_line":"                value \u003d value.strip()"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"                # Try to convert value to appropriate type using JSON"},{"line_number":132,"context_line":"                import json"},{"line_number":133,"context_line":"                try:"},{"line_number":134,"context_line":"                    value \u003d json.loads(value)"},{"line_number":135,"context_line":"                except ValueError:"}],"source_content_type":"text/x-python","patch_set":7,"id":"adc20ec8_30742492","line":132,"in_reply_to":"36dafc1c_2b5ac1ab","updated":"2025-09-01 14:00:37.000000000","message":"+1 good point. We should move to this to the top, to be clear which modules are needed here.","commit_id":"1d9575e9014e777d811306d786813b69465a60fd"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"5f3a94118cb6c6f18a9fd6e26eacb57927ec1631","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                value \u003d value.strip()"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"                # Try to convert value to appropriate type using JSON"},{"line_number":132,"context_line":"                import json"},{"line_number":133,"context_line":"                try:"},{"line_number":134,"context_line":"                    value \u003d json.loads(value)"},{"line_number":135,"context_line":"                except ValueError:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5cd27ae0_f8bb05f5","line":132,"in_reply_to":"adc20ec8_30742492","updated":"2025-09-01 14:38:50.000000000","message":"Done","commit_id":"1d9575e9014e777d811306d786813b69465a60fd"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"68de81f601adaf929c980ce1e722c6028a9ba3cc","unresolved":true,"context_lines":[{"line_number":132,"context_line":"                import json"},{"line_number":133,"context_line":"                try:"},{"line_number":134,"context_line":"                    value \u003d json.loads(value)"},{"line_number":135,"context_line":"                except ValueError:"},{"line_number":136,"context_line":"                    # Keep as plain string if not valid JSON"},{"line_number":137,"context_line":"                    pass"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"c3f89928_5da4961e","line":135,"updated":"2025-09-01 13:40:28.000000000","message":"I think we should also catch `UnicodeError` here as well. `json.loads` (https://docs.python.org/3.12/library/json.html#json.load) can raise both `JSONDecodeError` (which is properly handled by the `ValueError` except) and `UnicodeDecodeError` (which is a subclass of `UnicodeError`)","commit_id":"1d9575e9014e777d811306d786813b69465a60fd"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"01e52606adeec8bee7a00bc2250074f4054ffac9","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                import json"},{"line_number":133,"context_line":"                try:"},{"line_number":134,"context_line":"                    value \u003d json.loads(value)"},{"line_number":135,"context_line":"                except ValueError:"},{"line_number":136,"context_line":"                    # Keep as plain string if not valid JSON"},{"line_number":137,"context_line":"                    pass"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3dacbae1_68bc4202","line":135,"in_reply_to":"9d5b19bb_f78e85b7","updated":"2025-09-01 14:05:39.000000000","message":"thanks, I missed that, then the current code covers all cases","commit_id":"1d9575e9014e777d811306d786813b69465a60fd"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"013719158c75fbacd268b64feac988c66dbe4127","unresolved":true,"context_lines":[{"line_number":132,"context_line":"                import json"},{"line_number":133,"context_line":"                try:"},{"line_number":134,"context_line":"                    value \u003d json.loads(value)"},{"line_number":135,"context_line":"                except ValueError:"},{"line_number":136,"context_line":"                    # Keep as plain string if not valid JSON"},{"line_number":137,"context_line":"                    pass"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9d5b19bb_f78e85b7","line":135,"in_reply_to":"c3f89928_5da4961e","updated":"2025-09-01 14:00:37.000000000","message":"UnicodeError is also a subclass of ValueError[1]. But yeah, it is not clear at first look.\n\n[1] https://docs.python.org/3/library/exceptions.html#UnicodeError","commit_id":"1d9575e9014e777d811306d786813b69465a60fd"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c221f9af53ee1ac00d010db95eb94c55a1d5a4fe","unresolved":true,"context_lines":[{"line_number":141,"context_line":"                raise forms.ValidationError("},{"line_number":142,"context_line":"                    _(\u0027Error parsing parameter \"%s\": %s\u0027) % (line, str(e)))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        return parameters"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def clean(self):"},{"line_number":147,"context_line":"        cleaned_data \u003d super(CreateForm, self).clean()"}],"source_content_type":"text/x-python","patch_set":8,"id":"f11f1493_965b17a5","line":144,"updated":"2025-09-04 10:22:43.000000000","message":"im not sure how i feel about htis.\n\ni dont think this is the interface we want to commit to long term.\n\nmy inclination is to say either we shoudl be takign a json string\nor the ui shoudl allow you to specify each parameter in its own ui element\ni.e where you click a button to add a new row.\n\ndoing per line parsing by hand and splity on \u003d to sepeate the key and value use seams unnessary.\n\nparamaters are required to be a  json blob in the api\nand in the cli we take each parmater as a sepeate key value pair and internally genrate the value.\n\nwe shoudl do one or the other in the horizon.\nbut not have a custom ini like string representationt aht we parse and transform that is custom only to horizon","commit_id":"599dff913f1046d449629c92c8a9773fc1c65a3a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be1b9df964414a3ed5d4e2b40b8b592fb44c0b0d","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                raise forms.ValidationError("},{"line_number":142,"context_line":"                    _(\u0027Error parsing parameter \"%s\": %s\u0027) % (line, str(e)))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        return parameters"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def clean(self):"},{"line_number":147,"context_line":"        cleaned_data \u003d super(CreateForm, self).clean()"}],"source_content_type":"text/x-python","patch_set":8,"id":"ad2d18dc_6b7ea274","line":144,"in_reply_to":"45ed37f6_f03c3655","updated":"2025-09-16 17:01:13.000000000","message":"Done","commit_id":"599dff913f1046d449629c92c8a9773fc1c65a3a"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"584179312b91ba5fbcd34d487f213aa30329ac4a","unresolved":true,"context_lines":[{"line_number":141,"context_line":"                raise forms.ValidationError("},{"line_number":142,"context_line":"                    _(\u0027Error parsing parameter \"%s\": %s\u0027) % (line, str(e)))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        return parameters"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def clean(self):"},{"line_number":147,"context_line":"        cleaned_data \u003d super(CreateForm, self).clean()"}],"source_content_type":"text/x-python","patch_set":8,"id":"eda76507_b794222a","line":144,"in_reply_to":"c303810b_77f602b1","updated":"2025-09-05 08:00:44.000000000","message":"I also tried with button approach view Here are the ui generated\n- https://i.imgur.com/NQlwNoW.png and https://i.imgur.com/bz7HnNk.png, The View looks too complex.\n\nWhile json one looks https://i.imgur.com/BcJhpyc.png simple and clear.","commit_id":"599dff913f1046d449629c92c8a9773fc1c65a3a"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"4138ffbb47b52633832847e81cf2d0a6cae55746","unresolved":true,"context_lines":[{"line_number":141,"context_line":"                raise forms.ValidationError("},{"line_number":142,"context_line":"                    _(\u0027Error parsing parameter \"%s\": %s\u0027) % (line, str(e)))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        return parameters"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def clean(self):"},{"line_number":147,"context_line":"        cleaned_data \u003d super(CreateForm, self).clean()"}],"source_content_type":"text/x-python","patch_set":8,"id":"45ed37f6_f03c3655","line":144,"in_reply_to":"eda76507_b794222a","updated":"2025-09-05 18:16:48.000000000","message":"Good improvement indeed, both looks good.\nOne ui element per parameter may not scale in the future, depending on how strategies get improvements. I am ok with the json input here as well.","commit_id":"599dff913f1046d449629c92c8a9773fc1c65a3a"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"58e2802d8d52f5a32f5227030b0829f9142f5e20","unresolved":true,"context_lines":[{"line_number":141,"context_line":"                raise forms.ValidationError("},{"line_number":142,"context_line":"                    _(\u0027Error parsing parameter \"%s\": %s\u0027) % (line, str(e)))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        return parameters"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def clean(self):"},{"line_number":147,"context_line":"        cleaned_data \u003d super(CreateForm, self).clean()"}],"source_content_type":"text/x-python","patch_set":8,"id":"c303810b_77f602b1","line":144,"in_reply_to":"f11f1493_965b17a5","updated":"2025-09-04 13:35:22.000000000","message":"Thank you @seanmooney8202@yahoo.ie for the review, I will go with passing json string instead of adding a new row for each parameters and clicking on buttons. Passing jsob would be simpler.","commit_id":"599dff913f1046d449629c92c8a9773fc1c65a3a"}],"watcher_dashboard/content/audits/views.py":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"28eb4cd2ed4223e35526f56015af6c6e55e33744","unresolved":true,"context_lines":[{"line_number":130,"context_line":"        audit \u003d self._get_data()"},{"line_number":131,"context_line":"        context[\"audit\"] \u003d audit"},{"line_number":132,"context_line":"        # Prepare pretty parameters rendering (YAML) for the template"},{"line_number":133,"context_line":"        pretty_parameters \u003d None"},{"line_number":134,"context_line":"        try:"},{"line_number":135,"context_line":"            params \u003d getattr(audit, \u0027parameters\u0027, None)"},{"line_number":136,"context_line":"            obj \u003d params"},{"line_number":137,"context_line":"            if isinstance(params, str):"},{"line_number":138,"context_line":"                try:"},{"line_number":139,"context_line":"                    obj \u003d json.loads(params)"},{"line_number":140,"context_line":"                except Exception:"},{"line_number":141,"context_line":"                    obj \u003d params"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"            if isinstance(obj, (dict, list)):"},{"line_number":144,"context_line":"                dumped \u003d yaml.safe_dump("},{"line_number":145,"context_line":"                    obj,"},{"line_number":146,"context_line":"                    default_flow_style\u003dFalse,"},{"line_number":147,"context_line":"                    sort_keys\u003dFalse,"},{"line_number":148,"context_line":"                )"},{"line_number":149,"context_line":"                pretty_parameters \u003d mark_safe("},{"line_number":150,"context_line":"                    \u0027\u003cpre style\u003d\"margin:0\"\u003e{}\u003c/pre\u003e\u0027.format(dumped)"},{"line_number":151,"context_line":"                )"},{"line_number":152,"context_line":"            elif obj is not None:"},{"line_number":153,"context_line":"                pretty_parameters \u003d obj"},{"line_number":154,"context_line":"        except Exception:"},{"line_number":155,"context_line":"            pretty_parameters \u003d getattr(audit, \u0027parameters\u0027, None)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        context[\"audit_parameters_pretty\"] \u003d pretty_parameters"},{"line_number":158,"context_line":"        return context"},{"line_number":159,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"78d41b92_3c25cf5a","line":156,"range":{"start_line":133,"start_character":0,"end_line":156,"end_character":0},"updated":"2025-08-29 17:31:39.000000000","message":"it is hard to read/understand this part, not sure which case each line covers here. We need to improve testing on this to guarantee that makes sense, and include some comments for maintainence","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"439863d9637e0943d7f454ed7f73c599e0929f32","unresolved":true,"context_lines":[{"line_number":130,"context_line":"        audit \u003d self._get_data()"},{"line_number":131,"context_line":"        context[\"audit\"] \u003d audit"},{"line_number":132,"context_line":"        # Prepare pretty parameters rendering (YAML) for the template"},{"line_number":133,"context_line":"        pretty_parameters \u003d None"},{"line_number":134,"context_line":"        try:"},{"line_number":135,"context_line":"            params \u003d getattr(audit, \u0027parameters\u0027, None)"},{"line_number":136,"context_line":"            obj \u003d params"},{"line_number":137,"context_line":"            if isinstance(params, str):"},{"line_number":138,"context_line":"                try:"},{"line_number":139,"context_line":"                    obj \u003d json.loads(params)"},{"line_number":140,"context_line":"                except Exception:"},{"line_number":141,"context_line":"                    obj \u003d params"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"            if isinstance(obj, (dict, list)):"},{"line_number":144,"context_line":"                dumped \u003d yaml.safe_dump("},{"line_number":145,"context_line":"                    obj,"},{"line_number":146,"context_line":"                    default_flow_style\u003dFalse,"},{"line_number":147,"context_line":"                    sort_keys\u003dFalse,"},{"line_number":148,"context_line":"                )"},{"line_number":149,"context_line":"                pretty_parameters \u003d mark_safe("},{"line_number":150,"context_line":"                    \u0027\u003cpre style\u003d\"margin:0\"\u003e{}\u003c/pre\u003e\u0027.format(dumped)"},{"line_number":151,"context_line":"                )"},{"line_number":152,"context_line":"            elif obj is not None:"},{"line_number":153,"context_line":"                pretty_parameters \u003d obj"},{"line_number":154,"context_line":"        except Exception:"},{"line_number":155,"context_line":"            pretty_parameters \u003d getattr(audit, \u0027parameters\u0027, None)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        context[\"audit_parameters_pretty\"] \u003d pretty_parameters"},{"line_number":158,"context_line":"        return context"},{"line_number":159,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"a9f15ca8_a0703e83","line":156,"range":{"start_line":133,"start_character":0,"end_line":156,"end_character":0},"in_reply_to":"78d41b92_3c25cf5a","updated":"2025-09-01 04:18:32.000000000","message":"That piece was added to render the parameters in yaml format in Audit info view. Now It is refactored, move to a functions and more code comments are added.","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"ca28ae2a18b2ce23e0057833c382c0275ba2f328","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        audit \u003d self._get_data()"},{"line_number":131,"context_line":"        context[\"audit\"] \u003d audit"},{"line_number":132,"context_line":"        # Prepare pretty parameters rendering (YAML) for the template"},{"line_number":133,"context_line":"        pretty_parameters \u003d None"},{"line_number":134,"context_line":"        try:"},{"line_number":135,"context_line":"            params \u003d getattr(audit, \u0027parameters\u0027, None)"},{"line_number":136,"context_line":"            obj \u003d params"},{"line_number":137,"context_line":"            if isinstance(params, str):"},{"line_number":138,"context_line":"                try:"},{"line_number":139,"context_line":"                    obj \u003d json.loads(params)"},{"line_number":140,"context_line":"                except Exception:"},{"line_number":141,"context_line":"                    obj \u003d params"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"            if isinstance(obj, (dict, list)):"},{"line_number":144,"context_line":"                dumped \u003d yaml.safe_dump("},{"line_number":145,"context_line":"                    obj,"},{"line_number":146,"context_line":"                    default_flow_style\u003dFalse,"},{"line_number":147,"context_line":"                    sort_keys\u003dFalse,"},{"line_number":148,"context_line":"                )"},{"line_number":149,"context_line":"                pretty_parameters \u003d mark_safe("},{"line_number":150,"context_line":"                    \u0027\u003cpre style\u003d\"margin:0\"\u003e{}\u003c/pre\u003e\u0027.format(dumped)"},{"line_number":151,"context_line":"                )"},{"line_number":152,"context_line":"            elif obj is not None:"},{"line_number":153,"context_line":"                pretty_parameters \u003d obj"},{"line_number":154,"context_line":"        except Exception:"},{"line_number":155,"context_line":"            pretty_parameters \u003d getattr(audit, \u0027parameters\u0027, None)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        context[\"audit_parameters_pretty\"] \u003d pretty_parameters"},{"line_number":158,"context_line":"        return context"},{"line_number":159,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"0eedb0b4_c4e38f33","line":156,"range":{"start_line":133,"start_character":0,"end_line":156,"end_character":0},"in_reply_to":"973e5a2c_0e9a8eb5","updated":"2025-09-01 17:33:27.000000000","message":"Acknowledged","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"013719158c75fbacd268b64feac988c66dbe4127","unresolved":true,"context_lines":[{"line_number":130,"context_line":"        audit \u003d self._get_data()"},{"line_number":131,"context_line":"        context[\"audit\"] \u003d audit"},{"line_number":132,"context_line":"        # Prepare pretty parameters rendering (YAML) for the template"},{"line_number":133,"context_line":"        pretty_parameters \u003d None"},{"line_number":134,"context_line":"        try:"},{"line_number":135,"context_line":"            params \u003d getattr(audit, \u0027parameters\u0027, None)"},{"line_number":136,"context_line":"            obj \u003d params"},{"line_number":137,"context_line":"            if isinstance(params, str):"},{"line_number":138,"context_line":"                try:"},{"line_number":139,"context_line":"                    obj \u003d json.loads(params)"},{"line_number":140,"context_line":"                except Exception:"},{"line_number":141,"context_line":"                    obj \u003d params"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"            if isinstance(obj, (dict, list)):"},{"line_number":144,"context_line":"                dumped \u003d yaml.safe_dump("},{"line_number":145,"context_line":"                    obj,"},{"line_number":146,"context_line":"                    default_flow_style\u003dFalse,"},{"line_number":147,"context_line":"                    sort_keys\u003dFalse,"},{"line_number":148,"context_line":"                )"},{"line_number":149,"context_line":"                pretty_parameters \u003d mark_safe("},{"line_number":150,"context_line":"                    \u0027\u003cpre style\u003d\"margin:0\"\u003e{}\u003c/pre\u003e\u0027.format(dumped)"},{"line_number":151,"context_line":"                )"},{"line_number":152,"context_line":"            elif obj is not None:"},{"line_number":153,"context_line":"                pretty_parameters \u003d obj"},{"line_number":154,"context_line":"        except Exception:"},{"line_number":155,"context_line":"            pretty_parameters \u003d getattr(audit, \u0027parameters\u0027, None)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        context[\"audit_parameters_pretty\"] \u003d pretty_parameters"},{"line_number":158,"context_line":"        return context"},{"line_number":159,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"973e5a2c_0e9a8eb5","line":156,"range":{"start_line":133,"start_character":0,"end_line":156,"end_character":0},"in_reply_to":"a9f15ca8_a0703e83","updated":"2025-09-01 14:00:37.000000000","message":"thanks for the clarification here.","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"28eb4cd2ed4223e35526f56015af6c6e55e33744","unresolved":true,"context_lines":[{"line_number":176,"context_line":"        audit_template \u003d watcher.AuditTemplate.get("},{"line_number":177,"context_line":"            request, audit_template_uuid)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        if not audit_template.strategy_uuid:"},{"line_number":180,"context_line":"            return JsonResponse({"},{"line_number":181,"context_line":"                \u0027strategy_name\u0027: audit_template.strategy_name or \u0027auto\u0027,"},{"line_number":182,"context_line":"                \u0027parameters_spec\u0027: {},"}],"source_content_type":"text/x-python","patch_set":6,"id":"0c30142e_1530921c","line":179,"range":{"start_line":179,"start_character":0,"end_line":179,"end_character":44},"updated":"2025-08-29 17:31:39.000000000","message":"+1, working fine","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"013719158c75fbacd268b64feac988c66dbe4127","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        audit_template \u003d watcher.AuditTemplate.get("},{"line_number":177,"context_line":"            request, audit_template_uuid)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        if not audit_template.strategy_uuid:"},{"line_number":180,"context_line":"            return JsonResponse({"},{"line_number":181,"context_line":"                \u0027strategy_name\u0027: audit_template.strategy_name or \u0027auto\u0027,"},{"line_number":182,"context_line":"                \u0027parameters_spec\u0027: {},"}],"source_content_type":"text/x-python","patch_set":6,"id":"8441e0d6_65269852","line":179,"range":{"start_line":179,"start_character":0,"end_line":179,"end_character":44},"in_reply_to":"0c30142e_1530921c","updated":"2025-09-01 14:00:37.000000000","message":"Done","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"68de81f601adaf929c980ce1e722c6028a9ba3cc","unresolved":true,"context_lines":[{"line_number":153,"context_line":"            # Any unexpected issue: show the raw parameters."},{"line_number":154,"context_line":"            return params"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        return None"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def get_related_action_plans_data(self):"},{"line_number":159,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"636cc6b3_46438ed6","line":156,"updated":"2025-09-01 13:40:28.000000000","message":"nit: we don\u0027t need this line, python will do that if it reaches the end of the function.","commit_id":"1d9575e9014e777d811306d786813b69465a60fd"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"5f3a94118cb6c6f18a9fd6e26eacb57927ec1631","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            # Any unexpected issue: show the raw parameters."},{"line_number":154,"context_line":"            return params"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        return None"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def get_related_action_plans_data(self):"},{"line_number":159,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"d1ac90c4_526c9929","line":156,"in_reply_to":"636cc6b3_46438ed6","updated":"2025-09-01 14:38:50.000000000","message":"Done","commit_id":"1d9575e9014e777d811306d786813b69465a60fd"}],"watcher_dashboard/templates/infra_optim/audits/_create.html":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"62ce6627e0b668f01706e8ddf87bc9f5aed66d36","unresolved":true,"context_lines":[{"line_number":51,"context_line":"          data: { audit_template_uuid: auditTemplateUuid },"},{"line_number":52,"context_line":"          success: function(data) {"},{"line_number":53,"context_line":"            loadingDiv.hide();"},{"line_number":54,"context_line":"            "},{"line_number":55,"context_line":"            if (data.error) {"},{"line_number":56,"context_line":"              console.error(\u0027Error loading strategy parameters:\u0027, data.error);"},{"line_number":57,"context_line":"              return;"}],"source_content_type":"text/html","patch_set":3,"id":"65bcb599_f9b230bf","line":54,"range":{"start_line":54,"start_character":0,"end_line":54,"end_character":12},"updated":"2025-08-21 08:43:57.000000000","message":"extra spaces","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"e55840dfe2918d51db3796d2ca4282fd1ef9713e","unresolved":false,"context_lines":[{"line_number":51,"context_line":"          data: { audit_template_uuid: auditTemplateUuid },"},{"line_number":52,"context_line":"          success: function(data) {"},{"line_number":53,"context_line":"            loadingDiv.hide();"},{"line_number":54,"context_line":"            "},{"line_number":55,"context_line":"            if (data.error) {"},{"line_number":56,"context_line":"              console.error(\u0027Error loading strategy parameters:\u0027, data.error);"},{"line_number":57,"context_line":"              return;"}],"source_content_type":"text/html","patch_set":3,"id":"b1391a8a_14641330","line":54,"range":{"start_line":54,"start_character":0,"end_line":54,"end_character":12},"in_reply_to":"65bcb599_f9b230bf","updated":"2025-08-29 11:56:07.000000000","message":"Done","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"62ce6627e0b668f01706e8ddf87bc9f5aed66d36","unresolved":true,"context_lines":[{"line_number":58,"context_line":"            }"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"            strategyName.text(\u0027Strategy: \u0027 + data.strategy_name);"},{"line_number":61,"context_line":"            "},{"line_number":62,"context_line":"            var paramHtml \u003d \u0027\u0027;"},{"line_number":63,"context_line":"            if (data.parameters_spec \u0026\u0026 Object.keys(data.parameters_spec).length \u003e 0) {"},{"line_number":64,"context_line":"              paramHtml \u003d \u0027\u003cp\u003e\u003cstrong\u003eAvailable parameters:\u003c/strong\u003e\u003c/p\u003e\u003cul style\u003d\"margin: 5px 0; padding-left: 20px;\"\u003e\u0027;"}],"source_content_type":"text/html","patch_set":3,"id":"dd67657b_a9be8341","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":12},"updated":"2025-08-21 08:43:57.000000000","message":"ditto","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"e55840dfe2918d51db3796d2ca4282fd1ef9713e","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            }"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"            strategyName.text(\u0027Strategy: \u0027 + data.strategy_name);"},{"line_number":61,"context_line":"            "},{"line_number":62,"context_line":"            var paramHtml \u003d \u0027\u0027;"},{"line_number":63,"context_line":"            if (data.parameters_spec \u0026\u0026 Object.keys(data.parameters_spec).length \u003e 0) {"},{"line_number":64,"context_line":"              paramHtml \u003d \u0027\u003cp\u003e\u003cstrong\u003eAvailable parameters:\u003c/strong\u003e\u003c/p\u003e\u003cul style\u003d\"margin: 5px 0; padding-left: 20px;\"\u003e\u0027;"}],"source_content_type":"text/html","patch_set":3,"id":"5dd83122_e6e7880e","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":12},"in_reply_to":"dd67657b_a9be8341","updated":"2025-08-29 11:56:07.000000000","message":"Done","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"62ce6627e0b668f01706e8ddf87bc9f5aed66d36","unresolved":true,"context_lines":[{"line_number":65,"context_line":"              for (var param in data.parameters_spec) {"},{"line_number":66,"context_line":"                var spec \u003d data.parameters_spec[param];"},{"line_number":67,"context_line":"                var typeInfo \u003d spec.type ? \u0027 (\u0027 + spec.type + \u0027)\u0027 : \u0027\u0027;"},{"line_number":68,"context_line":"                var defaultInfo \u003d spec.default !\u003d\u003d undefined ? \u0027 [default: \u0027 + spec.default + \u0027]\u0027 : \u0027\u0027;"},{"line_number":69,"context_line":"                var description \u003d spec.description ? \u0027 - \u0027 + spec.description : \u0027\u0027;"},{"line_number":70,"context_line":"                paramHtml +\u003d \u0027\u003cli style\u003d\"margin: 2px 0;\"\u003e\u003ccode\u003e\u0027 + param + \u0027\u003c/code\u003e\u0027 + typeInfo + defaultInfo + description + \u0027\u003c/li\u003e\u0027;"},{"line_number":71,"context_line":"              }"}],"source_content_type":"text/html","patch_set":3,"id":"1ca7c7b5_9d4c9625","line":68,"updated":"2025-08-21 08:43:57.000000000","message":"There is something not working properly while displaying the default values. i.e. for workload_stabilization, for the threshold parameter I find (similar for other parameters where values are dicts):\n\nthresholds (object) [default: [object Object]] - Dict where key is a metric and value is a trigger value.\n\nWhile it should be:\n\nthresholds (object) [default: {\"instance_cpu_usage\": 0.1, \"instance_ram_usage\": 0.1}}] - Dict where key is a metric and value is a trigger value.\n\nnit: using [] as delimiters for documenting the default can be missleading as it\u0027s used in json syntax. I\u0027d propose:\n\nthresholds (type: object) - default: {\"instance_cpu_usage\": 0.1, \"instance_ram_usage\": 0.1}} - Dict where key is a metric and value is a trigger value.","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"e55840dfe2918d51db3796d2ca4282fd1ef9713e","unresolved":false,"context_lines":[{"line_number":65,"context_line":"              for (var param in data.parameters_spec) {"},{"line_number":66,"context_line":"                var spec \u003d data.parameters_spec[param];"},{"line_number":67,"context_line":"                var typeInfo \u003d spec.type ? \u0027 (\u0027 + spec.type + \u0027)\u0027 : \u0027\u0027;"},{"line_number":68,"context_line":"                var defaultInfo \u003d spec.default !\u003d\u003d undefined ? \u0027 [default: \u0027 + spec.default + \u0027]\u0027 : \u0027\u0027;"},{"line_number":69,"context_line":"                var description \u003d spec.description ? \u0027 - \u0027 + spec.description : \u0027\u0027;"},{"line_number":70,"context_line":"                paramHtml +\u003d \u0027\u003cli style\u003d\"margin: 2px 0;\"\u003e\u003ccode\u003e\u0027 + param + \u0027\u003c/code\u003e\u0027 + typeInfo + defaultInfo + description + \u0027\u003c/li\u003e\u0027;"},{"line_number":71,"context_line":"              }"}],"source_content_type":"text/html","patch_set":3,"id":"058c44a0_4751520f","line":68,"in_reply_to":"1ca7c7b5_9d4c9625","updated":"2025-08-29 11:56:07.000000000","message":"Done","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"62ce6627e0b668f01706e8ddf87bc9f5aed66d36","unresolved":true,"context_lines":[{"line_number":75,"context_line":"            } else {"},{"line_number":76,"context_line":"              paramHtml \u003d \u0027\u003cp\u003e\u003cem\u003eNo parameter specifications available for this strategy.\u003c/em\u003e\u003c/p\u003e\u0027;"},{"line_number":77,"context_line":"            }"},{"line_number":78,"context_line":"            "},{"line_number":79,"context_line":"            parametersList.html(paramHtml);"},{"line_number":80,"context_line":"            strategyInfo.show();"},{"line_number":81,"context_line":"          },"}],"source_content_type":"text/html","patch_set":3,"id":"8ce9ee37_f97d23e5","line":78,"range":{"start_line":78,"start_character":0,"end_line":78,"end_character":12},"updated":"2025-08-21 08:43:57.000000000","message":"extra spaces","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"e55840dfe2918d51db3796d2ca4282fd1ef9713e","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            } else {"},{"line_number":76,"context_line":"              paramHtml \u003d \u0027\u003cp\u003e\u003cem\u003eNo parameter specifications available for this strategy.\u003c/em\u003e\u003c/p\u003e\u0027;"},{"line_number":77,"context_line":"            }"},{"line_number":78,"context_line":"            "},{"line_number":79,"context_line":"            parametersList.html(paramHtml);"},{"line_number":80,"context_line":"            strategyInfo.show();"},{"line_number":81,"context_line":"          },"}],"source_content_type":"text/html","patch_set":3,"id":"b10aa8eb_8549a608","line":78,"range":{"start_line":78,"start_character":0,"end_line":78,"end_character":12},"in_reply_to":"8ce9ee37_f97d23e5","updated":"2025-08-29 11:56:07.000000000","message":"Done","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"28eb4cd2ed4223e35526f56015af6c6e55e33744","unresolved":true,"context_lines":[{"line_number":37,"context_line":"      var strategyName \u003d $(\u0027#strategy-name\u0027);"},{"line_number":38,"context_line":"      var parametersList \u003d $(\u0027#parameters-list\u0027);"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"      function loadStrategyParameters(auditTemplateUuid) {"},{"line_number":41,"context_line":"        if (!auditTemplateUuid) {"},{"line_number":42,"context_line":"          strategyInfo.hide();"},{"line_number":43,"context_line":"          return;"}],"source_content_type":"text/html","patch_set":6,"id":"15a52222_fe853c18","line":40,"range":{"start_line":40,"start_character":15,"end_line":40,"end_character":37},"updated":"2025-08-29 17:31:39.000000000","message":"+1: the outputs looks good, nice","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"4138ffbb47b52633832847e81cf2d0a6cae55746","unresolved":false,"context_lines":[{"line_number":37,"context_line":"      var strategyName \u003d $(\u0027#strategy-name\u0027);"},{"line_number":38,"context_line":"      var parametersList \u003d $(\u0027#parameters-list\u0027);"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"      function loadStrategyParameters(auditTemplateUuid) {"},{"line_number":41,"context_line":"        if (!auditTemplateUuid) {"},{"line_number":42,"context_line":"          strategyInfo.hide();"},{"line_number":43,"context_line":"          return;"}],"source_content_type":"text/html","patch_set":6,"id":"3aa44931_db166dc2","line":40,"range":{"start_line":40,"start_character":15,"end_line":40,"end_character":37},"in_reply_to":"15a52222_fe853c18","updated":"2025-09-05 18:16:48.000000000","message":"Done","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"28eb4cd2ed4223e35526f56015af6c6e55e33744","unresolved":true,"context_lines":[{"line_number":87,"context_line":"            } else {"},{"line_number":88,"context_line":"              paramHtml \u003d \u0027\u003cp\u003e\u003cem\u003eNo parameter specifications available for this strategy.\u003c/em\u003e\u003c/p\u003e\u0027;"},{"line_number":89,"context_line":"            }"},{"line_number":90,"context_line":"            "},{"line_number":91,"context_line":"            parametersList.html(paramHtml);"},{"line_number":92,"context_line":"            strategyInfo.show();"},{"line_number":93,"context_line":"          },"}],"source_content_type":"text/html","patch_set":6,"id":"20081442_242cd989","line":90,"range":{"start_line":90,"start_character":0,"end_line":90,"end_character":12},"updated":"2025-08-29 17:31:39.000000000","message":"delete","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"439863d9637e0943d7f454ed7f73c599e0929f32","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            } else {"},{"line_number":88,"context_line":"              paramHtml \u003d \u0027\u003cp\u003e\u003cem\u003eNo parameter specifications available for this strategy.\u003c/em\u003e\u003c/p\u003e\u0027;"},{"line_number":89,"context_line":"            }"},{"line_number":90,"context_line":"            "},{"line_number":91,"context_line":"            parametersList.html(paramHtml);"},{"line_number":92,"context_line":"            strategyInfo.show();"},{"line_number":93,"context_line":"          },"}],"source_content_type":"text/html","patch_set":6,"id":"fa0b8f4d_fd5ad552","line":90,"range":{"start_line":90,"start_character":0,"end_line":90,"end_character":12},"in_reply_to":"20081442_242cd989","updated":"2025-09-01 04:18:32.000000000","message":"Done","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"28eb4cd2ed4223e35526f56015af6c6e55e33744","unresolved":true,"context_lines":[{"line_number":97,"context_line":"          }"},{"line_number":98,"context_line":"        });"},{"line_number":99,"context_line":"      }"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"      // Load parameters when audit template changes"},{"line_number":102,"context_line":"      auditTemplateSelect.change(function() {"},{"line_number":103,"context_line":"        loadStrategyParameters($(this).val());"},{"line_number":104,"context_line":"      });"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"      // Load parameters for initially selected template"},{"line_number":107,"context_line":"      if (auditTemplateSelect.val()) {"},{"line_number":108,"context_line":"        loadStrategyParameters(auditTemplateSelect.val());"},{"line_number":109,"context_line":"      }"},{"line_number":110,"context_line":"    });"},{"line_number":111,"context_line":"  \u003c/script\u003e"},{"line_number":112,"context_line":"{% endblock %}"}],"source_content_type":"text/html","patch_set":6,"id":"b585eacf_bc043dc9","line":109,"range":{"start_line":100,"start_character":0,"end_line":109,"end_character":7},"updated":"2025-08-29 17:31:39.000000000","message":"When we are in the Audit Create form and we create a new Audit Template using the + button, it selects the new audit template but doesn\u0027t load the strategy parameters. We need to select other audit template and then switch back to the new audit template, then it loads the parameters. Is this working for you?","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"439863d9637e0943d7f454ed7f73c599e0929f32","unresolved":true,"context_lines":[{"line_number":97,"context_line":"          }"},{"line_number":98,"context_line":"        });"},{"line_number":99,"context_line":"      }"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"      // Load parameters when audit template changes"},{"line_number":102,"context_line":"      auditTemplateSelect.change(function() {"},{"line_number":103,"context_line":"        loadStrategyParameters($(this).val());"},{"line_number":104,"context_line":"      });"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"      // Load parameters for initially selected template"},{"line_number":107,"context_line":"      if (auditTemplateSelect.val()) {"},{"line_number":108,"context_line":"        loadStrategyParameters(auditTemplateSelect.val());"},{"line_number":109,"context_line":"      }"},{"line_number":110,"context_line":"    });"},{"line_number":111,"context_line":"  \u003c/script\u003e"},{"line_number":112,"context_line":"{% endblock %}"}],"source_content_type":"text/html","patch_set":6,"id":"d648b223_c1fd0d84","line":109,"range":{"start_line":100,"start_character":0,"end_line":109,"end_character":7},"in_reply_to":"b585eacf_bc043dc9","updated":"2025-09-01 04:18:32.000000000","message":"Yes, I am hitting the same issue. But now it is fixed with Mutationobserver https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver. Thank you!","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"013719158c75fbacd268b64feac988c66dbe4127","unresolved":false,"context_lines":[{"line_number":97,"context_line":"          }"},{"line_number":98,"context_line":"        });"},{"line_number":99,"context_line":"      }"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"      // Load parameters when audit template changes"},{"line_number":102,"context_line":"      auditTemplateSelect.change(function() {"},{"line_number":103,"context_line":"        loadStrategyParameters($(this).val());"},{"line_number":104,"context_line":"      });"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"      // Load parameters for initially selected template"},{"line_number":107,"context_line":"      if (auditTemplateSelect.val()) {"},{"line_number":108,"context_line":"        loadStrategyParameters(auditTemplateSelect.val());"},{"line_number":109,"context_line":"      }"},{"line_number":110,"context_line":"    });"},{"line_number":111,"context_line":"  \u003c/script\u003e"},{"line_number":112,"context_line":"{% endblock %}"}],"source_content_type":"text/html","patch_set":6,"id":"50c652e0_ebcbce6a","line":109,"range":{"start_line":100,"start_character":0,"end_line":109,"end_character":7},"in_reply_to":"d648b223_c1fd0d84","updated":"2025-09-01 14:00:37.000000000","message":"Thanks, it works as was expecting now.","commit_id":"dcc8c417ddb28549e1c851569e22cc0ca83298f2"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be1b9df964414a3ed5d4e2b40b8b592fb44c0b0d","unresolved":true,"context_lines":[{"line_number":143,"context_line":"        loadStrategyParameters(auditTemplateSelect.val());"},{"line_number":144,"context_line":"      }"},{"line_number":145,"context_line":"    });"},{"line_number":146,"context_line":"  \u003c/script\u003e"},{"line_number":147,"context_line":"{% endblock %}"}],"source_content_type":"text/html","patch_set":9,"id":"3c362bfd_0d680701","line":146,"updated":"2025-09-16 17:01:13.000000000","message":"in general we shoudl keep the amount of JavaScript we have to an absolute minimum.\n\nin the future i think this is a very good use case for using htmx\nbu ti think this is probably acceptable for now.","commit_id":"6552f02ca69dacb4532bcfc3d0a3eb066f7e1a27"}],"watcher_dashboard/templates/infra_optim/audits/details.html":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"62ce6627e0b668f01706e8ddf87bc9f5aed66d36","unresolved":true,"context_lines":[{"line_number":19,"context_line":"        \u003cdd\u003e{{ audit.strategy_name|default:_(\"-\") }}\u003c/dd\u003e"},{"line_number":20,"context_line":"        \u003cdt\u003e{% trans \"Type\" %}\u003c/dt\u003e"},{"line_number":21,"context_line":"        \u003cdd\u003e{{ audit.audit_type|default:_(\"-\") }}\u003c/dd\u003e"},{"line_number":22,"context_line":"        {% if audit.parameters %}"},{"line_number":23,"context_line":"        \u003cdt\u003e{% trans \"Parameters\" %}\u003c/dt\u003e"},{"line_number":24,"context_line":"        \u003cdd\u003e{{ audit.parameters|default:_(\"-\") }}\u003c/dd\u003e"},{"line_number":25,"context_line":"        {% endif %}"}],"source_content_type":"text/html","patch_set":3,"id":"56bcdd9e_0fc9593e","line":22,"updated":"2025-08-21 08:43:57.000000000","message":"+1 to list parameters in  audit detailed view. May we show it in a more friendly way instead of a oneline json?, maybe yaml is more readable, although in some cases it may be too big, i\u0027m not sure... In a workload_balancing strategy, i see:\n\nParameters: \n```\n{\u0027metrics\u0027: [\u0027instance_cpu_usage\u0027, \u0027instance_ram_usage\u0027], \u0027thresholds\u0027: {\u0027instance_cpu_usage\u0027: 0.3, \u0027instance_ram_usage\u0027: 0.4}, \u0027weights\u0027: {\u0027instance_cpu_usage_weight\u0027: 1.0, \u0027instance_ram_usage_weight\u0027: 1.0}, \u0027instance_metrics\u0027: {\u0027instance_cpu_usage\u0027: \u0027host_cpu_usage\u0027, \u0027instance_ram_usage\u0027: \u0027host_ram_usage\u0027}, \u0027host_choice\u0027: \u0027retry\u0027, \u0027retry_count\u0027: 1, \u0027periods\u0027: {\u0027instance\u0027: 720, \u0027compute_node\u0027: 600, \u0027node\u0027: 0}, \u0027aggregation_method\u0027: {\u0027instance\u0027: \u0027mean\u0027, \u0027compute_node\u0027: \u0027mean\u0027, \u0027node\u0027: \u0027\u0027}, \u0027granularity\u0027: 300}\n```\n\nprinting yaml it\u0027dd be something like:\n\nParameters:\n```\nmetrics:\n  - instance_cpu_usage\nthresholds:\n  instance_cpu_usage: 1\n  instance_ram_usage: 1\nweights:\n  instance_cpu_usage_weight: 1\n  instance_ram_usage_weight: 1\ninstance_metrics:\n  instance_cpu_usage: host_cpu_usage\n  instance_ram_usage: host_ram_usage\nhost_choice: retry\nretry_count: 1\nperiods:\n  instance: 720\n  compute_node: 600\n  node: 0\naggregation_method:\n  instance: mean\n  compute_node: mean\n  node: \"\"\ngranularity: 300\n```\nI\u0027m not sure, tbh, wdyt?","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"e55840dfe2918d51db3796d2ca4282fd1ef9713e","unresolved":true,"context_lines":[{"line_number":19,"context_line":"        \u003cdd\u003e{{ audit.strategy_name|default:_(\"-\") }}\u003c/dd\u003e"},{"line_number":20,"context_line":"        \u003cdt\u003e{% trans \"Type\" %}\u003c/dt\u003e"},{"line_number":21,"context_line":"        \u003cdd\u003e{{ audit.audit_type|default:_(\"-\") }}\u003c/dd\u003e"},{"line_number":22,"context_line":"        {% if audit.parameters %}"},{"line_number":23,"context_line":"        \u003cdt\u003e{% trans \"Parameters\" %}\u003c/dt\u003e"},{"line_number":24,"context_line":"        \u003cdd\u003e{{ audit.parameters|default:_(\"-\") }}\u003c/dd\u003e"},{"line_number":25,"context_line":"        {% endif %}"}],"source_content_type":"text/html","patch_set":3,"id":"8385e16d_dfd23708","line":22,"in_reply_to":"56bcdd9e_0fc9593e","updated":"2025-08-29 11:56:07.000000000","message":"convert it to yaml format.","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"439863d9637e0943d7f454ed7f73c599e0929f32","unresolved":false,"context_lines":[{"line_number":19,"context_line":"        \u003cdd\u003e{{ audit.strategy_name|default:_(\"-\") }}\u003c/dd\u003e"},{"line_number":20,"context_line":"        \u003cdt\u003e{% trans \"Type\" %}\u003c/dt\u003e"},{"line_number":21,"context_line":"        \u003cdd\u003e{{ audit.audit_type|default:_(\"-\") }}\u003c/dd\u003e"},{"line_number":22,"context_line":"        {% if audit.parameters %}"},{"line_number":23,"context_line":"        \u003cdt\u003e{% trans \"Parameters\" %}\u003c/dt\u003e"},{"line_number":24,"context_line":"        \u003cdd\u003e{{ audit.parameters|default:_(\"-\") }}\u003c/dd\u003e"},{"line_number":25,"context_line":"        {% endif %}"}],"source_content_type":"text/html","patch_set":3,"id":"3fcf552c_d6a7c0e5","line":22,"in_reply_to":"8385e16d_dfd23708","updated":"2025-09-01 04:18:32.000000000","message":"Done","commit_id":"29d27b99675e537bcc7bafc323e67c633185e0d8"}]}
