)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"171fc9412bb71015f4b7c3c6e2d55b0df3c0efd6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"c3f88bd2_7a62830a","updated":"2026-05-06 18:23:03.000000000","message":"looks good","commit_id":"4500afca10c9d2cc257715c07f8209188b81eaa3"}],"watcher_dashboard/content/goals/views.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"c0697c30d1770fe3cfbb3a657a6ab8a37ec7b945","unresolved":true,"context_lines":[{"line_number":111,"context_line":"            goal \u003d self._get_data()"},{"line_number":112,"context_line":"            indicators_spec \u003d ["},{"line_number":113,"context_line":"                watcher.EfficacyIndicatorSpec(spec)"},{"line_number":114,"context_line":"                for spec in goal.efficacy_specifications"},{"line_number":115,"context_line":"            ]"},{"line_number":116,"context_line":"        except Exception as exc:"},{"line_number":117,"context_line":"            LOG.exception(exc)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9941f151_207d156f","line":114,"range":{"start_line":114,"start_character":28,"end_line":114,"end_character":56},"updated":"2026-04-16 12:18:07.000000000","message":"I think this plural is wrong, API provides `efficacy_specification` and watcher.Goal.get(self.request, goal_uuid) is returning directly the api returned data.\n\nhttps://docs.openstack.org/api-ref/resource-optimization/#list-goal-detailed\n\nActually, the efficacy indicators are properly shown in the goals detail table in the dashboard now.","commit_id":"40f34ec36476dfcc1ba82ad388b2eea6f702c1af"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"17368c549775ea1557788986842bfef72dfb01dc","unresolved":true,"context_lines":[{"line_number":111,"context_line":"            goal \u003d self._get_data()"},{"line_number":112,"context_line":"            indicators_spec \u003d ["},{"line_number":113,"context_line":"                watcher.EfficacyIndicatorSpec(spec)"},{"line_number":114,"context_line":"                for spec in goal.efficacy_specifications"},{"line_number":115,"context_line":"            ]"},{"line_number":116,"context_line":"        except Exception as exc:"},{"line_number":117,"context_line":"            LOG.exception(exc)"}],"source_content_type":"text/x-python","patch_set":4,"id":"e0600fe1_b63fefe6","line":114,"range":{"start_line":114,"start_character":28,"end_line":114,"end_character":56},"in_reply_to":"0c3017a9_0cacde37","updated":"2026-04-16 14:11:44.000000000","message":"From a local test:\n\nfrom watcher_dashboard.api import watcher\n\n... create the request object manually ...\n\ngoaltest \u003d watcher.Goal.get(request, \u0027df4fac9b-67e4-4a69-a8a4-85eb0852e165\u0027)\n\n\ngoaltest\n\u003cGoal {\u0027uuid\u0027: \u0027df4fac9b-67e4-4a69-a8a4-85eb0852e165\u0027, \u0027name\u0027: \u0027workload_balancing\u0027, \u0027display_name\u0027: \u0027Workload Balancing\u0027, \u0027efficacy_specification\u0027: [{\u0027name\u0027: \u0027instance_migrations_count\u0027, \u0027description\u0027: \u0027The number of VM migrations to be performed.\u0027, \u0027unit\u0027: None, \u0027schema\u0027: \u0027{\"type\": \"integer\", \"minimum\": 0}\u0027}, {\u0027name\u0027: \u0027instances_count\u0027, \u0027description\u0027: \u0027The total number of audited instances in strategy.\u0027, \u0027unit\u0027: None, \u0027schema\u0027: \u0027{\"type\": \"integer\", \"minimum\": 0}\u0027}, {\u0027name\u0027: \u0027standard_deviation_after_audit\u0027, \u0027description\u0027: \u0027The value of resulted standard deviation.\u0027, \u0027unit\u0027: None, \u0027schema\u0027: \u0027{\"type\": \"number\", \"minimum\": 0}\u0027}, {\u0027name\u0027: \u0027standard_deviation_before_audit\u0027, \u0027description\u0027: \u0027The value of original standard deviation.\u0027, \u0027unit\u0027: None, \u0027schema\u0027: \u0027{\"type\": \"number\", \"minimum\": 0}\u0027}], \u0027links\u0027: [{\u0027href\u0027: \u0027https://watcher-internal.openstack.svc:9322/v1/goals/df4fac9b-67e4-4a69-a8a4-85eb0852e165\u0027, \u0027rel\u0027: \u0027self\u0027}, {\u0027href\u0027: \u0027https://watcher-internal.openstack.svc:9322/goals/df4fac9b-67e4-4a69-a8a4-85eb0852e165\u0027, \u0027rel\u0027: \u0027bookmark\u0027}], \u0027created_at\u0027: \u00272026-04-15T10:05:45+00:00\u0027, \u0027updated_at\u0027: None, \u0027deleted_at\u0027: None}\u003e\n\n\ntype(goaltest)\n\u003cclass \u0027watcherclient.v1.goal.Goal\u0027\u003e\n\n\nso, iiuc the get() is returning a watcherclient object with the `efficacy_specification` as specified in the api.","commit_id":"40f34ec36476dfcc1ba82ad388b2eea6f702c1af"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b771906910b95855454defb2fb505b59479ec5e2","unresolved":true,"context_lines":[{"line_number":111,"context_line":"            goal \u003d self._get_data()"},{"line_number":112,"context_line":"            indicators_spec \u003d ["},{"line_number":113,"context_line":"                watcher.EfficacyIndicatorSpec(spec)"},{"line_number":114,"context_line":"                for spec in goal.efficacy_specifications"},{"line_number":115,"context_line":"            ]"},{"line_number":116,"context_line":"        except Exception as exc:"},{"line_number":117,"context_line":"            LOG.exception(exc)"}],"source_content_type":"text/x-python","patch_set":4,"id":"0c3017a9_0cacde37","line":114,"range":{"start_line":114,"start_character":28,"end_line":114,"end_character":56},"in_reply_to":"9941f151_207d156f","updated":"2026-04-16 13:15:54.000000000","message":"so goal is watcher.Goal.get(self.request, goal_uuid)\n\nand here we defien it with an s\n\nhttps://github.com/openstack/watcher-dashboard/blob/master/watcher_dashboard/api/watcher.py#L492-L493\n\nwe are currntly incorrectly using \nbase.APIDictWrapper form \n\nfrom openstack_dashboard.api import base\n\n\nthat is the horizon applcaiton which plugins are not allowed to use.\n\ntaht is defiend here \n\nhttps://github.com/openstack/horizon/blob/cf866d1cf346449b9d0bed7e2c67c5fdd50d1fd4/openstack_dashboard/api/base.py#L163\n\nthe data si fetched usign the watcher client\n\nhttps://github.com/openstack/watcher-dashboard/blob/master/watcher_dashboard/api/watcher.py#L528C16-L528C53\n\nusing the v1 api https://github.com/openstack/python-watcherclient/blob/master/watcherclient/v1/goal.py\n\nwhich ultimatley uses \nhttps://github.com/openstack/python-watcherclient/blob/master/watcherclient/common/apiclient/base.py#L438\nfor the pasing\n\nso dont see anyu conversion code ebtween thte two but the eixting test use\nefficacy_specifications\n\nhttps://github.com/openstack/watcher-dashboard/blob/af8ffd4706a8c646db325f908ef82d5baed1e7de/watcher_dashboard/test/test_data/watcher_data.py#L38\n\n\nlooking at watcher i only see efficacy_specification\n\nto the qorrect fix is to fix this the other way.\n\nwe shoudl update all the existing usage of \n\nefficacy_specifications to be efficacy_specification","commit_id":"40f34ec36476dfcc1ba82ad388b2eea6f702c1af"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4f8013848fcd536dc997dbbca449641ff1dc1efe","unresolved":true,"context_lines":[{"line_number":111,"context_line":"            goal \u003d self._get_data()"},{"line_number":112,"context_line":"            indicators_spec \u003d ["},{"line_number":113,"context_line":"                watcher.EfficacyIndicatorSpec(spec)"},{"line_number":114,"context_line":"                for spec in goal.efficacy_specifications"},{"line_number":115,"context_line":"            ]"},{"line_number":116,"context_line":"        except Exception as exc:"},{"line_number":117,"context_line":"            LOG.exception(exc)"}],"source_content_type":"text/x-python","patch_set":4,"id":"03b8bc57_07018325","line":114,"range":{"start_line":114,"start_character":28,"end_line":114,"end_character":56},"in_reply_to":"e0600fe1_b63fefe6","updated":"2026-04-16 14:25:08.000000000","message":"yep that because all of our warpepr classes have the same bug\nwe are not converting the obejct form teh watcher client into them\n\nthat a seperate thing we need to fix but i intenrually didnt do it in htis series.\n\nbut cool ill fix the tests to mimic reality","commit_id":"40f34ec36476dfcc1ba82ad388b2eea6f702c1af"}]}
