)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"240edb820cff34f21cbb2968e46cde8a270f84cf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"17c0364c_94d28fb4","updated":"2023-10-06 11:17:50.000000000","message":"Again, is there anything totally unique about glance tags to warrant now using the tag mixin like everyone else?","commit_id":"473e81074fee1db44c81d77e4ed26ca2f55a87b0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4ff25a08bff609e00f5efad73227b5be3e4c4313","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"1862ff1c_0f3d85f6","updated":"2024-01-31 10:29:26.000000000","message":"This is looking much better. Few remaining nits. Could we also get a release note, please?","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0b74fad0754cef0efda4993f6fa046e77e3e032d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"765a1966_eb07e980","updated":"2024-02-01 16:27:15.000000000","message":"Two test nits. This looks good now though. Nice work here.","commit_id":"7ccdba206af770ff40b379bb2f4155e3e01ca909"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d20c437fc7e5540ad5415691d8a1ab1c821bce3d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"d84ea7af_2793406f","updated":"2024-02-02 11:36:12.000000000","message":"Spotted some new gaps, I\u0027m afraid 😞","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"fdfd09e9f4dbdffb25033b7af13b8e817bc10d74","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"c4a16c32_17b2d1e3","updated":"2024-02-11 05:46:15.000000000","message":"recheck","commit_id":"fffd396892fb84645acb51cd5676a4719322674c"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"1b7626042f6f45dd7221ed339f48e10b92b1da6a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"353c4e57_3789b4b1","updated":"2025-07-28 15:45:21.000000000","message":"@stephenfin@redhat.com I think your comments have been addressed, right?","commit_id":"ca45c31791bdc85083d7b27e86110ca5197ee430"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e5339b75cde9a4fc4c30b1ac30007e3bd08b8140","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"0a50563f_da06d9d4","updated":"2025-08-15 13:02:20.000000000","message":"We\u0027re also missing proxy methods here","commit_id":"ca45c31791bdc85083d7b27e86110ca5197ee430"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"8990917117253d6ecebc28166632b110531717fc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"37f1eba4_98a91c11","updated":"2025-05-16 07:02:18.000000000","message":"recheck","commit_id":"ca45c31791bdc85083d7b27e86110ca5197ee430"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"9fd0e1537d3cffd644d509e6a1d53a87568b1592","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"006a51a5_560f1f2a","updated":"2025-11-21 00:36:55.000000000","message":"I tested this SDK patch alongside the OSC patch at https://review.opendev.org/c/openstack/python-openstackclient/+/905866 . Here is an example session:\n\n# Creating the namespace\n$ jq \u003c md.json\n{\n  \"namespace\": \"TestNameSpace\",\n  \"display_name\": \"Test namespace\",\n  \"description\": \"This is a test namespace\"\n}\n$ glance md-namespace-import  \u003c md.json                         \n+--------------+----------------------------------+\n| Property     | Value                            |\n+--------------+----------------------------------+\n| created_at   | 2025-11-20T23:41:23Z             |\n| description  | This is a test namespace         |\n| display_name | Test namespace                   |\n| namespace    | TestNameSpace                    |\n| owner        | 5b7770b1864e4ab4b5a8fd8f76a1774d |\n| protected    | False                            |\n| schema       | /v2/schemas/metadefs/namespace   |\n| updated_at   | 2025-11-20T23:41:23Z             |\n| visibility   | private                          |\n+--------------+----------------------------------+\n\n# Setting two tags\n$ openstack image metadef namespace set --tag tagone TestNameSpace\n$ openstack image metadef namespace set --tag tagtwo TestNameSpace\n\n# The tags do not show properly here.\n# I think the issues lies in openstack/resource.py:\n# Resource.fetch does not modify the tags received from the Glance API. Do we need to write a _translate_response method for MetadefNamespace?\n$ openstack image metadef namespace show --format json TestNamespace | jq -c .tags\n[{\"name\":\"tagtwo\"},{\"name\":\"tagone\"}]\n$ glance md-tag-list  TestNameSpace\n+--------+\n| name   |\n+--------+\n| tagtwo |\n| tagone |\n+--------+\n\n# Let\u0027s remove all tags and check that it worked:\n$ openstack image metadef namespace unset --all-tags TestNameSpace\n$ openstack image metadef namespace show --format json TestNamespace | jq -c .tags\n[]\n\n# Let\u0027s add two new tags and only remove one:\n$ openstack image metadef namespace set --tag tagthree TestNameSpace\n$ openstack image metadef namespace set --tag tagfour TestNameSpace\n$ openstack image metadef namespace show --format json TestNamespace | jq -c .tags\n[{\"name\":\"tagfour\"},{\"name\":\"tagthree\"}]\n$ openstack image metadef namespace unset --tag tagthree TestNamespace\n$ openstack image metadef namespace show --format json TestNamespace | jq -c .tags\n[{\"name\":\"tagfour\"}]","commit_id":"9ae9bf05620603b1023bfb37b21647835f67cdf2"}],"openstack/image/v2/_proxy.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9aa1fecfaa8f0fbfbefd5cd769aa47be3c7279cc","unresolved":true,"context_lines":[{"line_number":1314,"context_line":"        )"},{"line_number":1315,"context_line":""},{"line_number":1316,"context_line":"    # \u003d\u003d\u003d\u003d\u003d\u003d METADEF TAGS \u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":1317,"context_line":"    def create_metadef_tag(self, namespace, tag_name):"},{"line_number":1318,"context_line":"        \"\"\"Create a single metadef object"},{"line_number":1319,"context_line":""},{"line_number":1320,"context_line":"        :param namespace: The value can be either the name of a metadef"}],"source_content_type":"text/x-python","patch_set":6,"id":"5c001e61_9c7a0e53","line":1317,"updated":"2024-01-26 15:29:38.000000000","message":"As with other patches in this series, I don\u0027t think we really need this proxy method: users can set tags via `update_metadef_namespace`.","commit_id":"6504331685c802ddca3056a9d1486dea4d49c34f"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"7f24db0fcbb4d888ed831753b85048377988dd18","unresolved":false,"context_lines":[{"line_number":1314,"context_line":"        )"},{"line_number":1315,"context_line":""},{"line_number":1316,"context_line":"    # \u003d\u003d\u003d\u003d\u003d\u003d METADEF TAGS \u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":1317,"context_line":"    def create_metadef_tag(self, namespace, tag_name):"},{"line_number":1318,"context_line":"        \"\"\"Create a single metadef object"},{"line_number":1319,"context_line":""},{"line_number":1320,"context_line":"        :param namespace: The value can be either the name of a metadef"}],"source_content_type":"text/x-python","patch_set":6,"id":"954315bc_f6515754","line":1317,"in_reply_to":"5c001e61_9c7a0e53","updated":"2024-01-30 10:24:45.000000000","message":"dropped the proxy_method","commit_id":"6504331685c802ddca3056a9d1486dea4d49c34f"}],"openstack/image/v2/metadef_namespace.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9aa1fecfaa8f0fbfbefd5cd769aa47be3c7279cc","unresolved":true,"context_lines":[{"line_number":75,"context_line":"            retry_on_conflict\u003dNone,"},{"line_number":76,"context_line":"        )"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def add_tag(self, session, tag):"},{"line_number":79,"context_line":"        \"\"\"Adds a single tag to the resource."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":6,"id":"b5c1cf31_07e755f0","line":78,"updated":"2024-01-26 15:29:38.000000000","message":"This is already defined in `TagMixin`. Why are you providing your own implementation?","commit_id":"6504331685c802ddca3056a9d1486dea4d49c34f"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"7f24db0fcbb4d888ed831753b85048377988dd18","unresolved":true,"context_lines":[{"line_number":75,"context_line":"            retry_on_conflict\u003dNone,"},{"line_number":76,"context_line":"        )"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def add_tag(self, session, tag):"},{"line_number":79,"context_line":"        \"\"\"Adds a single tag to the resource."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":6,"id":"b633ef84_e23e3d56","line":78,"in_reply_to":"b5c1cf31_07e755f0","updated":"2024-01-30 10:24:45.000000000","message":"for creating a new tag we need to make a POST call , whereas the original method does a PUT call","commit_id":"6504331685c802ddca3056a9d1486dea4d49c34f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"644cc3af67cbccb208e070c57530f12ffac42315","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            retry_on_conflict\u003dNone,"},{"line_number":76,"context_line":"        )"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def add_tag(self, session, tag):"},{"line_number":79,"context_line":"        \"\"\"Adds a single tag to the resource."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":6,"id":"2b234ab4_3c577365","line":78,"in_reply_to":"b633ef84_e23e3d56","updated":"2024-01-30 10:36:10.000000000","message":"Acknowledged","commit_id":"6504331685c802ddca3056a9d1486dea4d49c34f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"644cc3af67cbccb208e070c57530f12ffac42315","unresolved":true,"context_lines":[{"line_number":75,"context_line":"            retry_on_conflict\u003dNone,"},{"line_number":76,"context_line":"        )"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    # NOTE(mrjoshi) re-implemented the add_tag method o ``TagMixin`` class"},{"line_number":79,"context_line":"    # as we require a ``POST`` call, the original method does a ``PUT`` call."},{"line_number":80,"context_line":"    def add_tag(self, session, tag):"},{"line_number":81,"context_line":"        \"\"\"Adds a single tag to the resource."}],"source_content_type":"text/x-python","patch_set":7,"id":"60a92ab1_02fd8bc8","line":78,"range":{"start_line":78,"start_character":54,"end_line":78,"end_character":55},"updated":"2024-01-30 10:36:10.000000000","message":"of?","commit_id":"232b7887e63e975cf8dc682b65342d89356fba19"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"906a16ce84b10489bef71fab7c0fdfb364049e59","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            retry_on_conflict\u003dNone,"},{"line_number":76,"context_line":"        )"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    # NOTE(mrjoshi) re-implemented the add_tag method o ``TagMixin`` class"},{"line_number":79,"context_line":"    # as we require a ``POST`` call, the original method does a ``PUT`` call."},{"line_number":80,"context_line":"    def add_tag(self, session, tag):"},{"line_number":81,"context_line":"        \"\"\"Adds a single tag to the resource."}],"source_content_type":"text/x-python","patch_set":7,"id":"edc66588_66b3d538","line":78,"range":{"start_line":78,"start_character":54,"end_line":78,"end_character":55},"in_reply_to":"60a92ab1_02fd8bc8","updated":"2024-01-31 07:41:03.000000000","message":"Done","commit_id":"232b7887e63e975cf8dc682b65342d89356fba19"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"644cc3af67cbccb208e070c57530f12ffac42315","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        session \u003d self._get_session(session)"},{"line_number":88,"context_line":"        response \u003d session.post(url)"},{"line_number":89,"context_line":"        exceptions.raise_from_response(response)"},{"line_number":90,"context_line":"        return response.json()"}],"source_content_type":"text/x-python","patch_set":7,"id":"7cc6b3c4_5a6c0004","line":90,"updated":"2024-01-30 10:36:10.000000000","message":"Can we populate `self` like we do in `TagMixin.add_tag`? Look for the `self._body.attributes.update` call","commit_id":"232b7887e63e975cf8dc682b65342d89356fba19"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"906a16ce84b10489bef71fab7c0fdfb364049e59","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        session \u003d self._get_session(session)"},{"line_number":88,"context_line":"        response \u003d session.post(url)"},{"line_number":89,"context_line":"        exceptions.raise_from_response(response)"},{"line_number":90,"context_line":"        return response.json()"}],"source_content_type":"text/x-python","patch_set":7,"id":"9bf0f81c_5baebbc6","line":90,"in_reply_to":"7cc6b3c4_5a6c0004","updated":"2024-01-31 07:41:03.000000000","message":"Done","commit_id":"232b7887e63e975cf8dc682b65342d89356fba19"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4ff25a08bff609e00f5efad73227b5be3e4c4313","unresolved":true,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    # NOTE(mrjoshi): Added this method instead of using set_tags, as this"},{"line_number":96,"context_line":"    # requires a ``POST`` call whereas set_tags does a ``PUT`` call."},{"line_number":97,"context_line":"    def add_tags(self, session, *, append\u003dFalse, **tags):"},{"line_number":98,"context_line":"        \"\"\"Add all tags on the resource."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":8,"id":"36246861_75f6600e","line":97,"range":{"start_line":97,"start_character":49,"end_line":97,"end_character":55},"updated":"2024-01-31 10:29:26.000000000","message":"I mentioned this on [the previous review](https://review.opendev.org/c/openstack/openstacksdk/+/896903/2/openstack/image/v2/metadef_namespace.py)...\n\nWhat is the expected format of `tags`? You\u0027ve described it as a list but this suggests a mapping? Perhaps you meant `*args` rather than `**kwargs`.\n\nLater: Looking at the code, it seems Glance expects a body like so:\n\n```\n{\n    \"tags\": [\"tag_a\", \"tag_b\"]\n}\n```\n\nWe should produce this body ourselves, so yes, I\u0027d expect `tags` to be a list (i.e. `*tags`, not a dict.","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"b274ca19aa007671801c4923bd8f7ead1fab4500","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    # NOTE(mrjoshi): Added this method instead of using set_tags, as this"},{"line_number":96,"context_line":"    # requires a ``POST`` call whereas set_tags does a ``PUT`` call."},{"line_number":97,"context_line":"    def add_tags(self, session, *, append\u003dFalse, **tags):"},{"line_number":98,"context_line":"        \"\"\"Add all tags on the resource."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":8,"id":"a905c50c_e642519f","line":97,"range":{"start_line":97,"start_character":49,"end_line":97,"end_character":55},"in_reply_to":"36246861_75f6600e","updated":"2024-02-01 14:40:12.000000000","message":"Acknowledged","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4ff25a08bff609e00f5efad73227b5be3e4c4313","unresolved":true,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        :param session: The session to use for making this request."},{"line_number":101,"context_line":"        :param bool append: If set to true it adds new tags to existing"},{"line_number":102,"context_line":"         else overwrites the existing tags with new ones."},{"line_number":103,"context_line":"        :param list tags: List with tags to be set on the resource"},{"line_number":104,"context_line":"        \"\"\""},{"line_number":105,"context_line":"        url \u003d utils.urljoin(self.base_path, self.id, \u0027tags\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9500525b_a5cbfa45","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":9},"updated":"2024-01-31 10:29:26.000000000","message":"can you indent this by 4 spaces rather than 1, as is customary?","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"b274ca19aa007671801c4923bd8f7ead1fab4500","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        :param session: The session to use for making this request."},{"line_number":101,"context_line":"        :param bool append: If set to true it adds new tags to existing"},{"line_number":102,"context_line":"         else overwrites the existing tags with new ones."},{"line_number":103,"context_line":"        :param list tags: List with tags to be set on the resource"},{"line_number":104,"context_line":"        \"\"\""},{"line_number":105,"context_line":"        url \u003d utils.urljoin(self.base_path, self.id, \u0027tags\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3e7c74d0_3c3a8d9d","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":9},"in_reply_to":"9500525b_a5cbfa45","updated":"2024-02-01 14:40:12.000000000","message":"Done","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4ff25a08bff609e00f5efad73227b5be3e4c4313","unresolved":true,"context_lines":[{"line_number":106,"context_line":"        session \u003d self._get_session(session)"},{"line_number":107,"context_line":"        headers \u003d {}"},{"line_number":108,"context_line":"        if append:"},{"line_number":109,"context_line":"            headers[\u0027X-Openstack-Append\u0027] \u003d \u0027True\u0027"},{"line_number":110,"context_line":"        response \u003d session.post(url, headers\u003dheaders, data\u003djson.dumps(tags))"},{"line_number":111,"context_line":"        exceptions.raise_from_response(response)"},{"line_number":112,"context_line":"        self._body.attributes.update({\u0027tags\u0027: response.json()})"}],"source_content_type":"text/x-python","patch_set":8,"id":"ce0015fc_9f1bfb9e","line":109,"range":{"start_line":109,"start_character":44,"end_line":109,"end_character":50},"updated":"2024-01-31 10:29:26.000000000","message":"Is this supposed to be a string or a boolean? I assume requests/urllib does the cast to string for us, if a string is needed?","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0b74fad0754cef0efda4993f6fa046e77e3e032d","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        session \u003d self._get_session(session)"},{"line_number":107,"context_line":"        headers \u003d {}"},{"line_number":108,"context_line":"        if append:"},{"line_number":109,"context_line":"            headers[\u0027X-Openstack-Append\u0027] \u003d \u0027True\u0027"},{"line_number":110,"context_line":"        response \u003d session.post(url, headers\u003dheaders, data\u003djson.dumps(tags))"},{"line_number":111,"context_line":"        exceptions.raise_from_response(response)"},{"line_number":112,"context_line":"        self._body.attributes.update({\u0027tags\u0027: response.json()})"}],"source_content_type":"text/x-python","patch_set":8,"id":"03000996_a1be3b5b","line":109,"range":{"start_line":109,"start_character":44,"end_line":109,"end_character":50},"in_reply_to":"b8e4a31d_d5487bd1","updated":"2024-02-01 16:27:15.000000000","message":"Okay, so no automatic cast. Good to know","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"b274ca19aa007671801c4923bd8f7ead1fab4500","unresolved":true,"context_lines":[{"line_number":106,"context_line":"        session \u003d self._get_session(session)"},{"line_number":107,"context_line":"        headers \u003d {}"},{"line_number":108,"context_line":"        if append:"},{"line_number":109,"context_line":"            headers[\u0027X-Openstack-Append\u0027] \u003d \u0027True\u0027"},{"line_number":110,"context_line":"        response \u003d session.post(url, headers\u003dheaders, data\u003djson.dumps(tags))"},{"line_number":111,"context_line":"        exceptions.raise_from_response(response)"},{"line_number":112,"context_line":"        self._body.attributes.update({\u0027tags\u0027: response.json()})"}],"source_content_type":"text/x-python","patch_set":8,"id":"b8e4a31d_d5487bd1","line":109,"range":{"start_line":109,"start_character":44,"end_line":109,"end_character":50},"in_reply_to":"ce0015fc_9f1bfb9e","updated":"2024-02-01 14:40:12.000000000","message":"It should be bool ideally, but on passing bool we get an exception stating \n`keystoneauth1.exceptions.connection.UnknownConnectionError: Unexpected exception for ../image/v2/metadefs/namespaces/../tags: Header part (True) from {\u0027X-Openstack-Append\u0027: True} must be of type str or bytes, not \u003cclass \u0027bool\u0027\u003e`","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4ff25a08bff609e00f5efad73227b5be3e4c4313","unresolved":true,"context_lines":[{"line_number":112,"context_line":"        self._body.attributes.update({\u0027tags\u0027: response.json()})"},{"line_number":113,"context_line":"        return self"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    # re-implemnted set_tags for a single tag"},{"line_number":116,"context_line":"    def set_tag(self, session, tag, **attrs):"},{"line_number":117,"context_line":"        \"\"\"Update tag on the resource."},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"732be790_729f06ce","line":115,"range":{"start_line":115,"start_character":9,"end_line":115,"end_character":19},"updated":"2024-01-31 10:29:26.000000000","message":"implemented","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"b274ca19aa007671801c4923bd8f7ead1fab4500","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        self._body.attributes.update({\u0027tags\u0027: response.json()})"},{"line_number":113,"context_line":"        return self"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    # re-implemnted set_tags for a single tag"},{"line_number":116,"context_line":"    def set_tag(self, session, tag, **attrs):"},{"line_number":117,"context_line":"        \"\"\"Update tag on the resource."},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"8bdcffd9_00373385","line":115,"range":{"start_line":115,"start_character":9,"end_line":115,"end_character":19},"in_reply_to":"732be790_729f06ce","updated":"2024-02-01 14:40:12.000000000","message":"Done","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"9605252f9cb5ec1f8d841c7d4f749fe125f7e298","unresolved":true,"context_lines":[{"line_number":119,"context_line":"        return self"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    # re-implemented set_tags for a single tag"},{"line_number":122,"context_line":"    def set_tag(self, session, tag, **attrs):"},{"line_number":123,"context_line":"        \"\"\"Update tag on the resource."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":11,"id":"1fc25165_31ce8276","line":122,"updated":"2024-02-21 19:37:33.000000000","message":"Are we re-implementing set_tags (plural, as in the comment) or set_tag (singular, as in the method name)? set_tag (singular) does not seem to exist in the SDK, so I\u0027m not sure how it would end up being called.","commit_id":"fffd396892fb84645acb51cd5676a4719322674c"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"c7d40ad5c8257a535b885608f55f59ce2efdd68f","unresolved":true,"context_lines":[{"line_number":119,"context_line":"        return self"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    # re-implemented set_tags for a single tag"},{"line_number":122,"context_line":"    def set_tag(self, session, tag, **attrs):"},{"line_number":123,"context_line":"        \"\"\"Update tag on the resource."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":11,"id":"d5d7f71c_b7537ff3","line":122,"in_reply_to":"1fc25165_31ce8276","updated":"2024-02-27 17:49:08.000000000","message":"Yes. we don\u0027t have a method set_tag, will correct it","commit_id":"fffd396892fb84645acb51cd5676a4719322674c"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"9b532a4b6acf53b3169c59d3b966482722af1649","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        return self"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    # re-implemented set_tags for a single tag"},{"line_number":122,"context_line":"    def set_tag(self, session, tag, **attrs):"},{"line_number":123,"context_line":"        \"\"\"Update tag on the resource."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":11,"id":"033b66be_fe2f3ff6","line":122,"in_reply_to":"d5d7f71c_b7537ff3","updated":"2024-03-04 07:05:53.000000000","message":"Done","commit_id":"fffd396892fb84645acb51cd5676a4719322674c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2dd876146b18c47ffa49a5ac4ed96543978eab26","unresolved":true,"context_lines":[{"line_number":118,"context_line":"        self._body.attributes.update({\u0027tags\u0027: self.tags})"},{"line_number":119,"context_line":"        return self"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    # NOTE(mrjoshi): Added this method instead of using set_tags, as this"},{"line_number":122,"context_line":"    # requires a ``POST`` call whereas set_tags does a ``PUT`` call."},{"line_number":123,"context_line":"    def add_tags(self, session, *tags, append\u003dFalse):"},{"line_number":124,"context_line":"        \"\"\"Add all tags on the resource."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":13,"id":"14f39c19_f5d663ee","line":123,"range":{"start_line":121,"start_character":0,"end_line":123,"end_character":53},"updated":"2025-04-08 11:20:45.000000000","message":"Neutron resources now provide an [`add_tags` method](https://github.com/openstack/openstacksdk/blob/14b11bf1869b35ec28b65c52c6cdaefa9f58f630/openstack/network/v2/_base.py#L50-L62) that is used exclusively to append tags. Could we copy that behavior here? We can also override `set_tags` and just change the method used, like you\u0027ve done for `add_tag` above. \n\n```suggestion\n    def add_tags(self, session, tags):\n        \"\"\"Create the tags on the resource\n\n        :param session: The session to use for making this request.\n        :param tags: List with tags to be set on the resource\n        \"\"\"\n        tags \u003d tags or []\n        url \u003d utils.urljoin(self.base_path, self.id, \u0027tags\u0027)\n        session \u003d self._get_session(session)\n        headers \u003d {\u0027X-OpenStack-Append\u0027: \u0027True\u0027}\n        response \u003d session.post(\n            url,\n            headers\u003dheaders,\n            json\u003d{\u0027tags\u0027: [{\u0027name\u0027: x} for x in tags]},\n        )\n        exceptions.raise_from_response(response)\n        # we do not want to update tags directly\n        self.tags.extend([tag for tag in tags if tag not in self.tags])\n        self._body.attributes.update({\u0027tags\u0027: self.tags})\n        return self\n\n    # NOTE(mrjoshi): Re-implemented the method as we require a ``POST`` call\n    # rather than the ``PUT`` call used by the ``TagMixin`` implementation.\n    def set_tags(self, session, tags):\n```","commit_id":"1f1cf440966510905963beaa1d40c3484a48d2a5"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"1fb05555d7ab3b084bb83cef8126888757277514","unresolved":true,"context_lines":[{"line_number":118,"context_line":"        self._body.attributes.update({\u0027tags\u0027: self.tags})"},{"line_number":119,"context_line":"        return self"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    # NOTE(mrjoshi): Added this method instead of using set_tags, as this"},{"line_number":122,"context_line":"    # requires a ``POST`` call whereas set_tags does a ``PUT`` call."},{"line_number":123,"context_line":"    def add_tags(self, session, *tags, append\u003dFalse):"},{"line_number":124,"context_line":"        \"\"\"Add all tags on the resource."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":13,"id":"4be7332d_668f711d","line":123,"range":{"start_line":121,"start_character":0,"end_line":123,"end_character":53},"in_reply_to":"14f39c19_f5d663ee","updated":"2025-05-07 11:16:39.000000000","message":"Ack,\n``set_tags`` method replaces all the tags here we are updating a specific tag using ``set_tag``.","commit_id":"1f1cf440966510905963beaa1d40c3484a48d2a5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6844387a2d9933ff957c3f2bcdc319728bd1e0b9","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        self._body.attributes.update({\u0027tags\u0027: self.tags})"},{"line_number":119,"context_line":"        return self"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    # NOTE(mrjoshi): Added this method instead of using set_tags, as this"},{"line_number":122,"context_line":"    # requires a ``POST`` call whereas set_tags does a ``PUT`` call."},{"line_number":123,"context_line":"    def add_tags(self, session, *tags, append\u003dFalse):"},{"line_number":124,"context_line":"        \"\"\"Add all tags on the resource."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":13,"id":"91fbaf3c_40187e07","line":123,"range":{"start_line":121,"start_character":0,"end_line":123,"end_character":53},"in_reply_to":"4be7332d_668f711d","updated":"2025-08-07 16:44:58.000000000","message":"Ah, okay, now I understand. Let\u0027s take a different tack so.","commit_id":"1f1cf440966510905963beaa1d40c3484a48d2a5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2dd876146b18c47ffa49a5ac4ed96543978eab26","unresolved":true,"context_lines":[{"line_number":121,"context_line":"    # NOTE(mrjoshi): Added this method instead of using set_tags, as this"},{"line_number":122,"context_line":"    # requires a ``POST`` call whereas set_tags does a ``PUT`` call."},{"line_number":123,"context_line":"    def add_tags(self, session, *tags, append\u003dFalse):"},{"line_number":124,"context_line":"        \"\"\"Add all tags on the resource."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        :param session: The session to use for making this request."},{"line_number":127,"context_line":"        :param bool append: If set to true it adds new tags to existing"}],"source_content_type":"text/x-python","patch_set":13,"id":"5e74ecf0_98e6807a","line":124,"range":{"start_line":124,"start_character":8,"end_line":124,"end_character":40},"updated":"2025-04-08 11:20:45.000000000","message":"```suggestion\n        \"\"\"Sets/Replaces all tags on the resource.\n```","commit_id":"1f1cf440966510905963beaa1d40c3484a48d2a5"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"1fb05555d7ab3b084bb83cef8126888757277514","unresolved":true,"context_lines":[{"line_number":121,"context_line":"    # NOTE(mrjoshi): Added this method instead of using set_tags, as this"},{"line_number":122,"context_line":"    # requires a ``POST`` call whereas set_tags does a ``PUT`` call."},{"line_number":123,"context_line":"    def add_tags(self, session, *tags, append\u003dFalse):"},{"line_number":124,"context_line":"        \"\"\"Add all tags on the resource."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        :param session: The session to use for making this request."},{"line_number":127,"context_line":"        :param bool append: If set to true it adds new tags to existing"}],"source_content_type":"text/x-python","patch_set":13,"id":"733816a9_1d692ed6","line":124,"range":{"start_line":124,"start_character":8,"end_line":124,"end_character":40},"in_reply_to":"5e74ecf0_98e6807a","updated":"2025-05-07 11:16:39.000000000","message":"ditto","commit_id":"1f1cf440966510905963beaa1d40c3484a48d2a5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6844387a2d9933ff957c3f2bcdc319728bd1e0b9","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    # NOTE(mrjoshi): Added this method instead of using set_tags, as this"},{"line_number":122,"context_line":"    # requires a ``POST`` call whereas set_tags does a ``PUT`` call."},{"line_number":123,"context_line":"    def add_tags(self, session, *tags, append\u003dFalse):"},{"line_number":124,"context_line":"        \"\"\"Add all tags on the resource."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        :param session: The session to use for making this request."},{"line_number":127,"context_line":"        :param bool append: If set to true it adds new tags to existing"}],"source_content_type":"text/x-python","patch_set":13,"id":"3cd85c6f_6e2abd30","line":124,"range":{"start_line":124,"start_character":8,"end_line":124,"end_character":40},"in_reply_to":"733816a9_1d692ed6","updated":"2025-08-07 16:44:58.000000000","message":"Done","commit_id":"1f1cf440966510905963beaa1d40c3484a48d2a5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2dd876146b18c47ffa49a5ac4ed96543978eab26","unresolved":true,"context_lines":[{"line_number":124,"context_line":"        \"\"\"Add all tags on the resource."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        :param session: The session to use for making this request."},{"line_number":127,"context_line":"        :param bool append: If set to true it adds new tags to existing"},{"line_number":128,"context_line":"            else overwrites the existing tags with new ones."},{"line_number":129,"context_line":"        :param list tags: List with tags to be set on the resource"},{"line_number":130,"context_line":"        \"\"\""},{"line_number":131,"context_line":"        url \u003d utils.urljoin(self.base_path, self.id, \u0027tags\u0027)"},{"line_number":132,"context_line":"        session \u003d self._get_session(session)"}],"source_content_type":"text/x-python","patch_set":13,"id":"5eb9e6b9_2301d7ab","line":129,"range":{"start_line":127,"start_character":0,"end_line":129,"end_character":66},"updated":"2025-04-08 11:20:45.000000000","message":"```suggestion\n        :param tags: List with tags to be set on the resource\n```","commit_id":"1f1cf440966510905963beaa1d40c3484a48d2a5"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"1fb05555d7ab3b084bb83cef8126888757277514","unresolved":true,"context_lines":[{"line_number":124,"context_line":"        \"\"\"Add all tags on the resource."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        :param session: The session to use for making this request."},{"line_number":127,"context_line":"        :param bool append: If set to true it adds new tags to existing"},{"line_number":128,"context_line":"            else overwrites the existing tags with new ones."},{"line_number":129,"context_line":"        :param list tags: List with tags to be set on the resource"},{"line_number":130,"context_line":"        \"\"\""},{"line_number":131,"context_line":"        url \u003d utils.urljoin(self.base_path, self.id, \u0027tags\u0027)"},{"line_number":132,"context_line":"        session \u003d self._get_session(session)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa09a4de_2dd50b39","line":129,"range":{"start_line":127,"start_character":0,"end_line":129,"end_character":66},"in_reply_to":"5eb9e6b9_2301d7ab","updated":"2025-05-07 11:16:39.000000000","message":"we would need this parameter as it helps us identify if the user wants to overwrite existing tags or add new to existing ones. \nRemoving it and always setting it to to true could create a behavioral difference","commit_id":"1f1cf440966510905963beaa1d40c3484a48d2a5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6844387a2d9933ff957c3f2bcdc319728bd1e0b9","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        \"\"\"Add all tags on the resource."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        :param session: The session to use for making this request."},{"line_number":127,"context_line":"        :param bool append: If set to true it adds new tags to existing"},{"line_number":128,"context_line":"            else overwrites the existing tags with new ones."},{"line_number":129,"context_line":"        :param list tags: List with tags to be set on the resource"},{"line_number":130,"context_line":"        \"\"\""},{"line_number":131,"context_line":"        url \u003d utils.urljoin(self.base_path, self.id, \u0027tags\u0027)"},{"line_number":132,"context_line":"        session \u003d self._get_session(session)"}],"source_content_type":"text/x-python","patch_set":13,"id":"b4961feb_60467935","line":129,"range":{"start_line":127,"start_character":0,"end_line":129,"end_character":66},"in_reply_to":"fa09a4de_2dd50b39","updated":"2025-08-07 16:44:58.000000000","message":"Done","commit_id":"1f1cf440966510905963beaa1d40c3484a48d2a5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2dd876146b18c47ffa49a5ac4ed96543978eab26","unresolved":true,"context_lines":[{"line_number":136,"context_line":"        response \u003d session.post("},{"line_number":137,"context_line":"            url,"},{"line_number":138,"context_line":"            headers\u003dheaders,"},{"line_number":139,"context_line":"            data\u003djson.dumps({\u0027tags\u0027: [{\u0027name\u0027: x} for x in tags]}),"},{"line_number":140,"context_line":"        )"},{"line_number":141,"context_line":"        exceptions.raise_from_response(response)"},{"line_number":142,"context_line":"        self.fetch_tags(session)"}],"source_content_type":"text/x-python","patch_set":13,"id":"4099fa77_d40534fb","line":139,"updated":"2025-04-08 11:20:45.000000000","message":"```suggestion\n            json\u003d{\u0027tags\u0027: [{\u0027name\u0027: x} for x in tags]},\n```","commit_id":"1f1cf440966510905963beaa1d40c3484a48d2a5"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"1fb05555d7ab3b084bb83cef8126888757277514","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        response \u003d session.post("},{"line_number":137,"context_line":"            url,"},{"line_number":138,"context_line":"            headers\u003dheaders,"},{"line_number":139,"context_line":"            data\u003djson.dumps({\u0027tags\u0027: [{\u0027name\u0027: x} for x in tags]}),"},{"line_number":140,"context_line":"        )"},{"line_number":141,"context_line":"        exceptions.raise_from_response(response)"},{"line_number":142,"context_line":"        self.fetch_tags(session)"}],"source_content_type":"text/x-python","patch_set":13,"id":"42437e63_4b57330f","line":139,"in_reply_to":"4099fa77_d40534fb","updated":"2025-05-07 11:16:39.000000000","message":"Done","commit_id":"1f1cf440966510905963beaa1d40c3484a48d2a5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2dd876146b18c47ffa49a5ac4ed96543978eab26","unresolved":true,"context_lines":[{"line_number":140,"context_line":"        )"},{"line_number":141,"context_line":"        exceptions.raise_from_response(response)"},{"line_number":142,"context_line":"        self.fetch_tags(session)"},{"line_number":143,"context_line":"        self._body.attributes.update({\u0027tags\u0027: self.tags})"},{"line_number":144,"context_line":"        return self"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    # method for updating a single metadef tag"}],"source_content_type":"text/x-python","patch_set":13,"id":"0c6458b3_2f7e24fa","line":143,"updated":"2025-04-08 11:20:45.000000000","message":"Doesn\u0027t `fetch_tags` do this for us? Can we drop this?","commit_id":"1f1cf440966510905963beaa1d40c3484a48d2a5"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"1fb05555d7ab3b084bb83cef8126888757277514","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        )"},{"line_number":141,"context_line":"        exceptions.raise_from_response(response)"},{"line_number":142,"context_line":"        self.fetch_tags(session)"},{"line_number":143,"context_line":"        self._body.attributes.update({\u0027tags\u0027: self.tags})"},{"line_number":144,"context_line":"        return self"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    # method for updating a single metadef tag"}],"source_content_type":"text/x-python","patch_set":13,"id":"e4c03e5f_4329c9c4","line":143,"in_reply_to":"0c6458b3_2f7e24fa","updated":"2025-05-07 11:16:39.000000000","message":"Done","commit_id":"1f1cf440966510905963beaa1d40c3484a48d2a5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6844387a2d9933ff957c3f2bcdc319728bd1e0b9","unresolved":true,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    # NOTE(mrjoshi) re-implemented the add_tag method of ``TagMixin`` class"},{"line_number":106,"context_line":"    # as we require a ``POST`` call, the original method does a ``PUT`` call."},{"line_number":107,"context_line":"    def add_tag(self, session, tag):"},{"line_number":108,"context_line":"        \"\"\"Adds a single tag to the resource."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":15,"id":"bbbb7eee_c51ede40","line":107,"updated":"2025-08-07 16:44:58.000000000","message":"```suggestion\n    def add_tag(self, session: resource.AdapterT, tag: str) -\u003e ty_ext.Self:\n```","commit_id":"ca45c31791bdc85083d7b27e86110ca5197ee430"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2e9ba4cc2d1c19e773d1384545b878d8c7d41830","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    # NOTE(mrjoshi) re-implemented the add_tag method of ``TagMixin`` class"},{"line_number":106,"context_line":"    # as we require a ``POST`` call, the original method does a ``PUT`` call."},{"line_number":107,"context_line":"    def add_tag(self, session, tag):"},{"line_number":108,"context_line":"        \"\"\"Adds a single tag to the resource."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":15,"id":"23142537_4382030c","line":107,"in_reply_to":"bbbb7eee_c51ede40","updated":"2025-08-15 13:47:00.000000000","message":"Done","commit_id":"ca45c31791bdc85083d7b27e86110ca5197ee430"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6844387a2d9933ff957c3f2bcdc319728bd1e0b9","unresolved":true,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    # NOTE(mrjoshi): Added this method instead of using set_tags, as this"},{"line_number":121,"context_line":"    # requires a ``POST`` call whereas set_tags does a ``PUT`` call."},{"line_number":122,"context_line":"    def add_tags(self, session, tags, append\u003dFalse):"},{"line_number":123,"context_line":"        \"\"\"Create the tags on the resource"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":15,"id":"6129c6d6_f929110d","line":122,"updated":"2025-08-07 16:44:58.000000000","message":"Rather than","commit_id":"ca45c31791bdc85083d7b27e86110ca5197ee430"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2e9ba4cc2d1c19e773d1384545b878d8c7d41830","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    # NOTE(mrjoshi): Added this method instead of using set_tags, as this"},{"line_number":121,"context_line":"    # requires a ``POST`` call whereas set_tags does a ``PUT`` call."},{"line_number":122,"context_line":"    def add_tags(self, session, tags, append\u003dFalse):"},{"line_number":123,"context_line":"        \"\"\"Create the tags on the resource"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":15,"id":"80748b1e_2cbdd9ef","line":122,"in_reply_to":"6129c6d6_f929110d","updated":"2025-08-15 13:47:00.000000000","message":"Done","commit_id":"ca45c31791bdc85083d7b27e86110ca5197ee430"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6844387a2d9933ff957c3f2bcdc319728bd1e0b9","unresolved":true,"context_lines":[{"line_number":118,"context_line":"        return self"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    # NOTE(mrjoshi): Added this method instead of using set_tags, as this"},{"line_number":121,"context_line":"    # requires a ``POST`` call whereas set_tags does a ``PUT`` call."},{"line_number":122,"context_line":"    def add_tags(self, session, tags, append\u003dFalse):"},{"line_number":123,"context_line":"        \"\"\"Create the tags on the resource"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        :param session: The session to use for making this request."},{"line_number":126,"context_line":"        :param bool append: If set to true it adds new tags to existing"},{"line_number":127,"context_line":"            else overwrites the existing tags with new ones."},{"line_number":128,"context_line":"        :param tags: List with tags to be set on the resource"},{"line_number":129,"context_line":"        \"\"\""},{"line_number":130,"context_line":"        tags \u003d tags or []"},{"line_number":131,"context_line":"        url \u003d utils.urljoin(self.base_path, self.id, \u0027tags\u0027)"},{"line_number":132,"context_line":"        session \u003d self._get_session(session)"}],"source_content_type":"text/x-python","patch_set":15,"id":"961aaf06_bd48b75c","line":129,"range":{"start_line":121,"start_character":68,"end_line":129,"end_character":11},"updated":"2025-08-07 16:44:58.000000000","message":"```suggestion\n    # requires a ``POST`` call whereas set_tags does a ``PUT`` call.\n    def set_tags(self, session, tags, append\u003dFalse):\n        \"\"\"Create the tags on the resource\n\n        :param session: The session to use for making this request.\n        :param tags: List with tags to be set on the resource\n        :param append: If set to true, adds new tags to existing tags,\n            else overwrites the existing tags with new ones.\n        \"\"\"\n```","commit_id":"ca45c31791bdc85083d7b27e86110ca5197ee430"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2e9ba4cc2d1c19e773d1384545b878d8c7d41830","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        return self"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    # NOTE(mrjoshi): Added this method instead of using set_tags, as this"},{"line_number":121,"context_line":"    # requires a ``POST`` call whereas set_tags does a ``PUT`` call."},{"line_number":122,"context_line":"    def add_tags(self, session, tags, append\u003dFalse):"},{"line_number":123,"context_line":"        \"\"\"Create the tags on the resource"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        :param session: The session to use for making this request."},{"line_number":126,"context_line":"        :param bool append: If set to true it adds new tags to existing"},{"line_number":127,"context_line":"            else overwrites the existing tags with new ones."},{"line_number":128,"context_line":"        :param tags: List with tags to be set on the resource"},{"line_number":129,"context_line":"        \"\"\""},{"line_number":130,"context_line":"        tags \u003d tags or []"},{"line_number":131,"context_line":"        url \u003d utils.urljoin(self.base_path, self.id, \u0027tags\u0027)"},{"line_number":132,"context_line":"        session \u003d self._get_session(session)"}],"source_content_type":"text/x-python","patch_set":15,"id":"b3008d25_d89b456a","line":129,"range":{"start_line":121,"start_character":68,"end_line":129,"end_character":11},"in_reply_to":"961aaf06_bd48b75c","updated":"2025-08-15 13:47:00.000000000","message":"Done","commit_id":"ca45c31791bdc85083d7b27e86110ca5197ee430"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6844387a2d9933ff957c3f2bcdc319728bd1e0b9","unresolved":true,"context_lines":[{"line_number":145,"context_line":"        return self"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    # method for updating a single metadef tag"},{"line_number":148,"context_line":"    def set_tag(self, session, tag, **attrs):"},{"line_number":149,"context_line":"        \"\"\"Update tag on the resource."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":15,"id":"06dadbb4_58936133","line":148,"updated":"2025-08-07 16:44:58.000000000","message":"```suggestion\n    def set_tag(\n        self, session: resource.AdapterT, tag: str, **attrs: dict[str, Any]\n    ):\n```","commit_id":"ca45c31791bdc85083d7b27e86110ca5197ee430"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2e9ba4cc2d1c19e773d1384545b878d8c7d41830","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        return self"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    # method for updating a single metadef tag"},{"line_number":148,"context_line":"    def set_tag(self, session, tag, **attrs):"},{"line_number":149,"context_line":"        \"\"\"Update tag on the resource."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        :param session: The session to use for making this request."}],"source_content_type":"text/x-python","patch_set":15,"id":"8073eb4f_3d461e07","line":148,"in_reply_to":"06dadbb4_58936133","updated":"2025-08-15 13:47:00.000000000","message":"Done","commit_id":"ca45c31791bdc85083d7b27e86110ca5197ee430"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6844387a2d9933ff957c3f2bcdc319728bd1e0b9","unresolved":true,"context_lines":[{"line_number":144,"context_line":"        self.fetch_tags(session)"},{"line_number":145,"context_line":"        return self"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    # method for updating a single metadef tag"},{"line_number":148,"context_line":"    def set_tag(self, session, tag, **attrs):"},{"line_number":149,"context_line":"        \"\"\"Update tag on the resource."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        :param session: The session to use for making this request."},{"line_number":152,"context_line":"        :param tag: tag to be updated."},{"line_number":153,"context_line":"        :param dict attrs: Keyword arguments which will be used to update tag"},{"line_number":154,"context_line":"        \"\"\""},{"line_number":155,"context_line":"        url \u003d utils.urljoin(self.base_path, self.id, \u0027tags\u0027, tag)"},{"line_number":156,"context_line":"        session \u003d self._get_session(session)"},{"line_number":157,"context_line":"        response \u003d session.put(url, data\u003djson.dumps(attrs))"},{"line_number":158,"context_line":"        exceptions.raise_from_response(response)"},{"line_number":159,"context_line":"        self.fetch_tags(session)"},{"line_number":160,"context_line":"        return self"}],"source_content_type":"text/x-python","patch_set":15,"id":"b0c833d9_ce19cdb2","line":160,"range":{"start_line":147,"start_character":4,"end_line":160,"end_character":19},"updated":"2025-08-07 16:44:58.000000000","message":"This looks identical to `add_tag` in `TagMixin`. Can\u0027t we use that?","commit_id":"ca45c31791bdc85083d7b27e86110ca5197ee430"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2e9ba4cc2d1c19e773d1384545b878d8c7d41830","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        self.fetch_tags(session)"},{"line_number":145,"context_line":"        return self"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    # method for updating a single metadef tag"},{"line_number":148,"context_line":"    def set_tag(self, session, tag, **attrs):"},{"line_number":149,"context_line":"        \"\"\"Update tag on the resource."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        :param session: The session to use for making this request."},{"line_number":152,"context_line":"        :param tag: tag to be updated."},{"line_number":153,"context_line":"        :param dict attrs: Keyword arguments which will be used to update tag"},{"line_number":154,"context_line":"        \"\"\""},{"line_number":155,"context_line":"        url \u003d utils.urljoin(self.base_path, self.id, \u0027tags\u0027, tag)"},{"line_number":156,"context_line":"        session \u003d self._get_session(session)"},{"line_number":157,"context_line":"        response \u003d session.put(url, data\u003djson.dumps(attrs))"},{"line_number":158,"context_line":"        exceptions.raise_from_response(response)"},{"line_number":159,"context_line":"        self.fetch_tags(session)"},{"line_number":160,"context_line":"        return self"}],"source_content_type":"text/x-python","patch_set":15,"id":"a2629908_91bbab7a","line":160,"range":{"start_line":147,"start_character":4,"end_line":160,"end_character":19},"in_reply_to":"b0c833d9_ce19cdb2","updated":"2025-08-15 13:47:00.000000000","message":"Done","commit_id":"ca45c31791bdc85083d7b27e86110ca5197ee430"}],"openstack/tests/functional/image/v2/test_metadef_namespace.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4ff25a08bff609e00f5efad73227b5be3e4c4313","unresolved":true,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # add tags without append"},{"line_number":112,"context_line":"        metadef_namespace.add_tags("},{"line_number":113,"context_line":"            self.conn.image, tags\u003d[{\"name\": \"t1\"}, {\"name\": \"t2\"}]"},{"line_number":114,"context_line":"        )"},{"line_number":115,"context_line":"        metadef_namespace.fetch_tags(self.conn.image)"},{"line_number":116,"context_line":"        md_tags \u003d [tag[\u0027name\u0027] for tag in metadef_namespace.tags]"}],"source_content_type":"text/x-python","patch_set":8,"id":"094f2fc2_563ba1f8","line":113,"updated":"2024-01-31 10:29:26.000000000","message":"As noted on the previous file, IMO it would be much easier if we built this body ourselves and asked uses to simply call with a list of tags, e.g.\n\n```\nmetadef_namespace.add_tags(self.conn.image, \"t1\", \"t2\")\n```","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"b274ca19aa007671801c4923bd8f7ead1fab4500","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # add tags without append"},{"line_number":112,"context_line":"        metadef_namespace.add_tags("},{"line_number":113,"context_line":"            self.conn.image, tags\u003d[{\"name\": \"t1\"}, {\"name\": \"t2\"}]"},{"line_number":114,"context_line":"        )"},{"line_number":115,"context_line":"        metadef_namespace.fetch_tags(self.conn.image)"},{"line_number":116,"context_line":"        md_tags \u003d [tag[\u0027name\u0027] for tag in metadef_namespace.tags]"}],"source_content_type":"text/x-python","patch_set":8,"id":"54d4dcb8_580cbed0","line":113,"in_reply_to":"094f2fc2_563ba1f8","updated":"2024-02-01 14:40:12.000000000","message":"Done","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"}],"openstack/tests/unit/image/v2/test_metadef_namespace.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4ff25a08bff609e00f5efad73227b5be3e4c4313","unresolved":true,"context_lines":[{"line_number":88,"context_line":"        sot.add_tag(sess, tag)"},{"line_number":89,"context_line":"        sess.post.assert_called_with("},{"line_number":90,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"},{"line_number":91,"context_line":"        )"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":94,"context_line":"    def test_add_tags(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"37fc9adf_e048224d","line":91,"updated":"2024-01-31 10:29:26.000000000","message":"Can you assert that `sot.tags` has been updated?","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"b274ca19aa007671801c4923bd8f7ead1fab4500","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        sot.add_tag(sess, tag)"},{"line_number":89,"context_line":"        sess.post.assert_called_with("},{"line_number":90,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"},{"line_number":91,"context_line":"        )"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":94,"context_line":"    def test_add_tags(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"df999f40_3469a55e","line":91,"in_reply_to":"37fc9adf_e048224d","updated":"2024-02-01 14:40:12.000000000","message":"Done","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4ff25a08bff609e00f5efad73227b5be3e4c4313","unresolved":true,"context_lines":[{"line_number":101,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags\u0027,"},{"line_number":102,"context_line":"            headers\u003d{},"},{"line_number":103,"context_line":"            data\u003djson.dumps(tags),"},{"line_number":104,"context_line":"        )"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":107,"context_line":"    def test_set_tag(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"d4bf81b8_edd2d3eb","line":104,"updated":"2024-01-31 10:29:26.000000000","message":"Can you assert that `sot.tags` has been updated?","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"b274ca19aa007671801c4923bd8f7ead1fab4500","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags\u0027,"},{"line_number":102,"context_line":"            headers\u003d{},"},{"line_number":103,"context_line":"            data\u003djson.dumps(tags),"},{"line_number":104,"context_line":"        )"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":107,"context_line":"    def test_set_tag(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"559ea188_08a9e717","line":104,"in_reply_to":"d4bf81b8_edd2d3eb","updated":"2024-02-01 14:40:12.000000000","message":"Done","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4ff25a08bff609e00f5efad73227b5be3e4c4313","unresolved":true,"context_lines":[{"line_number":114,"context_line":"        sess.put.assert_called_with("},{"line_number":115,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"},{"line_number":116,"context_line":"            data\u003djson.dumps(data),"},{"line_number":117,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":8,"id":"958b6f18_b5be369b","line":117,"updated":"2024-01-31 10:29:26.000000000","message":"Can you assert that `sot.tags` has been updated?","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"b274ca19aa007671801c4923bd8f7ead1fab4500","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        sess.put.assert_called_with("},{"line_number":115,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"},{"line_number":116,"context_line":"            data\u003djson.dumps(data),"},{"line_number":117,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":8,"id":"4796dfd9_2444e7ed","line":117,"in_reply_to":"958b6f18_b5be369b","updated":"2024-02-01 14:40:12.000000000","message":"Done","commit_id":"2a4e2d91d67475698387b389f67f4bcbb499375e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0b74fad0754cef0efda4993f6fa046e77e3e032d","unresolved":true,"context_lines":[{"line_number":92,"context_line":"        sess.post.assert_called_with("},{"line_number":93,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"},{"line_number":94,"context_line":"        )"},{"line_number":95,"context_line":"        self.assertIn(\"tag1\", [tag[\"name\"] for tag in sot.tags])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":98,"context_line":"    def test_add_tags(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"4752abe5_354a9917","line":95,"range":{"start_line":95,"start_character":13,"end_line":95,"end_character":21},"updated":"2024-02-01 16:27:15.000000000","message":"Could we do `assertEqual` to prove that we haven\u0027t overwritten other already-present tags?","commit_id":"7ccdba206af770ff40b379bb2f4155e3e01ca909"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"b499cd3311a2165294883d0020b880d43b660d32","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        sess.post.assert_called_with("},{"line_number":93,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"},{"line_number":94,"context_line":"        )"},{"line_number":95,"context_line":"        self.assertIn(\"tag1\", [tag[\"name\"] for tag in sot.tags])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":98,"context_line":"    def test_add_tags(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"494982ab_0640e6d5","line":95,"range":{"start_line":95,"start_character":13,"end_line":95,"end_character":21},"in_reply_to":"4752abe5_354a9917","updated":"2024-02-02 05:14:07.000000000","message":"Done","commit_id":"7ccdba206af770ff40b379bb2f4155e3e01ca909"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0b74fad0754cef0efda4993f6fa046e77e3e032d","unresolved":true,"context_lines":[{"line_number":130,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"},{"line_number":131,"context_line":"            data\u003djson.dumps(data),"},{"line_number":132,"context_line":"        )"},{"line_number":133,"context_line":"        self.assertIn(\"t1\", [tag[\"name\"] for tag in sot.tags])"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fc38849_335ed225","line":133,"range":{"start_line":133,"start_character":13,"end_line":133,"end_character":21},"updated":"2024-02-01 16:27:15.000000000","message":"this should be `assertEqual`, since we overwrote stuff?","commit_id":"7ccdba206af770ff40b379bb2f4155e3e01ca909"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"b499cd3311a2165294883d0020b880d43b660d32","unresolved":false,"context_lines":[{"line_number":130,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"},{"line_number":131,"context_line":"            data\u003djson.dumps(data),"},{"line_number":132,"context_line":"        )"},{"line_number":133,"context_line":"        self.assertIn(\"t1\", [tag[\"name\"] for tag in sot.tags])"}],"source_content_type":"text/x-python","patch_set":9,"id":"9e022a2d_0a32df52","line":133,"range":{"start_line":133,"start_character":13,"end_line":133,"end_character":21},"in_reply_to":"9fc38849_335ed225","updated":"2024-02-02 05:14:07.000000000","message":"Done","commit_id":"7ccdba206af770ff40b379bb2f4155e3e01ca909"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d20c437fc7e5540ad5415691d8a1ab1c821bce3d","unresolved":true,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":83,"context_line":"    def test_add_tag(self):"},{"line_number":84,"context_line":"        sot \u003d metadef_namespace.MetadefNamespace(**EXAMPLE)"},{"line_number":85,"context_line":"        tag \u003d \"tag1\""},{"line_number":86,"context_line":"        response \u003d mock.Mock()"},{"line_number":87,"context_line":"        response.body \u003d {\"name\": tag}"}],"source_content_type":"text/x-python","patch_set":10,"id":"828a0701_79cb2f41","line":84,"updated":"2024-02-02 11:36:12.000000000","message":"What happens if this initial namespace has tags defined? Do those tags appear in your `assertEqual` below alongside the new tag? I\u0027d expect this to work like:\n\n```\n\u003e\u003e\u003e sot \u003d metadef_namespace.MetadefNamespace(**EXAMPLE, tags\u003d[\"tag1\", \"tag2\"])\n\u003e\u003e\u003e sot.add_tag(\"tag3\")\n\u003e\u003e\u003e sot.tags\n[\"tag1\", \"tag2\", \"tag3\"]\n```\n\nDoes it?","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"85650f325548e48c1ba870c9117006c8ed7e7bef","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":83,"context_line":"    def test_add_tag(self):"},{"line_number":84,"context_line":"        sot \u003d metadef_namespace.MetadefNamespace(**EXAMPLE)"},{"line_number":85,"context_line":"        tag \u003d \"tag1\""},{"line_number":86,"context_line":"        response \u003d mock.Mock()"},{"line_number":87,"context_line":"        response.body \u003d {\"name\": tag}"}],"source_content_type":"text/x-python","patch_set":10,"id":"c8477317_c3f14ac2","line":84,"in_reply_to":"828a0701_79cb2f41","updated":"2024-02-09 19:53:44.000000000","message":"Done","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d20c437fc7e5540ad5415691d8a1ab1c821bce3d","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        response.body \u003d {\"name\": tag}"},{"line_number":88,"context_line":"        response.json \u003d mock.Mock(return_value\u003dresponse.body)"},{"line_number":89,"context_line":"        sess \u003d mock.Mock(spec\u003dadapter.Adapter)"},{"line_number":90,"context_line":"        sess.post \u003d mock.Mock(return_value\u003dresponse)"},{"line_number":91,"context_line":"        sot.add_tag(sess, tag)"},{"line_number":92,"context_line":"        sess.post.assert_called_with("},{"line_number":93,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"}],"source_content_type":"text/x-python","patch_set":10,"id":"60b37e47_f88bd905","line":90,"updated":"2024-02-02 11:36:12.000000000","message":"nit: You should be able to just do:\n\n```\nsess.post.return_value \u003d response\n```\n\nsince the `spec` argument will have created a mock `post` method for you by inspecting `Adapter` methods.\n\nDitto for below.","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"85650f325548e48c1ba870c9117006c8ed7e7bef","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        response.body \u003d {\"name\": tag}"},{"line_number":88,"context_line":"        response.json \u003d mock.Mock(return_value\u003dresponse.body)"},{"line_number":89,"context_line":"        sess \u003d mock.Mock(spec\u003dadapter.Adapter)"},{"line_number":90,"context_line":"        sess.post \u003d mock.Mock(return_value\u003dresponse)"},{"line_number":91,"context_line":"        sot.add_tag(sess, tag)"},{"line_number":92,"context_line":"        sess.post.assert_called_with("},{"line_number":93,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"}],"source_content_type":"text/x-python","patch_set":10,"id":"63cbcfc3_d44d3227","line":90,"in_reply_to":"60b37e47_f88bd905","updated":"2024-02-09 19:53:44.000000000","message":"Done","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d20c437fc7e5540ad5415691d8a1ab1c821bce3d","unresolved":true,"context_lines":[{"line_number":92,"context_line":"        sess.post.assert_called_with("},{"line_number":93,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"},{"line_number":94,"context_line":"        )"},{"line_number":95,"context_line":"        self.assertEqual([\"tag1\"], [tag[\"name\"] for tag in sot.tags])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":98,"context_line":"    def test_add_tags(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"a9a5cac3_36a485b4","line":95,"range":{"start_line":95,"start_character":35,"end_line":95,"end_character":68},"updated":"2024-02-02 11:36:12.000000000","message":"Remember that we\u0027re simplifying here so this should be a list of strings, not a list of objects. I suspect you need to change something in `add_tag`?","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"85650f325548e48c1ba870c9117006c8ed7e7bef","unresolved":true,"context_lines":[{"line_number":92,"context_line":"        sess.post.assert_called_with("},{"line_number":93,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"},{"line_number":94,"context_line":"        )"},{"line_number":95,"context_line":"        self.assertEqual([\"tag1\"], [tag[\"name\"] for tag in sot.tags])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":98,"context_line":"    def test_add_tags(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"dfa12bf4_847664c2","line":95,"range":{"start_line":95,"start_character":35,"end_line":95,"end_character":68},"in_reply_to":"a9a5cac3_36a485b4","updated":"2024-02-09 19:53:44.000000000","message":"The format returned on fetching the tags is list of dicts\n`[{\u0027name\u0027: \u0027tag4\u0027}, {\u0027name\u0027: \u0027tag3\u0027}, {\u0027name\u0027: \u0027tag2\u0027}, {\u0027name\u0027: \u0027tag1\u0027}]` \nOn doing fetch_tags also we get same output, this would require changes in the pre-existing methods aswell.","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2dd876146b18c47ffa49a5ac4ed96543978eab26","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        sess.post.assert_called_with("},{"line_number":93,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"},{"line_number":94,"context_line":"        )"},{"line_number":95,"context_line":"        self.assertEqual([\"tag1\"], [tag[\"name\"] for tag in sot.tags])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":98,"context_line":"    def test_add_tags(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"52372332_45ffaf65","line":95,"range":{"start_line":95,"start_character":35,"end_line":95,"end_character":68},"in_reply_to":"dfa12bf4_847664c2","updated":"2025-04-08 11:20:45.000000000","message":"Done","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d20c437fc7e5540ad5415691d8a1ab1c821bce3d","unresolved":true,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":98,"context_line":"    def test_add_tags(self):"},{"line_number":99,"context_line":"        sot \u003d metadef_namespace.MetadefNamespace(**EXAMPLE)"},{"line_number":100,"context_line":"        tags \u003d [\"t1\", \"t2\"]"},{"line_number":101,"context_line":"        response \u003d mock.Mock()"},{"line_number":102,"context_line":"        response.body \u003d [{\"name\": \"t1\"}, {\"name\": \"t2\"}]"}],"source_content_type":"text/x-python","patch_set":10,"id":"2b8354e3_2936af40","line":99,"updated":"2024-02-02 11:36:12.000000000","message":"What happens if this initial namespace has tags defined? Do those tags appear in your `assertEqual` below alongside the new tag? I\u0027d expect this to work like:\n\n```\n\u003e\u003e\u003e sot \u003d metadef_namespace.MetadefNamespace(**EXAMPLE, tags\u003d[\"tag1\", \"tag2\"])\n\u003e\u003e\u003e sot.add_tags(\"tag3\", \"tag4\")\n\u003e\u003e\u003e sot.tags\n[\"tag1\", \"tag2\", \"tag3\", \"tag4\"]\n```\n\nDoes it? Obviously if `append\u003dTrue`, then `sot.tags` should only show `[\"tag3\", \"tag4\"]`.","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"85650f325548e48c1ba870c9117006c8ed7e7bef","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":98,"context_line":"    def test_add_tags(self):"},{"line_number":99,"context_line":"        sot \u003d metadef_namespace.MetadefNamespace(**EXAMPLE)"},{"line_number":100,"context_line":"        tags \u003d [\"t1\", \"t2\"]"},{"line_number":101,"context_line":"        response \u003d mock.Mock()"},{"line_number":102,"context_line":"        response.body \u003d [{\"name\": \"t1\"}, {\"name\": \"t2\"}]"}],"source_content_type":"text/x-python","patch_set":10,"id":"c92dd41f_c30c2841","line":99,"in_reply_to":"2b8354e3_2936af40","updated":"2024-02-09 19:53:44.000000000","message":"Done","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d20c437fc7e5540ad5415691d8a1ab1c821bce3d","unresolved":true,"context_lines":[{"line_number":113,"context_line":"            headers\u003d{},"},{"line_number":114,"context_line":"            data\u003djson.dumps({\"tags\": [{\"name\": \"t1\"}, {\"name\": \"t2\"}]}),"},{"line_number":115,"context_line":"        )"},{"line_number":116,"context_line":"        self.assertEqual(tags, [tag[\"name\"] for tag in sot.tags])"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":119,"context_line":"    def test_set_tag(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"05908ca7_01ce89e8","line":116,"range":{"start_line":116,"start_character":31,"end_line":116,"end_character":64},"updated":"2024-02-02 11:36:12.000000000","message":"As above, this should be a list of strings, not a list of objects.","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"85650f325548e48c1ba870c9117006c8ed7e7bef","unresolved":true,"context_lines":[{"line_number":113,"context_line":"            headers\u003d{},"},{"line_number":114,"context_line":"            data\u003djson.dumps({\"tags\": [{\"name\": \"t1\"}, {\"name\": \"t2\"}]}),"},{"line_number":115,"context_line":"        )"},{"line_number":116,"context_line":"        self.assertEqual(tags, [tag[\"name\"] for tag in sot.tags])"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":119,"context_line":"    def test_set_tag(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"b063e59d_b4b60c5e","line":116,"range":{"start_line":116,"start_character":31,"end_line":116,"end_character":64},"in_reply_to":"05908ca7_01ce89e8","updated":"2024-02-09 19:53:44.000000000","message":"ditto","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2dd876146b18c47ffa49a5ac4ed96543978eab26","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            headers\u003d{},"},{"line_number":114,"context_line":"            data\u003djson.dumps({\"tags\": [{\"name\": \"t1\"}, {\"name\": \"t2\"}]}),"},{"line_number":115,"context_line":"        )"},{"line_number":116,"context_line":"        self.assertEqual(tags, [tag[\"name\"] for tag in sot.tags])"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":119,"context_line":"    def test_set_tag(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"2ef05468_546243b1","line":116,"range":{"start_line":116,"start_character":31,"end_line":116,"end_character":64},"in_reply_to":"b063e59d_b4b60c5e","updated":"2025-04-08 11:20:45.000000000","message":"Done","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d20c437fc7e5540ad5415691d8a1ab1c821bce3d","unresolved":true,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":119,"context_line":"    def test_set_tag(self):"},{"line_number":120,"context_line":"        sot \u003d metadef_namespace.MetadefNamespace(**EXAMPLE)"},{"line_number":121,"context_line":"        tag \u003d \"tag1\""},{"line_number":122,"context_line":"        data \u003d {\"name\": \"t1\"}"},{"line_number":123,"context_line":"        response \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":10,"id":"276d2a6a_22e9716f","line":120,"updated":"2024-02-02 11:36:12.000000000","message":"Are we sure that any existing tags on the namespace are overwritten if we call `set_tag`?","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"85650f325548e48c1ba870c9117006c8ed7e7bef","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    @mock.patch.object(exceptions, \u0027raise_from_response\u0027, mock.Mock())"},{"line_number":119,"context_line":"    def test_set_tag(self):"},{"line_number":120,"context_line":"        sot \u003d metadef_namespace.MetadefNamespace(**EXAMPLE)"},{"line_number":121,"context_line":"        tag \u003d \"tag1\""},{"line_number":122,"context_line":"        data \u003d {\"name\": \"t1\"}"},{"line_number":123,"context_line":"        response \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff79a461_04277023","line":120,"in_reply_to":"276d2a6a_22e9716f","updated":"2024-02-09 19:53:44.000000000","message":"Done","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d20c437fc7e5540ad5415691d8a1ab1c821bce3d","unresolved":true,"context_lines":[{"line_number":130,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"},{"line_number":131,"context_line":"            data\u003djson.dumps(data),"},{"line_number":132,"context_line":"        )"},{"line_number":133,"context_line":"        self.assertEqual([\"t1\"], [tag[\"name\"] for tag in sot.tags])"}],"source_content_type":"text/x-python","patch_set":10,"id":"80f454af_381a721d","line":133,"range":{"start_line":133,"start_character":33,"end_line":133,"end_character":67},"updated":"2024-02-02 11:36:12.000000000","message":"ditto: strings not objects","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2dd876146b18c47ffa49a5ac4ed96543978eab26","unresolved":false,"context_lines":[{"line_number":130,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"},{"line_number":131,"context_line":"            data\u003djson.dumps(data),"},{"line_number":132,"context_line":"        )"},{"line_number":133,"context_line":"        self.assertEqual([\"t1\"], [tag[\"name\"] for tag in sot.tags])"}],"source_content_type":"text/x-python","patch_set":10,"id":"616abf61_741af575","line":133,"range":{"start_line":133,"start_character":33,"end_line":133,"end_character":67},"in_reply_to":"52cc4de5_14b83212","updated":"2025-04-08 11:20:45.000000000","message":"Done","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"},{"author":{"_account_id":33765,"name":"Mridula Joshi","email":"mrjoshi@redhat.com","username":"mrjoshi"},"change_message_id":"85650f325548e48c1ba870c9117006c8ed7e7bef","unresolved":true,"context_lines":[{"line_number":130,"context_line":"            \u0027metadefs/namespaces/OS::Cinder::Volumetype/tags/%s\u0027 % tag,"},{"line_number":131,"context_line":"            data\u003djson.dumps(data),"},{"line_number":132,"context_line":"        )"},{"line_number":133,"context_line":"        self.assertEqual([\"t1\"], [tag[\"name\"] for tag in sot.tags])"}],"source_content_type":"text/x-python","patch_set":10,"id":"52cc4de5_14b83212","line":133,"range":{"start_line":133,"start_character":33,"end_line":133,"end_character":67},"in_reply_to":"80f454af_381a721d","updated":"2024-02-09 19:53:44.000000000","message":"ditto","commit_id":"3225b19158f6568e2383188ebc98cb138c18dcf9"}]}
