)]}'
{".zuul.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3ae03a963eb67641fa08ab52185869be2b85c7db","unresolved":true,"context_lines":[{"line_number":339,"context_line":"    periodic-weekly:"},{"line_number":340,"context_line":"      jobs:"},{"line_number":341,"context_line":"        - watcher-prometheus-integration-realdata"},{"line_number":342,"context_line":"        - watcher-aetos-integration-realdata"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"ba92f85e_ec7c17d8","line":342,"updated":"2025-08-06 14:20:21.000000000","message":"the ci change look good to me in general","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"4f4e30b8b4a771e4dc6d392e7c951b77ee1ace71","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    periodic-weekly:"},{"line_number":340,"context_line":"      jobs:"},{"line_number":341,"context_line":"        - watcher-prometheus-integration-realdata"},{"line_number":342,"context_line":"        - watcher-aetos-integration-realdata"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"9c9af807_f691a506","line":342,"in_reply_to":"ba92f85e_ec7c17d8","updated":"2025-08-06 15:41:52.000000000","message":"Acknowledged","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b7513f73826181c0f0f038e1fda85ef1fcf0933d","unresolved":true,"context_lines":[{"line_number":281,"context_line":"        test-config:"},{"line_number":282,"context_line":"          $TEMPEST_CONFIG:"},{"line_number":283,"context_line":"            optimize:"},{"line_number":284,"context_line":"              datasource: prometheus"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"- job:"},{"line_number":287,"context_line":"    name: watcher-prometheus-integration-realdata"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"884db001_c0b4f95a","line":284,"range":{"start_line":284,"start_character":26,"end_line":284,"end_character":36},"updated":"2025-08-07 18:27:18.000000000","message":"I think we could easily support both names in tempest-plugin with few changes too. But not a hard requirement, just something that we could do later.","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"35908a90fb6e27cb6bb64c7d71af67cbafa3d3e2","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        test-config:"},{"line_number":282,"context_line":"          $TEMPEST_CONFIG:"},{"line_number":283,"context_line":"            optimize:"},{"line_number":284,"context_line":"              datasource: prometheus"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"- job:"},{"line_number":287,"context_line":"    name: watcher-prometheus-integration-realdata"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"60b53899_f60487d2","line":284,"range":{"start_line":284,"start_character":26,"end_line":284,"end_character":36},"in_reply_to":"169e053f_bb215a2a","updated":"2025-08-08 19:13:13.000000000","message":"we can make one an alias of the other for the medium term\n\nif the two diverge (they shouldnt) we can revaluate tbut i woudl nto rename it unless we decied to deprecate the promethus direct version next cycle.\n\nthe watcher tempest plugin shoudl not need to care about which backidn is in use in genreal.\n\nthis si currently only used to select how metrics are injected and we will be using promtool for both.","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"ee0cb2e4bfd1ac482d39432ae7dcc28990ee695e","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        test-config:"},{"line_number":282,"context_line":"          $TEMPEST_CONFIG:"},{"line_number":283,"context_line":"            optimize:"},{"line_number":284,"context_line":"              datasource: prometheus"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"- job:"},{"line_number":287,"context_line":"    name: watcher-prometheus-integration-realdata"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"169e053f_bb215a2a","line":284,"range":{"start_line":284,"start_character":26,"end_line":284,"end_character":36},"in_reply_to":"884db001_c0b4f95a","updated":"2025-08-08 17:51:04.000000000","message":"I also got similar idea although my idea was to maybe rename it? But I didn\u0027t get as far as trying to think about a name and I see that\u0027d be super confusing.\n\nAdding \"aetos\" as a datasource in the tempest-plugin sounds good though. But let\u0027s do it later. I\u0027ll see and if I have nothing to do next week, I can propose the change, otherwise I think that could easily wait even until the next cycle.","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"}],"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3ae03a963eb67641fa08ab52185869be2b85c7db","unresolved":true,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Implements: https://blueprints.launchpad.net/watcher/+spec/prometheus-multitenancy-support"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Depends-On: https://review.opendev.org/c/openstack/python-observabilityclient/+/955991"},{"line_number":46,"context_line":"Generated-by: Cursor with claude-4-sonnet model"},{"line_number":47,"context_line":"Change-Id: I72c2171f72819bbde6c9cbbf565ee895e5d2bd53"},{"line_number":48,"context_line":"Signed-off-by: Jaromir Wysoglad \u003cjwysogla@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"f4c2e661_0ed61752","line":45,"updated":"2025-08-06 14:20:21.000000000","message":"so you need to depend on the requirement repo patch to bump the upper constrait for observablity clinet to 1.1.0 sinc eyour raisign the min version.\n\nwe also need the actuall release to be done before that.\nhttps://review.opendev.org/c/openstack/releases/+/956657\n\n https://review.opendev.org/c/openstack/python-observabilityclient/+/955991 is now merged so it can be removed","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"4f4e30b8b4a771e4dc6d392e7c951b77ee1ace71","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Implements: https://blueprints.launchpad.net/watcher/+spec/prometheus-multitenancy-support"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Depends-On: https://review.opendev.org/c/openstack/python-observabilityclient/+/955991"},{"line_number":46,"context_line":"Generated-by: Cursor with claude-4-sonnet model"},{"line_number":47,"context_line":"Change-Id: I72c2171f72819bbde6c9cbbf565ee895e5d2bd53"},{"line_number":48,"context_line":"Signed-off-by: Jaromir Wysoglad \u003cjwysogla@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"2e7fc39c_2438c0f8","line":45,"in_reply_to":"f4c2e661_0ed61752","updated":"2025-08-06 15:41:52.000000000","message":"Acknowledged","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3ae03a963eb67641fa08ab52185869be2b85c7db","unresolved":true,"context_lines":[{"line_number":43,"context_line":"Implements: https://blueprints.launchpad.net/watcher/+spec/prometheus-multitenancy-support"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Depends-On: https://review.opendev.org/c/openstack/python-observabilityclient/+/955991"},{"line_number":46,"context_line":"Generated-by: Cursor with claude-4-sonnet model"},{"line_number":47,"context_line":"Change-Id: I72c2171f72819bbde6c9cbbf565ee895e5d2bd53"},{"line_number":48,"context_line":"Signed-off-by: Jaromir Wysoglad \u003cjwysogla@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"489f7df0_83576b64","line":46,"updated":"2025-08-06 14:20:21.000000000","message":"should this be Generated-By or Assited-by:\n\nhttps://openinfra.org/legal/ai-policy\n\nthe delta between the two is effectivlly did you revise this a lost before submiting it or is it primiarlly the output of the tool with little to no changes on your part.\n\nover the course of reviews like this its likely to change form one to the ohter too but  “Generated-By:” and “Assisted-By” are signal to reivews as to how much of the conted comes form an llm.\n\nit does not need to be exact but im currous how much was ai generatd.\n\nthis is in line with the policy in either case.","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"4f4e30b8b4a771e4dc6d392e7c951b77ee1ace71","unresolved":true,"context_lines":[{"line_number":43,"context_line":"Implements: https://blueprints.launchpad.net/watcher/+spec/prometheus-multitenancy-support"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Depends-On: https://review.opendev.org/c/openstack/python-observabilityclient/+/955991"},{"line_number":46,"context_line":"Generated-by: Cursor with claude-4-sonnet model"},{"line_number":47,"context_line":"Change-Id: I72c2171f72819bbde6c9cbbf565ee895e5d2bd53"},{"line_number":48,"context_line":"Signed-off-by: Jaromir Wysoglad \u003cjwysogla@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"6838bfe8_a1646e77","line":46,"in_reply_to":"489f7df0_83576b64","updated":"2025-08-06 15:41:52.000000000","message":"A lot of this is still generated by AI, so I\u0027ll leave it like that, but I\u0027ll do the s/b/B/ in the next PS.\n\nRegarding your curiosity, I tried to describe in what way the AI was used in my last paragraph of the commit message and it\u0027s a little hard to remember all the details of what was generated and what was my manual changes, but I\u0027ll try.\n\nThe documentation is generated by AI, except for me deleting a few lines at the end when I rewrote the code from observabilityclient 1.0.0 to 1.1.0.\n\nThe zuul.yaml is generated by AI, but I then manually changed the tempest config to use `datasource: prometheus` and I manually added the realdata variant.\n\nrelease note is AI except for me adding the doc link I think.\n\nThe conf/ folder is 100% AI.\n\nThe decision_engine/ folder content is AI with a lot of additional prompts to get everything as I wanted (initially it was so \"clever\", it change some of the original Prometheus queries). I had to do a lot of iterations of \"hey there were some additional functions in the prometheus.py, move them to prometheus_base.py\". I then diffed the new prometheus_base.py and prometheus.py with the old prometheus.py to make sure there aren\u0027t any unwanted changes.\n\nThe tests are also mostly AI. Initial prompt was to create the same set of tests for Aetos as you already had for prometheus. Then I provided several prompts to group all the tests together into the base_prometheus_tests.py with as few changes to them as possible (the changes to the original test code are listed in the commit message). I later manually adjusted the tests for observabilityclient 1.1.0 (that was mostly deleting tests of code, that was essentially moved into the client). I also manually deleted a few things leftover from earlier iterations and some lines directing pytest discovery (because the AI was using pytest to run the tests and I didn\u0027t see it as necessary to tell it to use something else).\n\nOf course, as I mentioned earlier, I then read through the content multiple times, used diff on the moved code to compare it with the original to ensure nothing changed when moving it, I manually run it through the unit tests and pep8 tests using tox.","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"947da364cc7820b4063e1e1dc804f955dd815b8c","unresolved":false,"context_lines":[{"line_number":43,"context_line":"Implements: https://blueprints.launchpad.net/watcher/+spec/prometheus-multitenancy-support"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Depends-On: https://review.opendev.org/c/openstack/python-observabilityclient/+/955991"},{"line_number":46,"context_line":"Generated-by: Cursor with claude-4-sonnet model"},{"line_number":47,"context_line":"Change-Id: I72c2171f72819bbde6c9cbbf565ee895e5d2bd53"},{"line_number":48,"context_line":"Signed-off-by: Jaromir Wysoglad \u003cjwysogla@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"d896299d_76582ddb","line":46,"in_reply_to":"6838bfe8_a1646e77","updated":"2025-08-15 16:56:17.000000000","message":"Acknowledged","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2f56f4162d46cc14bc25f5e37e0634a48cb59b6d","unresolved":true,"context_lines":[{"line_number":27,"context_line":"  separately."},{"line_number":28,"context_line":"- a self._create_helper() is used to instantiate the helper class with"},{"line_number":29,"context_line":"  correct mocking."},{"line_number":30,"context_line":"- all config value modification is the original tests got moved out and"},{"line_number":31,"context_line":"  instead of modifying the config values, the _get_* methods are mocked"},{"line_number":32,"context_line":"  to return the wanted values"},{"line_number":33,"context_line":"- to keep similar test coverage, config retrieval is tested for each"},{"line_number":34,"context_line":"  concrete class by testing the _get_* methods."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"New watcher-aetos-integration and watcher-aetos-integration-realdata"},{"line_number":37,"context_line":"zuul jobs are added to test the new datasource. These use the same set"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"3e7816ba_31e8f956","line":34,"range":{"start_line":30,"start_character":0,"end_line":34,"end_character":47},"updated":"2025-08-15 17:01:43.000000000","message":"by the wya this is not really correct but its existing techdebt\n\nwe shoudl not be mocking config like this as it actuly means we are not provperly validatating the types and constraits  on the config option in the tests.\n\nyou are ust using the same pattern that was alreeady in place but this is something we shoudl eventualy fix in all of watcher tests not just your new ones.","commit_id":"8309d9848addd3a9647269d533aa2486dd0eeea6"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3ae03a963eb67641fa08ab52185869be2b85c7db","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"d6653d38_30d475e2","updated":"2025-08-06 14:20:21.000000000","message":"-1 partly due to the unmet deps and the excption comment inlien but largely thhis looks quite good.\n\ni need to take a closer look at the test coverage and end to end coverage but this is definally moving in the right direction.","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b7513f73826181c0f0f038e1fda85ef1fcf0933d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"cc61d520_e2e699c7","updated":"2025-08-07 18:27:18.000000000","message":"-1: new code and refactoring of the datasource is looking good, I have some comments about the unit testing implementation. Waiting for the ci results after we get the python-observabilityclient 1.1.\nThanks Jaromír!","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"0d7dfded240caad97d73d81727e948a50e3d1336","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"0cf29248_4c01ecaa","updated":"2025-08-07 15:16:22.000000000","message":"I rebased on top of master, gave rid of the merge conflict and changed the exception type as requested by Sean.","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"98805abdade7da4c9e6dea177b518fb2e3552448","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"f46072e0_ef56e4ad","updated":"2025-08-09 00:05:24.000000000","message":"Empty datasources seem to default to all datasources, which then fails with the DataSourceConfigConflict exception, which is I think why the strategies job fails. I\u0027ll modify it to exclude Aetos from the default to keep the original values and to have a valid default. But that\u0027s an early Monday work.","commit_id":"d190374a005105fdc54620029bae80a67cb560d0"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d23d58f50119e2e8b8bf82ff52f90e34b5b6faf1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"f28d0929_a27c8128","updated":"2025-08-13 14:57:57.000000000","message":"LGTM, thanks for","commit_id":"33888b0bbcf563ebbb4871f2c295431370224668"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d23d58f50119e2e8b8bf82ff52f90e34b5b6faf1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"b9cfc0c5_47ca0a40","updated":"2025-08-13 14:57:57.000000000","message":"LGTM, thanks for the updates.\nCI is passing for both prometheus and aetos jobs.\nUnit tests are also running and passing.\nThanks Jaromir","commit_id":"33888b0bbcf563ebbb4871f2c295431370224668"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"c7ffcc99a7109b67dce6018f234b62b6f4c5d3ae","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"3c98e5b9_92ff5930","updated":"2025-08-12 22:01:27.000000000","message":"The openstack-meta-content-provider-master is failing, because the observabilityclient 1.1.0 package isn\u0027t available in RDO yet. It should get built automatically once the u-c bump merges.","commit_id":"33888b0bbcf563ebbb4871f2c295431370224668"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"6169550ed0749d16244252ec33f54431d611b57b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"339ac6b3_56d4a9b9","updated":"2025-08-13 07:56:57.000000000","message":"check-rdo","commit_id":"33888b0bbcf563ebbb4871f2c295431370224668"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"3d0509bed026cfd3872914c938a5e55194a9d08c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"a5969eb1_094864c0","updated":"2025-08-14 06:47:23.000000000","message":"Had to rebase and fix a merge conflict in zuul.yaml.","commit_id":"8309d9848addd3a9647269d533aa2486dd0eeea6"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"7157205baed4872a517e693e9bf670887983eb7b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"0dc625de_c73c8986","updated":"2025-08-14 14:16:47.000000000","message":"lgtm, and tests are all passing, thanks Jaromír!","commit_id":"8309d9848addd3a9647269d533aa2486dd0eeea6"}],"doc/source/datasources/aetos.rst":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3ae03a963eb67641fa08ab52185869be2b85c7db","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    datasources \u003d aetos"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    [aetos_client]"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    interface \u003d public"},{"line_number":156,"context_line":"    region_name \u003d RegionOne"}],"source_content_type":"text/x-rst","patch_set":5,"id":"c628a452_60a7af26","line":153,"range":{"start_line":153,"start_character":5,"end_line":153,"end_character":17},"updated":"2025-08-06 14:20:21.000000000","message":"normally in other projects we avoid the client suffix.\ni.e. it would just be nova or neutron not nova_client or neutron_client.\n\nfor now this is consistent with how the other client are configured but we may decided to mass rename this to follow the typical service paten in the future.\n\nThis is correct in the context of this patch so no need to change this.","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"}],"doc/source/datasources/prometheus.rst":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3ae03a963eb67641fa08ab52185869be2b85c7db","unresolved":true,"context_lines":[{"line_number":30,"context_line":"label, as long as it identifies the host)."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Internally this label is used in creating ``fqdn_instance_labels``, containing"},{"line_number":33,"context_line":"the list of values assigned to the the label in the Prometheus targets."},{"line_number":34,"context_line":"The elements of the resulting fqdn_instance_labels are expected to match the"},{"line_number":35,"context_line":"``ComputeNode.hostname`` used in the Watcher decision engine cluster model."},{"line_number":36,"context_line":"An example ``fqdn_instance_labels`` is the following:"}],"source_content_type":"text/x-rst","patch_set":5,"id":"0b4cf200_b0be1c49","side":"PARENT","line":33,"updated":"2025-08-06 14:20:21.000000000","message":"nit this si an unrelated change","commit_id":"a1e7156c7e8ffe65de56b90634acc031f1bdf35c"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"4f4e30b8b4a771e4dc6d392e7c951b77ee1ace71","unresolved":false,"context_lines":[{"line_number":30,"context_line":"label, as long as it identifies the host)."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Internally this label is used in creating ``fqdn_instance_labels``, containing"},{"line_number":33,"context_line":"the list of values assigned to the the label in the Prometheus targets."},{"line_number":34,"context_line":"The elements of the resulting fqdn_instance_labels are expected to match the"},{"line_number":35,"context_line":"``ComputeNode.hostname`` used in the Watcher decision engine cluster model."},{"line_number":36,"context_line":"An example ``fqdn_instance_labels`` is the following:"}],"source_content_type":"text/x-rst","patch_set":5,"id":"e8a41044_14c5f6b7","side":"PARENT","line":33,"in_reply_to":"0b4cf200_b0be1c49","updated":"2025-08-06 15:41:52.000000000","message":"Acknowledged","commit_id":"a1e7156c7e8ffe65de56b90634acc031f1bdf35c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3ae03a963eb67641fa08ab52185869be2b85c7db","unresolved":true,"context_lines":[{"line_number":47,"context_line":"with the uuid of the OpenStack instance in each relevant metric. By default,"},{"line_number":48,"context_line":"the datasource will look for the label ``resource``. The"},{"line_number":49,"context_line":"``instance_uuid_label`` config option in watcher.conf allows deployers to"},{"line_number":50,"context_line":"override this default to any other label name that stores the ``uuid``."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Limitations"},{"line_number":53,"context_line":"-----------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"392af989_75e2066f","line":50,"updated":"2025-08-06 14:20:21.000000000","message":"as is this. \n\nits correct but striclty speakign it should not be in this patch.","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"4f4e30b8b4a771e4dc6d392e7c951b77ee1ace71","unresolved":true,"context_lines":[{"line_number":47,"context_line":"with the uuid of the OpenStack instance in each relevant metric. By default,"},{"line_number":48,"context_line":"the datasource will look for the label ``resource``. The"},{"line_number":49,"context_line":"``instance_uuid_label`` config option in watcher.conf allows deployers to"},{"line_number":50,"context_line":"override this default to any other label name that stores the ``uuid``."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Limitations"},{"line_number":53,"context_line":"-----------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"95a3ddea_00c6a01e","line":50,"in_reply_to":"392af989_75e2066f","updated":"2025-08-06 15:41:52.000000000","message":"I know. But I thought since the AI found it, I may as well include it since it\u0027s so tiny. I can move it out into a separate patch if you want though.","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4f6d39603d0acb938a179a4a4a8ff2e382e091a9","unresolved":false,"context_lines":[{"line_number":47,"context_line":"with the uuid of the OpenStack instance in each relevant metric. By default,"},{"line_number":48,"context_line":"the datasource will look for the label ``resource``. The"},{"line_number":49,"context_line":"``instance_uuid_label`` config option in watcher.conf allows deployers to"},{"line_number":50,"context_line":"override this default to any other label name that stores the ``uuid``."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Limitations"},{"line_number":53,"context_line":"-----------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"f90ede68_e8d94c9b","line":50,"in_reply_to":"95a3ddea_00c6a01e","updated":"2025-08-06 19:17:17.000000000","message":"ya so the only disadvatage to fixing it in this patch is it wont be backported to older release.\n\nwith that said we likly would not have backported a 2 line docs patch to epoxy jsut to resolve these issues.","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"}],"requirements.txt":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3ae03a963eb67641fa08ab52185869be2b85c7db","unresolved":true,"context_lines":[{"line_number":37,"context_line":"python-monascaclient\u003e\u003d1.12.0 # Apache-2.0"},{"line_number":38,"context_line":"python-neutronclient\u003e\u003d6.7.0 # Apache-2.0"},{"line_number":39,"context_line":"python-novaclient\u003e\u003d14.1.0 # Apache-2.0"},{"line_number":40,"context_line":"python-observabilityclient\u003e\u003d1.1.0 # Apache-2.0"},{"line_number":41,"context_line":"python-openstackclient\u003e\u003d3.14.0 # Apache-2.0"},{"line_number":42,"context_line":"python-ironicclient\u003e\u003d2.5.0 # Apache-2.0"},{"line_number":43,"context_line":"SQLAlchemy\u003e\u003d1.2.5 # MIT"}],"source_content_type":"text/plain","patch_set":5,"id":"b5cc796a_cf6dc11e","line":40,"updated":"2025-08-06 14:20:21.000000000","message":"this is obvioulsy gated on upper constratis allowing this version\nhttps://github.com/openstack/requirements/blob/master/upper-constraints.txt#L177","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"ee0cb2e4bfd1ac482d39432ae7dcc28990ee695e","unresolved":false,"context_lines":[{"line_number":37,"context_line":"python-monascaclient\u003e\u003d1.12.0 # Apache-2.0"},{"line_number":38,"context_line":"python-neutronclient\u003e\u003d6.7.0 # Apache-2.0"},{"line_number":39,"context_line":"python-novaclient\u003e\u003d14.1.0 # Apache-2.0"},{"line_number":40,"context_line":"python-observabilityclient\u003e\u003d1.1.0 # Apache-2.0"},{"line_number":41,"context_line":"python-openstackclient\u003e\u003d3.14.0 # Apache-2.0"},{"line_number":42,"context_line":"python-ironicclient\u003e\u003d2.5.0 # Apache-2.0"},{"line_number":43,"context_line":"SQLAlchemy\u003e\u003d1.2.5 # MIT"}],"source_content_type":"text/plain","patch_set":5,"id":"273fe85b_8d411741","line":40,"in_reply_to":"b5cc796a_cf6dc11e","updated":"2025-08-08 17:51:04.000000000","message":"Done","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"}],"watcher/conf/__init__.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3ae03a963eb67641fa08ab52185869be2b85c7db","unresolved":true,"context_lines":[{"line_number":48,"context_line":"CONF \u003d cfg.CONF"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"service.register_opts(CONF)"},{"line_number":51,"context_line":"aetos_client.register_opts(CONF)"},{"line_number":52,"context_line":"api.register_opts(CONF)"},{"line_number":53,"context_line":"paths.register_opts(CONF)"},{"line_number":54,"context_line":"exception.register_opts(CONF)"}],"source_content_type":"text/x-python","patch_set":5,"id":"8a7fc49d_ee9834a8","line":51,"updated":"2025-08-06 14:20:21.000000000","message":"again just noting this is fine but exapnding exisitng tech debth.\n\nnext cycle im hopign to repalce all the other client with the openstack sdk if there is sdk supprot for the service.\n\ni think it would be good to consider adding supprot for Aetos to the sdk going forward so we can also make the obserablity client an option depency and eventually remove it if we remove the prometheus plugin.","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"4f4e30b8b4a771e4dc6d392e7c951b77ee1ace71","unresolved":false,"context_lines":[{"line_number":48,"context_line":"CONF \u003d cfg.CONF"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"service.register_opts(CONF)"},{"line_number":51,"context_line":"aetos_client.register_opts(CONF)"},{"line_number":52,"context_line":"api.register_opts(CONF)"},{"line_number":53,"context_line":"paths.register_opts(CONF)"},{"line_number":54,"context_line":"exception.register_opts(CONF)"}],"source_content_type":"text/x-python","patch_set":5,"id":"a4e757fb_ade3f2b8","line":51,"in_reply_to":"8a7fc49d_ee9834a8","updated":"2025-08-06 15:41:52.000000000","message":"That\u0027s a good suggestion with the sdk and it\u0027s not something I really thought about. Thanks","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"}],"watcher/decision_engine/datasources/aetos.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3ae03a963eb67641fa08ab52185869be2b85c7db","unresolved":true,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        the_client \u003d obs_client_utils.get_prom_client_from_keystone("},{"line_number":69,"context_line":"            session, adapter_options\u003dopts"},{"line_number":70,"context_line":"        )"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        return the_client"}],"source_content_type":"text/x-python","patch_set":5,"id":"bb006e1f_6f75e676","line":70,"updated":"2025-08-06 14:20:21.000000000","message":"+1 thanks for creating https://opendev.org/openstack/python-observabilityclient/commit/2f31846d73c044740ccaaa4204720f0b94d64145","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"4f4e30b8b4a771e4dc6d392e7c951b77ee1ace71","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        the_client \u003d obs_client_utils.get_prom_client_from_keystone("},{"line_number":69,"context_line":"            session, adapter_options\u003dopts"},{"line_number":70,"context_line":"        )"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        return the_client"}],"source_content_type":"text/x-python","patch_set":5,"id":"818be88b_278bfa09","line":70,"in_reply_to":"bb006e1f_6f75e676","updated":"2025-08-06 15:41:52.000000000","message":"Acknowledged","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b7513f73826181c0f0f038e1fda85ef1fcf0933d","unresolved":true,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        This method discovers the Aetos endpoint through Keystone service"},{"line_number":55,"context_line":"        catalog and sets up the PrometheusAPIClient with a Keystone session."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        :raises watcher.common.exception.InvalidParameter if Aetos service"},{"line_number":58,"context_line":"                is not registered in Keystone or if service name is not \u0027aetos\u0027"},{"line_number":59,"context_line":"        :return: PrometheusAPIClient instance configured for Aetos"},{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":"        # Get Keystone session from OpenStackClients"}],"source_content_type":"text/x-python","patch_set":6,"id":"2023f184_2ece772b","line":58,"range":{"start_line":56,"start_character":0,"end_line":58,"end_character":79},"updated":"2025-08-07 18:27:18.000000000","message":"I am missing this in the code, perhaps it was removed.","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"ee0cb2e4bfd1ac482d39432ae7dcc28990ee695e","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        This method discovers the Aetos endpoint through Keystone service"},{"line_number":55,"context_line":"        catalog and sets up the PrometheusAPIClient with a Keystone session."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        :raises watcher.common.exception.InvalidParameter if Aetos service"},{"line_number":58,"context_line":"                is not registered in Keystone or if service name is not \u0027aetos\u0027"},{"line_number":59,"context_line":"        :return: PrometheusAPIClient instance configured for Aetos"},{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":"        # Get Keystone session from OpenStackClients"}],"source_content_type":"text/x-python","patch_set":6,"id":"0a963d4b_3388e371","line":58,"range":{"start_line":56,"start_character":0,"end_line":58,"end_character":79},"in_reply_to":"2023f184_2ece772b","updated":"2025-08-08 17:51:04.000000000","message":"Oh, seems like I missed this. This is a leftover after I rewrote this part from observabilityclient 1.0.0 to observabilityclient 1.1.0. Which allowed me to remove most of this method. I\u0027ll adjust the doc string.","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"}],"watcher/decision_engine/datasources/manager.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3ae03a963eb67641fa08ab52185869be2b85c7db","unresolved":true,"context_lines":[{"line_number":84,"context_line":"                aetos.AetosHelper.NAME in self.datasources):"},{"line_number":85,"context_line":"            LOG.error(\"Configuration error: Cannot use both prometheus \""},{"line_number":86,"context_line":"                      \"and aetos datasources simultaneously.\")"},{"line_number":87,"context_line":"            raise exception.InvalidParameter("},{"line_number":88,"context_line":"                message\u003d(_(\"Cannot configure both prometheus and aetos \""},{"line_number":89,"context_line":"                           \"datasources at the same time. Please choose one.\"))"},{"line_number":90,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":5,"id":"9877a99b_53d3b32e","line":87,"range":{"start_line":87,"start_character":28,"end_line":87,"end_character":44},"updated":"2025-08-06 14:20:21.000000000","message":"InvalidParameter is for api erros \n```\nclass InvalidParameter(Invalid):\n    msg_fmt \u003d _(\"%(parameter)s has to be of type %(parameter_type)s\")\n```\nUnsupportedDataSource is closer\n```\nclass UnsupportedDataSource(UnsupportedError):\n    msg_fmt \u003d _(\"Datasource %(datasource)s is not supported \"\n                \"by strategy %(strategy)s\")\n```              \nbut still incorrect as is DataSourceNotAvailable\n\n```\nclass DataSourceNotAvailable(WatcherException):\n    msg_fmt \u003d _(\"Datasource %(datasource)s is not available.\")\n```\n\ni think you shoudl add a new expction for this `DataSourceConfigConflict`\nsomthing like this.\n\n```\nclass DataSourceConfigConflict(UnsupportedError)\n\n    msg_fmt \u003d _(\"Datasource %(datasource_one)s is not supported \"\n                \"when datasouce %(datasource_one)s is also enabled.\")\n\n```","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"4f4e30b8b4a771e4dc6d392e7c951b77ee1ace71","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                aetos.AetosHelper.NAME in self.datasources):"},{"line_number":85,"context_line":"            LOG.error(\"Configuration error: Cannot use both prometheus \""},{"line_number":86,"context_line":"                      \"and aetos datasources simultaneously.\")"},{"line_number":87,"context_line":"            raise exception.InvalidParameter("},{"line_number":88,"context_line":"                message\u003d(_(\"Cannot configure both prometheus and aetos \""},{"line_number":89,"context_line":"                           \"datasources at the same time. Please choose one.\"))"},{"line_number":90,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":5,"id":"b5f8e52b_f481f177","line":87,"range":{"start_line":87,"start_character":28,"end_line":87,"end_character":44},"in_reply_to":"9877a99b_53d3b32e","updated":"2025-08-06 15:41:52.000000000","message":"That\u0027s something I was wondering about quite a bit, I then saw https://github.com/openstack/watcher/blob/a1e7156c7e8ffe65de56b90634acc031f1bdf35c/watcher/decision_engine/datasources/prometheus.py#L112 and thought that situation is pretty close to this. But I\u0027ll add the DataSourceConfigConflict as suggested.","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4f6d39603d0acb938a179a4a4a8ff2e382e091a9","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                aetos.AetosHelper.NAME in self.datasources):"},{"line_number":85,"context_line":"            LOG.error(\"Configuration error: Cannot use both prometheus \""},{"line_number":86,"context_line":"                      \"and aetos datasources simultaneously.\")"},{"line_number":87,"context_line":"            raise exception.InvalidParameter("},{"line_number":88,"context_line":"                message\u003d(_(\"Cannot configure both prometheus and aetos \""},{"line_number":89,"context_line":"                           \"datasources at the same time. Please choose one.\"))"},{"line_number":90,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":5,"id":"b08f0d47_ea6a9ecf","line":87,"range":{"start_line":87,"start_character":28,"end_line":87,"end_character":44},"in_reply_to":"b5f8e52b_f481f177","updated":"2025-08-06 19:17:17.000000000","message":"i think that may have been a oversite on our part in the past.\n\nwe likely shoudl make that a dedicated conf error or similer in the future.\n\nthanks for pointing that out.","commit_id":"3c945668a75553d12e7a54610cc3b71458cbfc0f"}],"watcher/decision_engine/datasources/prometheus_base.py":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b7513f73826181c0f0f038e1fda85ef1fcf0933d","unresolved":true,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        :return: PrometheusAPIClient instance"},{"line_number":81,"context_line":"        \"\"\""},{"line_number":82,"context_line":"        pass"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @abc.abstractmethod"},{"line_number":85,"context_line":"    def _get_fqdn_label(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"2f1f7ae6_033c8bc9","line":82,"range":{"start_line":82,"start_character":8,"end_line":82,"end_character":12},"updated":"2025-08-07 18:27:18.000000000","message":"raise NotImplementedError() would be better, since it is a mandatory method to implement","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"ee0cb2e4bfd1ac482d39432ae7dcc28990ee695e","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        :return: PrometheusAPIClient instance"},{"line_number":81,"context_line":"        \"\"\""},{"line_number":82,"context_line":"        pass"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @abc.abstractmethod"},{"line_number":85,"context_line":"    def _get_fqdn_label(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"16f88217_b25cb73b","line":82,"range":{"start_line":82,"start_character":8,"end_line":82,"end_character":12},"in_reply_to":"2f1f7ae6_033c8bc9","updated":"2025-08-08 17:51:04.000000000","message":"Done","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b7513f73826181c0f0f038e1fda85ef1fcf0933d","unresolved":true,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        :return: String containing the FQDN label name"},{"line_number":89,"context_line":"        \"\"\""},{"line_number":90,"context_line":"        pass"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @abc.abstractmethod"},{"line_number":93,"context_line":"    def _get_instance_uuid_label(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"08a5c3f3_825b205f","line":90,"range":{"start_line":90,"start_character":8,"end_line":90,"end_character":12},"updated":"2025-08-07 18:27:18.000000000","message":"ditto","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"ee0cb2e4bfd1ac482d39432ae7dcc28990ee695e","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        :return: String containing the FQDN label name"},{"line_number":89,"context_line":"        \"\"\""},{"line_number":90,"context_line":"        pass"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @abc.abstractmethod"},{"line_number":93,"context_line":"    def _get_instance_uuid_label(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1404f979_432a91d9","line":90,"range":{"start_line":90,"start_character":8,"end_line":90,"end_character":12},"in_reply_to":"08a5c3f3_825b205f","updated":"2025-08-08 17:51:04.000000000","message":"Done","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b7513f73826181c0f0f038e1fda85ef1fcf0933d","unresolved":true,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        :return: String containing the instance UUID label name"},{"line_number":97,"context_line":"        \"\"\""},{"line_number":98,"context_line":"        pass"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def _build_prometheus_fqdn_labels(self):"},{"line_number":101,"context_line":"        \"\"\"Build the list of fqdn_label values to be used in host queries"}],"source_content_type":"text/x-python","patch_set":6,"id":"454ccbc7_53f92e58","line":98,"range":{"start_line":98,"start_character":8,"end_line":98,"end_character":12},"updated":"2025-08-07 18:27:18.000000000","message":"ditto","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"ee0cb2e4bfd1ac482d39432ae7dcc28990ee695e","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        :return: String containing the instance UUID label name"},{"line_number":97,"context_line":"        \"\"\""},{"line_number":98,"context_line":"        pass"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def _build_prometheus_fqdn_labels(self):"},{"line_number":101,"context_line":"        \"\"\"Build the list of fqdn_label values to be used in host queries"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fcbe6fe_477608e9","line":98,"range":{"start_line":98,"start_character":8,"end_line":98,"end_character":12},"in_reply_to":"454ccbc7_53f92e58","updated":"2025-08-08 17:51:04.000000000","message":"Done","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"}],"watcher/tests/decision_engine/datasources/base_prometheus_tests.py":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b7513f73826181c0f0f038e1fda85ef1fcf0933d","unresolved":true,"context_lines":[{"line_number":20,"context_line":"from watcher.common import exception"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class BasePrometheusLikeDatasourceTestCase():"},{"line_number":24,"context_line":"    \"\"\"Base test class for Prometheus-like datasource helpers."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    This class contains common test patterns shared between AetosHelper"}],"source_content_type":"text/x-python","patch_set":6,"id":"c35f67c4_ac8e5577","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":45},"updated":"2025-08-07 18:27:18.000000000","message":"I would do this in a different way, instead of running all these tests in both datasources (aetos and prometheus), I would just mock the abstractmethods and test the BaseClass implementation here.\nI don\u0027t see an advantage yet on running these tests in Aetos/Prometheus Test classes, since the client that they return would be a mock anyway.","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"ee0cb2e4bfd1ac482d39432ae7dcc28990ee695e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from watcher.common import exception"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class BasePrometheusLikeDatasourceTestCase():"},{"line_number":24,"context_line":"    \"\"\"Base test class for Prometheus-like datasource helpers."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    This class contains common test patterns shared between AetosHelper"}],"source_content_type":"text/x-python","patch_set":6,"id":"6e7c7c35_2afa0023","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":45},"in_reply_to":"c35f67c4_ac8e5577","updated":"2025-08-08 17:51:04.000000000","message":"Good idea, I implemented it, so now each of the testcases runs just once. I tried to update the commit message as well to capture the changes I made.","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"}],"watcher/tests/decision_engine/datasources/test_aetos_helper.py":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b7513f73826181c0f0f038e1fda85ef1fcf0933d","unresolved":true,"context_lines":[{"line_number":22,"context_line":"from watcher.tests.decision_engine.datasources import base_prometheus_tests"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TestAetosHelper("},{"line_number":26,"context_line":"        base.BaseTestCase,"},{"line_number":27,"context_line":"        base_prometheus_tests.BasePrometheusLikeDatasourceTestCase):"},{"line_number":28,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"d84dd212_236f1279","line":25,"range":{"start_line":25,"start_character":6,"end_line":25,"end_character":21},"updated":"2025-08-07 18:27:18.000000000","message":"I would just test the methods implemented for aetos, which is basically `_setup_prometheus_client`.","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"ee0cb2e4bfd1ac482d39432ae7dcc28990ee695e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from watcher.tests.decision_engine.datasources import base_prometheus_tests"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TestAetosHelper("},{"line_number":26,"context_line":"        base.BaseTestCase,"},{"line_number":27,"context_line":"        base_prometheus_tests.BasePrometheusLikeDatasourceTestCase):"},{"line_number":28,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"e52b932e_3391c7f5","line":25,"range":{"start_line":25,"start_character":6,"end_line":25,"end_character":21},"in_reply_to":"d84dd212_236f1279","updated":"2025-08-08 17:51:04.000000000","message":"Done","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"}],"watcher/tests/decision_engine/datasources/test_manager.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bc670d2d42ae3a93738257d8811555512eb3192a","unresolved":true,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from unittest import mock"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from unittest.mock import MagicMock"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from watcher.common import exception"},{"line_number":22,"context_line":"from watcher.decision_engine.datasources import aetos"}],"source_content_type":"text/x-python","patch_set":11,"id":"3497112e_4b4f8c14","line":19,"updated":"2025-08-15 17:08:54.000000000","message":"this aslo violate our import roles but again not related to this chagne.","commit_id":"8309d9848addd3a9647269d533aa2486dd0eeea6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bc670d2d42ae3a93738257d8811555512eb3192a","unresolved":true,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class TestDataSourceManager(base.BaseTestCase):"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def _dsm_config(self, **kwargs):"},{"line_number":34,"context_line":"        dss \u003d [\u0027gnocchi\u0027, \u0027monasca\u0027]"},{"line_number":35,"context_line":"        opts \u003d dict(datasources\u003ddss, metric_map_path\u003dNone)"},{"line_number":36,"context_line":"        opts.update(kwargs)"},{"line_number":37,"context_line":"        return MagicMock(**opts)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _dsm(self, **kwargs):"},{"line_number":40,"context_line":"        opts \u003d dict(config\u003dself._dsm_config(), osc\u003dmock.MagicMock())"},{"line_number":41,"context_line":"        opts.update(kwargs)"},{"line_number":42,"context_line":"        return ds_manager.DataSourceManager(**opts)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_metric_file_path_not_exists(self):"},{"line_number":45,"context_line":"        manager \u003d self._dsm()"}],"source_content_type":"text/x-python","patch_set":11,"id":"175489bf_1652e387","line":42,"range":{"start_line":33,"start_character":4,"end_line":42,"end_character":51},"updated":"2025-08-15 17:08:54.000000000","message":"in case folks are wondering this is what i was referring to as the exciting tech debt\n\nwe shoudl be using the config fixture form oslo config\n\nhttps://github.com/openstack/oslo.config/blob/master/oslo_config/fixture.py#L23\n\nor  our own warpper like\n\nhttps://github.com/openstack/nova/blob/master/nova/tests/fixtures/conf.py#L26\n\nthen you use set_overried to set tem in the testcase\n\nor a wrapper like flags\n\nhttps://github.com/openstack/nova/blob/e39bac965a2d947d32325446ef8427dd5f6c85c7/nova/test.py#L429-L437\n\n\nthis is just one of the many casses of incorrect mocking in the exting unit tests whihc is why im not askign for it to be fixed in this patch.","commit_id":"8309d9848addd3a9647269d533aa2486dd0eeea6"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"7e0ac161e263fdc832a32ca326b267b280b028cc","unresolved":true,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class TestDataSourceManager(base.BaseTestCase):"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def _dsm_config(self, **kwargs):"},{"line_number":34,"context_line":"        dss \u003d [\u0027gnocchi\u0027, \u0027monasca\u0027]"},{"line_number":35,"context_line":"        opts \u003d dict(datasources\u003ddss, metric_map_path\u003dNone)"},{"line_number":36,"context_line":"        opts.update(kwargs)"},{"line_number":37,"context_line":"        return MagicMock(**opts)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _dsm(self, **kwargs):"},{"line_number":40,"context_line":"        opts \u003d dict(config\u003dself._dsm_config(), osc\u003dmock.MagicMock())"},{"line_number":41,"context_line":"        opts.update(kwargs)"},{"line_number":42,"context_line":"        return ds_manager.DataSourceManager(**opts)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_metric_file_path_not_exists(self):"},{"line_number":45,"context_line":"        manager \u003d self._dsm()"}],"source_content_type":"text/x-python","patch_set":11,"id":"4c2c5306_e8d81e13","line":42,"range":{"start_line":33,"start_character":4,"end_line":42,"end_character":51},"in_reply_to":"175489bf_1652e387","updated":"2025-08-15 17:17:36.000000000","message":"I wonder, do we have some doc somewhere in openstack, which would say how to do unit tests? Which fixtures to use, some guidelines on what and how to mock, ...? Or do you just go by experience? I\u0027m asking, because I find myself very often spending way more time on tests than the actual code, going back and forth not really sure what\u0027s the best way to do things.","commit_id":"8309d9848addd3a9647269d533aa2486dd0eeea6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"aac77a5128203440146160642dd751efb8c26ecb","unresolved":true,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class TestDataSourceManager(base.BaseTestCase):"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def _dsm_config(self, **kwargs):"},{"line_number":34,"context_line":"        dss \u003d [\u0027gnocchi\u0027, \u0027monasca\u0027]"},{"line_number":35,"context_line":"        opts \u003d dict(datasources\u003ddss, metric_map_path\u003dNone)"},{"line_number":36,"context_line":"        opts.update(kwargs)"},{"line_number":37,"context_line":"        return MagicMock(**opts)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _dsm(self, **kwargs):"},{"line_number":40,"context_line":"        opts \u003d dict(config\u003dself._dsm_config(), osc\u003dmock.MagicMock())"},{"line_number":41,"context_line":"        opts.update(kwargs)"},{"line_number":42,"context_line":"        return ds_manager.DataSourceManager(**opts)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_metric_file_path_not_exists(self):"},{"line_number":45,"context_line":"        manager \u003d self._dsm()"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f9247fa_7b36259d","line":42,"range":{"start_line":33,"start_character":4,"end_line":42,"end_character":51},"in_reply_to":"4c2c5306_e8d81e13","updated":"2025-08-16 00:07:32.000000000","message":"its mostly instinctual knowledge that is gained over years of code review unfortunately.\n\nthere are some guidlien in the hackign repo which is openstack style guide\n\nhttps://github.com/openstack/hacking/blob/master/HACKING.rst#unit-tests-and-assertraises\nand some others in the contributor guide \nhttps://docs.openstack.org/contributors/code-and-documentation/patch-series-tutorial.html\n\nbut not much detailed or worked end to end docs.\n\nwe generally have proitned new contibutor to existing example test thaty the can emulate when the  first submit a patch to nova. i.e. we will try and fined as specif unit or fucntionla regression test that they can copy past and modify to cover there issues in the hope that the pattres in the surrond code will lead them in the right dirction.","commit_id":"8309d9848addd3a9647269d533aa2486dd0eeea6"}],"watcher/tests/decision_engine/datasources/test_prometheus_helper.py":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b7513f73826181c0f0f038e1fda85ef1fcf0933d","unresolved":true,"context_lines":[{"line_number":23,"context_line":"from watcher.tests.decision_engine.datasources import base_prometheus_tests"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class TestPrometheusHelper("},{"line_number":27,"context_line":"        base.BaseTestCase,"},{"line_number":28,"context_line":"        base_prometheus_tests.BasePrometheusLikeDatasourceTestCase):"},{"line_number":29,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"937b68ff_795978d6","line":26,"range":{"start_line":26,"start_character":6,"end_line":26,"end_character":26},"updated":"2025-08-07 18:27:18.000000000","message":"Same comment from TestAetosHelper, wdyt?","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"ee0cb2e4bfd1ac482d39432ae7dcc28990ee695e","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from watcher.tests.decision_engine.datasources import base_prometheus_tests"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class TestPrometheusHelper("},{"line_number":27,"context_line":"        base.BaseTestCase,"},{"line_number":28,"context_line":"        base_prometheus_tests.BasePrometheusLikeDatasourceTestCase):"},{"line_number":29,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"535b4394_8fbfffbd","line":26,"range":{"start_line":26,"start_character":6,"end_line":26,"end_character":26},"in_reply_to":"937b68ff_795978d6","updated":"2025-08-08 17:51:04.000000000","message":"Done","commit_id":"24e1f34df7791d6a27b590a07ff9a69e9fdba62a"}]}
