)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"96645c66c4ba9db57916a0a05f52c950d472ba3e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"dce87ae3_177f2cca","updated":"2026-01-12 15:54:55.000000000","message":"recheck","commit_id":"f152e9fa7e7f4c55c9f823ffc9e937c3d1f55be5"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"3d82c9cb1e617fbbbc4c6c3597b495f178d1763b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"57a437cf_792c39ac","updated":"2026-01-22 11:05:49.000000000","message":"Only a doubt about the Flavor objects, other than that lgtm!","commit_id":"34a9cbd11526aff953d58adaca26302c8fbaf3b7"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"654b4e2497d7cb101ba8d18c1ec92f4a7017373c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"7d3d7f64_34951d40","updated":"2026-02-02 07:56:11.000000000","message":"recheck unrelated cinder error in grenade job","commit_id":"df4da8a8b496b60a93df40bf814d81ae2ad3ce8d"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"12e7d6cd8fe94d452cc85edb52083b457d12d332","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"33a4f943_94e0a187","updated":"2026-02-03 12:43:00.000000000","message":"lgtm, code is isolated for now. Thanks Joan","commit_id":"2d0eec1fe8748601179aedcf48dfd979f46709f7"}],"watcher/common/nova_helper.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c36dc214e536abc6c69f43ce7e7a55615aca594c","unresolved":true,"context_lines":[{"line_number":16,"context_line":"# limitations under the License."},{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from dataclasses import dataclass"},{"line_number":20,"context_line":"import functools"},{"line_number":21,"context_line":"import time"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"cb369531_d58942a5","line":19,"updated":"2026-01-15 20:19:54.000000000","message":"you are nto ment ot import functions\n\n\n```suggestion\nimport datacleases\n```\n\nor \n\n\n```suggestion\nimport datacleases as dc\n```\n\nthe do @dc.dataclass below","commit_id":"93b87da25aeedbbcbfd1515a934055c03829c089"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"a89fe95991bffb9d41efb3cac08c31c12e6851f3","unresolved":false,"context_lines":[{"line_number":16,"context_line":"# limitations under the License."},{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from dataclasses import dataclass"},{"line_number":20,"context_line":"import functools"},{"line_number":21,"context_line":"import time"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"74fd3f2d_3171044a","line":19,"in_reply_to":"cb369531_d58942a5","updated":"2026-01-16 17:07:10.000000000","message":"thanks, fixed","commit_id":"93b87da25aeedbbcbfd1515a934055c03829c089"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c36dc214e536abc6c69f43ce7e7a55615aca594c","unresolved":true,"context_lines":[{"line_number":70,"context_line":"    extended attributes consistently."},{"line_number":71,"context_line":"    \"\"\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    _server: servers.Server"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    @property"},{"line_number":76,"context_line":"    def id(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"c54defe1_f40f3523","line":73,"updated":"2026-01-15 20:19:54.000000000","message":"so thinking about this a bit this is not really what i was expecting you to create.\n\ni was originally expecting this to be a pure data holder with field for each resource field.\n\nso we would not store the  _server: servers.Server\n\nwe would provide a class method to constuct a watcher server object form a Novaclient server object.\n\nthat also means we woudl not have \n\n\n    def migrate(self, host\u003dNone):\n        \"\"\"Migrate server to a new host.\n        :param host: target host (optional)\n        \"\"\"\n        return self._server.migrate(host\u003dhost)\n    def resize(self, flavor):\n        \"\"\"Resize server to a new flavor.\n        :param flavor: target flavor ID\n        \"\"\"\n        return self._server.resize(flavor\u003dflavor)\n    def confirm_resize(self):\n        \"\"\"Confirm a resize operation.\"\"\"\n        return self._server.confirm_resize()\n    def live_migrate(self, host\u003dNone):\n        \"\"\"Live migrate server to a new host.\n        :param host: target host (optional)\n        \"\"\"\n        return self._server.live_migrate(host\u003dhost)\n\n\nmethjod on the object.\n\n\ni was also originally expecting these to be ovo but im not sure if that is required or not.\n\n\nso im on the fence if this is the right diretion or not.","commit_id":"3baaf23bc8d229afb65f54587dde8ecd3c928c24"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"df214e8a9f22481fea42e91701b59e0d7fc90d4a","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    extended attributes consistently."},{"line_number":71,"context_line":"    \"\"\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    _server: servers.Server"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    @property"},{"line_number":76,"context_line":"    def id(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"c8becb6f_528e9570","line":73,"in_reply_to":"1a31fa74_b64cd3fe","updated":"2026-01-22 16:26:07.000000000","message":"Done","commit_id":"3baaf23bc8d229afb65f54587dde8ecd3c928c24"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"a89fe95991bffb9d41efb3cac08c31c12e6851f3","unresolved":true,"context_lines":[{"line_number":70,"context_line":"    extended attributes consistently."},{"line_number":71,"context_line":"    \"\"\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    _server: servers.Server"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    @property"},{"line_number":76,"context_line":"    def id(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a31fa74_b64cd3fe","line":73,"in_reply_to":"c54defe1_f40f3523","updated":"2026-01-16 17:07:10.000000000","message":"that\u0027s fair, the current approach was my first thought, but I considered implementing something like you suggest when I introduced the dataclass, it made more sense. I\u0027ll push a new patchset removing the novaclient server and we can decide which one we prefer","commit_id":"3baaf23bc8d229afb65f54587dde8ecd3c928c24"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b5344ed0ade1c1c4e694229c5bca316ecd7f1405","unresolved":true,"context_lines":[{"line_number":80,"context_line":"    pinned_availability_zone: str | None"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def server_from_novaclient(nova_server):"},{"line_number":84,"context_line":"    \"\"\"Create a Server dataclass from a novaclient Server object."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    :param nova_server: novaclient servers.Server object"}],"source_content_type":"text/x-python","patch_set":5,"id":"6673735c_cf3c7e9b","line":83,"range":{"start_line":83,"start_character":4,"end_line":83,"end_character":26},"updated":"2026-01-16 19:00:59.000000000","message":"i would make this a class method on the Server class\n\nnamed constuctors are one of the cannonical exampels of what class methods shoudl be used for in python and thats basically what this is.\n\ni would jsut call it from_novaclient\n\nso you woud luse it liek this\n\nserver \u003d Server.from_novaclient(nc.server.show(...))\n\nupi cam a;sp add a list version if needed in the future.","commit_id":"9278e9faa27f0543d910af885fefc63b049067aa"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"423b99d9b946ab8f46fe5526cfe1de5284533938","unresolved":true,"context_lines":[{"line_number":80,"context_line":"    pinned_availability_zone: str | None"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def server_from_novaclient(nova_server):"},{"line_number":84,"context_line":"    \"\"\"Create a Server dataclass from a novaclient Server object."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    :param nova_server: novaclient servers.Server object"}],"source_content_type":"text/x-python","patch_set":5,"id":"f2bea3c3_f1121658","line":83,"range":{"start_line":83,"start_character":4,"end_line":83,"end_character":26},"in_reply_to":"6673735c_cf3c7e9b","updated":"2026-01-19 11:27:13.000000000","message":"good point, I\u0027ll change it","commit_id":"9278e9faa27f0543d910af885fefc63b049067aa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"df214e8a9f22481fea42e91701b59e0d7fc90d4a","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    pinned_availability_zone: str | None"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def server_from_novaclient(nova_server):"},{"line_number":84,"context_line":"    \"\"\"Create a Server dataclass from a novaclient Server object."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    :param nova_server: novaclient servers.Server object"}],"source_content_type":"text/x-python","patch_set":5,"id":"13e86d03_6b8eb6a6","line":83,"range":{"start_line":83,"start_character":4,"end_line":83,"end_character":26},"in_reply_to":"f2bea3c3_f1121658","updated":"2026-01-22 16:26:07.000000000","message":"Done","commit_id":"9278e9faa27f0543d910af885fefc63b049067aa"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"3d82c9cb1e617fbbbc4c6c3597b495f178d1763b","unresolved":true,"context_lines":[{"line_number":185,"context_line":"    disk: int"},{"line_number":186,"context_line":"    ephemeral: int"},{"line_number":187,"context_line":"    swap: int"},{"line_number":188,"context_line":"    is_public: bool"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    @classmethod"},{"line_number":191,"context_line":"    def from_novaclient(cls, nova_flavor):"}],"source_content_type":"text/x-python","patch_set":7,"id":"c703ce8f_ba07a48f","line":188,"updated":"2026-01-22 11:05:49.000000000","message":"even when we are not using extra_specs from the flavor object itself but from the Server.flavor, I think it may be good to get it into the Flavor object also, for consistency between objects. At some point we may consume it.","commit_id":"34a9cbd11526aff953d58adaca26302c8fbaf3b7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f87060c06be09d19acda01afa11342d0b1ca4689","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    disk: int"},{"line_number":186,"context_line":"    ephemeral: int"},{"line_number":187,"context_line":"    swap: int"},{"line_number":188,"context_line":"    is_public: bool"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    @classmethod"},{"line_number":191,"context_line":"    def from_novaclient(cls, nova_flavor):"}],"source_content_type":"text/x-python","patch_set":7,"id":"b2387205_eb528969","line":188,"in_reply_to":"c703ce8f_ba07a48f","updated":"2026-01-22 13:33:34.000000000","message":"Done","commit_id":"34a9cbd11526aff953d58adaca26302c8fbaf3b7"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"2807d20cbd9ac2c12cb216111739255b3142d4ad","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    disk: int"},{"line_number":186,"context_line":"    ephemeral: int"},{"line_number":187,"context_line":"    swap: int"},{"line_number":188,"context_line":"    is_public: bool"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    @classmethod"},{"line_number":191,"context_line":"    def from_novaclient(cls, nova_flavor):"}],"source_content_type":"text/x-python","patch_set":7,"id":"d3ec347d_2257be09","line":188,"in_reply_to":"c703ce8f_ba07a48f","updated":"2026-01-22 14:18:36.000000000","message":"I added the ones that were being used throught the Watcher code base. I pushed a new patchset adding the extra_specs to the Flavor class since it was a small change","commit_id":"34a9cbd11526aff953d58adaca26302c8fbaf3b7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f87060c06be09d19acda01afa11342d0b1ca4689","unresolved":true,"context_lines":[{"line_number":72,"context_line":"    task_state: str | None"},{"line_number":73,"context_line":"    power_state: int | None"},{"line_number":74,"context_line":"    status: str"},{"line_number":75,"context_line":"    flavor: dict"},{"line_number":76,"context_line":"    tenant_id: str"},{"line_number":77,"context_line":"    locked: bool"},{"line_number":78,"context_line":"    metadata: dict"}],"source_content_type":"text/x-python","patch_set":8,"id":"f02a901f_e59a2ec7","line":75,"updated":"2026-01-22 13:33:34.000000000","message":"if this was not frozen i woudl suggest making this a flavor object so we could back file it with the full flavor detail later but we can conider if that is useful later if we need that.\n\nwe can alwasy add a helper function that take this server object and looks up the relevent flavor ectra later\n\nas an asied we shoudl exend this in the futre with the image properties and schduler hints once we move to the sdk and can retrive those.","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1ebfe756a3ee73cef1f301b35a2255addbcf5598","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    task_state: str | None"},{"line_number":73,"context_line":"    power_state: int | None"},{"line_number":74,"context_line":"    status: str"},{"line_number":75,"context_line":"    flavor: dict"},{"line_number":76,"context_line":"    tenant_id: str"},{"line_number":77,"context_line":"    locked: bool"},{"line_number":78,"context_line":"    metadata: dict"}],"source_content_type":"text/x-python","patch_set":8,"id":"26da5291_a9f38b91","line":75,"in_reply_to":"f02a901f_e59a2ec7","updated":"2026-01-22 16:27:36.000000000","message":"Acknowledged","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f87060c06be09d19acda01afa11342d0b1ca4689","unresolved":true,"context_lines":[{"line_number":210,"context_line":"            ephemeral\u003dnova_flavor.ephemeral,"},{"line_number":211,"context_line":"            swap\u003dswap,"},{"line_number":212,"context_line":"            is_public\u003dnova_flavor.is_public,"},{"line_number":213,"context_line":"            extra_specs\u003dflavor_dict.get(\u0027extra_specs\u0027)"},{"line_number":214,"context_line":"        )"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"2ea8860d_bcb73485","line":213,"updated":"2026-01-22 13:33:34.000000000","message":"```suggestion\n            extra_specs\u003dflavor_dict.get(\u0027extra_specs\u0027, {})\n```\nand then make the type dict not `dict | None`","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"d4d0f84ec8ae501a313a64183bb721f7caf567ec","unresolved":true,"context_lines":[{"line_number":210,"context_line":"            ephemeral\u003dnova_flavor.ephemeral,"},{"line_number":211,"context_line":"            swap\u003dswap,"},{"line_number":212,"context_line":"            is_public\u003dnova_flavor.is_public,"},{"line_number":213,"context_line":"            extra_specs\u003dflavor_dict.get(\u0027extra_specs\u0027)"},{"line_number":214,"context_line":"        )"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5b893779_59a859b2","line":213,"in_reply_to":"255c3f53_edd554a6","updated":"2026-01-22 16:56:20.000000000","message":"Yes, I like the overall direction, I think it\u0027s an elegant and practical solution.","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1ebfe756a3ee73cef1f301b35a2255addbcf5598","unresolved":true,"context_lines":[{"line_number":210,"context_line":"            ephemeral\u003dnova_flavor.ephemeral,"},{"line_number":211,"context_line":"            swap\u003dswap,"},{"line_number":212,"context_line":"            is_public\u003dnova_flavor.is_public,"},{"line_number":213,"context_line":"            extra_specs\u003dflavor_dict.get(\u0027extra_specs\u0027)"},{"line_number":214,"context_line":"        )"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"71ae6e61_9fabe5c4","line":213,"in_reply_to":"2ea8860d_bcb73485","updated":"2026-01-22 16:27:36.000000000","message":"this i think is the only change i would prefer to make before merging this i think the rest can be defered to the patches that start using it.\n\nwaht do others think. are we happy with the over all direction?","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c725d9fc54df683a0bd05b66c5ad7a18e4c553e3","unresolved":false,"context_lines":[{"line_number":210,"context_line":"            ephemeral\u003dnova_flavor.ephemeral,"},{"line_number":211,"context_line":"            swap\u003dswap,"},{"line_number":212,"context_line":"            is_public\u003dnova_flavor.is_public,"},{"line_number":213,"context_line":"            extra_specs\u003dflavor_dict.get(\u0027extra_specs\u0027)"},{"line_number":214,"context_line":"        )"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"50b12659_a869deda","line":213,"in_reply_to":"5b893779_59a859b2","updated":"2026-01-29 13:21:37.000000000","message":"Done","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"dd8406ab8de0f353fbfc16fb155a0acf6bdfbeee","unresolved":true,"context_lines":[{"line_number":210,"context_line":"            ephemeral\u003dnova_flavor.ephemeral,"},{"line_number":211,"context_line":"            swap\u003dswap,"},{"line_number":212,"context_line":"            is_public\u003dnova_flavor.is_public,"},{"line_number":213,"context_line":"            extra_specs\u003dflavor_dict.get(\u0027extra_specs\u0027)"},{"line_number":214,"context_line":"        )"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"255c3f53_edd554a6","line":213,"in_reply_to":"71ae6e61_9fabe5c4","updated":"2026-01-22 16:34:24.000000000","message":"right, sorry I missed this while going through the comments. I agree with the suggestion and introduced in patchset 9","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f87060c06be09d19acda01afa11342d0b1ca4689","unresolved":true,"context_lines":[{"line_number":288,"context_line":"    resolved at construction time."},{"line_number":289,"context_line":"    \"\"\""},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    id: str"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    @classmethod"},{"line_number":294,"context_line":"    def from_novaclient(cls, nova_migration):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1bbf468f_3d422cb1","line":291,"updated":"2026-01-22 13:33:34.000000000","message":"this proably shoudl have things like the state as well bug i guess we will see what files are required based on the usage in the following patches","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"2807d20cbd9ac2c12cb216111739255b3142d4ad","unresolved":true,"context_lines":[{"line_number":288,"context_line":"    resolved at construction time."},{"line_number":289,"context_line":"    \"\"\""},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    id: str"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    @classmethod"},{"line_number":294,"context_line":"    def from_novaclient(cls, nova_migration):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3b395ad7_b48c179e","line":291,"in_reply_to":"1bbf468f_3d422cb1","updated":"2026-01-22 14:18:36.000000000","message":"the id is the only field that is being used atm in watcher,we can always add more later if they are useful","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"df214e8a9f22481fea42e91701b59e0d7fc90d4a","unresolved":false,"context_lines":[{"line_number":288,"context_line":"    resolved at construction time."},{"line_number":289,"context_line":"    \"\"\""},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    id: str"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    @classmethod"},{"line_number":294,"context_line":"    def from_novaclient(cls, nova_migration):"}],"source_content_type":"text/x-python","patch_set":8,"id":"291f700f_9dd8eb2e","line":291,"in_reply_to":"3b395ad7_b48c179e","updated":"2026-01-22 16:26:07.000000000","message":"Acknowledged","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"331ee44fa1f0bb628b3a800844a83f53416f4403","unresolved":true,"context_lines":[{"line_number":64,"context_line":"    resolved at construction time."},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    id: str"},{"line_number":68,"context_line":"    name: str"},{"line_number":69,"context_line":"    created: str"},{"line_number":70,"context_line":"    host: str | None"}],"source_content_type":"text/x-python","patch_set":10,"id":"24b52028_5507b7cc","line":67,"updated":"2026-01-29 13:27:26.000000000","message":"thinking about this we shoudl call this UUID and perhaps even enforce that\n\npartly to avoid the id builtin function name but mainly because this shoudl actully be a uuid.\n\nthe same applies to all the other id fiels below.\n\nwe can dicuss that in a follow up patch","commit_id":"6e92c2e959be536080a830f97e3d9a1654ef8e12"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"bbc31bdc5ec0ed0233d408f2e20bbea4dbe77318","unresolved":true,"context_lines":[{"line_number":64,"context_line":"    resolved at construction time."},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    id: str"},{"line_number":68,"context_line":"    name: str"},{"line_number":69,"context_line":"    created: str"},{"line_number":70,"context_line":"    host: str | None"}],"source_content_type":"text/x-python","patch_set":10,"id":"7bca786b_7b5e993d","line":67,"in_reply_to":"24b52028_5507b7cc","updated":"2026-01-29 14:04:58.000000000","message":"ack, that makes sense, I can add that change to the next patch in the chain were the classes are used","commit_id":"6e92c2e959be536080a830f97e3d9a1654ef8e12"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"81da4c39e0bf34c9147ede7ecdbef787281f74d3","unresolved":true,"context_lines":[{"line_number":64,"context_line":"    resolved at construction time."},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    id: str"},{"line_number":68,"context_line":"    name: str"},{"line_number":69,"context_line":"    created: str"},{"line_number":70,"context_line":"    host: str | None"}],"source_content_type":"text/x-python","patch_set":10,"id":"ed99e832_b53549f0","line":67,"in_reply_to":"7bca786b_7b5e993d","updated":"2026-01-29 14:17:04.000000000","message":"after starting to change it, I noticed that  not all resources ids are actually uuids (e.g flavors, aggregates and server migrations return integers as ids) unless I misunderstood the API docuemtation e.g https://docs.openstack.org/api-ref/compute/#show-migration-details","commit_id":"6e92c2e959be536080a830f97e3d9a1654ef8e12"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c725d9fc54df683a0bd05b66c5ad7a18e4c553e3","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    availability_zone: str | None"},{"line_number":80,"context_line":"    pinned_availability_zone: str | None"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    @classmethod"},{"line_number":83,"context_line":"    def from_novaclient(cls, nova_server):"},{"line_number":84,"context_line":"        \"\"\"Create a Server dataclass from a novaclient Server object."},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3ddffd95_acfaea6c","line":82,"in_reply_to":"ccf6cbea_0899c44d","updated":"2026-01-29 13:21:37.000000000","message":"DONE","commit_id":"6e92c2e959be536080a830f97e3d9a1654ef8e12"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"12e7d6cd8fe94d452cc85edb52083b457d12d332","unresolved":true,"context_lines":[{"line_number":288,"context_line":"    resolved at construction time."},{"line_number":289,"context_line":"    \"\"\""},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    id: str"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    @classmethod"},{"line_number":294,"context_line":"    def from_novaclient(cls, nova_migration):"}],"source_content_type":"text/x-python","patch_set":13,"id":"5596b720_65937c0f","line":291,"updated":"2026-02-03 12:43:00.000000000","message":"it bothers me a bit to only have \u0027id\u0027 info here, but that\u0027s fine, since we use more info about the servers when dealing with migrations. And we can add info as needed.","commit_id":"2d0eec1fe8748601179aedcf48dfd979f46709f7"}],"watcher/tests/unit/common/test_nova_helper.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f87060c06be09d19acda01afa11342d0b1ca4689","unresolved":true,"context_lines":[{"line_number":1263,"context_line":"    \"\"\"Test suite for the Server dataclass.\"\"\""},{"line_number":1264,"context_line":""},{"line_number":1265,"context_line":"    @staticmethod"},{"line_number":1266,"context_line":"    def create_nova_server(server_id, **kwargs):"},{"line_number":1267,"context_line":"        \"\"\"Create a real novaclient Server object."},{"line_number":1268,"context_line":""},{"line_number":1269,"context_line":"        :param server_id: server UUID"}],"source_content_type":"text/x-python","patch_set":8,"id":"f39a7e50_20de3fab","line":1266,"updated":"2026-01-22 13:33:34.000000000","message":"so i think thsee static methos are likely tobe useful elsewhere later\n\nso i woud create a new watcher/tests/unit/common/nova_helper.py file and add a new mixin class NovaHelperMixin that will only contian tehe create_* static methods\n\nthen add that to the interitied classes for each of these test classes\n\nfrom watcher.tests.unit.common import nova_helper as nh\nclass TestServerWrapper(base.TestCase,nh.NovaHelperMixin):\n\nthese specific tests are only testing one calss at a time but as we start usign thes more widely you are going to need to create these objects in other test. so it  make sense to factor out these conveince functions into a mixin we can reuse.\n\nwe may want to add nh.NovaHelperMixin to base.TestCase even since we will want this in all the unit tests and that way we can avoid having to import it in each unit test file","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"df214e8a9f22481fea42e91701b59e0d7fc90d4a","unresolved":true,"context_lines":[{"line_number":1263,"context_line":"    \"\"\"Test suite for the Server dataclass.\"\"\""},{"line_number":1264,"context_line":""},{"line_number":1265,"context_line":"    @staticmethod"},{"line_number":1266,"context_line":"    def create_nova_server(server_id, **kwargs):"},{"line_number":1267,"context_line":"        \"\"\"Create a real novaclient Server object."},{"line_number":1268,"context_line":""},{"line_number":1269,"context_line":"        :param server_id: server UUID"}],"source_content_type":"text/x-python","patch_set":8,"id":"d95583c5_1f8e40a4","line":1266,"in_reply_to":"32556244_8719a8cd","updated":"2026-01-22 16:26:07.000000000","message":"ack we can defer this to that patch. i think i woudl still perfer to provide these via a mixin class or on the base unit test test case but this works for now","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1ebfe756a3ee73cef1f301b35a2255addbcf5598","unresolved":false,"context_lines":[{"line_number":1263,"context_line":"    \"\"\"Test suite for the Server dataclass.\"\"\""},{"line_number":1264,"context_line":""},{"line_number":1265,"context_line":"    @staticmethod"},{"line_number":1266,"context_line":"    def create_nova_server(server_id, **kwargs):"},{"line_number":1267,"context_line":"        \"\"\"Create a real novaclient Server object."},{"line_number":1268,"context_line":""},{"line_number":1269,"context_line":"        :param server_id: server UUID"}],"source_content_type":"text/x-python","patch_set":8,"id":"f01f2a41_f6b20e79","line":1266,"in_reply_to":"d95583c5_1f8e40a4","updated":"2026-01-22 16:27:36.000000000","message":"Acknowledged","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"2807d20cbd9ac2c12cb216111739255b3142d4ad","unresolved":true,"context_lines":[{"line_number":1263,"context_line":"    \"\"\"Test suite for the Server dataclass.\"\"\""},{"line_number":1264,"context_line":""},{"line_number":1265,"context_line":"    @staticmethod"},{"line_number":1266,"context_line":"    def create_nova_server(server_id, **kwargs):"},{"line_number":1267,"context_line":"        \"\"\"Create a real novaclient Server object."},{"line_number":1268,"context_line":""},{"line_number":1269,"context_line":"        :param server_id: server UUID"}],"source_content_type":"text/x-python","patch_set":8,"id":"32556244_8719a8cd","line":1266,"in_reply_to":"f39a7e50_20de3fab","updated":"2026-01-22 14:18:36.000000000","message":"in the following patch in the chain I noticed that the methods to create server and hypervisors would be very useful in more than one test file (for example the zone migration tests) so I moved them to utils file under tests/unit/common. We can discuss the exact details in that patch","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"}]}
