)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1f8d92ecad62653fd5dfb063fa3ee65c8825a8e5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"fc0f4103_4ce882b3","updated":"2023-10-04 15:44:50.000000000","message":"I think you still have to address my comments from patcheset 1?","commit_id":"1879ce1e5afb955fe08673ea77a95be817e93c5d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"abe3028d75b72a43885b218ef12eb865a4491d72","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"45b74528_9804bdd7","updated":"2023-10-04 16:53:03.000000000","message":"We discussed this today, but it looks like you reverted back to an old patchset by mistake with patchset 9. You can recover the old patchset using the following:\n\n```\ngit review -d \u003cchange-id\u003e,\u003cpatchset-num\u003e\n```\n\nor in this case:\n\n```\ngit review -d 885375,8\n```\n\nIn general, I would advise keeping nothing locally unless it\u0027s super WIP. When you have something ready, push it up with `git review -f`. The `-f` flag will delete the local branch. When you need to respin it, simply download from Gerrit, modify and resubmit (again, with `-f`)","commit_id":"1879ce1e5afb955fe08673ea77a95be817e93c5d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"834754be5ea1763d5c3d89984b833a6dee67152e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"69cc71ae_f0806c7e","in_reply_to":"45b74528_9804bdd7","updated":"2023-10-04 16:53:48.000000000","message":"Also, please mark comments that have been resolved as such but clicking the `Ack` button, the `Done` button, or entering your own reply and ticking the `Resolved` checkbox.","commit_id":"1879ce1e5afb955fe08673ea77a95be817e93c5d"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"b10af3354377809abbef696a26551b4f5838ea58","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"e75dee48_b8aabafd","updated":"2023-10-10 17:58:22.000000000","message":"I just noticed I had in fact marked comments as resolved, but they remained as drafts. Hoping this is the correct method of publishing them.","commit_id":"a43769079d66947c3489e0bf0a59528bde15ea36"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7df42b0d85b32f8de24880c9af9f8d8b487c95e3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"1e5a2b5b_8e430601","updated":"2023-10-19 15:06:33.000000000","message":"This is looking very good. Just a few small nits left now.","commit_id":"a43769079d66947c3489e0bf0a59528bde15ea36"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"6bc0773549c5ee56134e51befe952273ec95ec54","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"75a5edfb_bca9134b","updated":"2024-01-10 17:59:16.000000000","message":"Still working on some fixes from Stephen\u0027s comments, but wanted to fix the merge conflict before working on anything else.","commit_id":"592dbed1f820b28eb813ee602f6e8c4a2ba439ec"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3776fab15d1c3921e56e0c3ac18c59e7a8667977","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"c10a60c5_5c7460b0","updated":"2024-01-19 12:51:07.000000000","message":"Could we also get the decoder doc updated by adding these aliases to `doc/source/cli/data/glance.csv`?","commit_id":"311d146911099dd36ce70b5bde787d74dd6b90ce"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"d2275947dd19ce9334e99af0b9da414486604690","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"7f0a29f0_3e1aac29","updated":"2024-01-10 18:32:36.000000000","message":"Ready for review now.","commit_id":"311d146911099dd36ce70b5bde787d74dd6b90ce"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1bfe6fda6a2db8ae11ffbd503bb4ed79662bcbbc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"84414378_a162bce5","updated":"2024-01-19 12:49:15.000000000","message":"Tested this. It looks like it\u0027s working pretty well. There are a couple of nits inline but they should be easily fixed. Notes from testing below.\n\n\nBefore beginning, I created a custom namespace:\n\n```\n❯ openstack image metadef namespace create --display-name \u0027Foo\u0027 --description \u0027Test metadef namespace\u0027 --public foo\n```\nhttps://pypi.org/project/clouds2env/\nHere\u0027s the output from OSC with this change applied:\n\n```\n# create\n\n❯ openstack image metadef resource type association create foo OS::Nova::Flavor\n+-------------------+----------------------+\n| Field             | Value                |\n+-------------------+----------------------+\n| created_at        | 2024-01-19T12:36:20Z |\n| id                | OS::Nova::Flavor     |\n| name              | OS::Nova::Flavor     |\n| prefix            | None                 |\n| properties_target | None                 |\n| updated_at        | 2024-01-19T12:36:20Z |\n+-------------------+----------------------+\n\n# list (to confirm creation)\n\n❯ openstack image metadef resource type association list foo\n+------------------+\n| Name             |\n+------------------+\n| OS::Nova::Flavor |\n+------------------+\n\n# delete\n\n❯ openstack image metadef resource type association delete foo OS::Nova::Flavor\n\n# list (to confirm deletion)\n\n❯ openstack image metadef resource type association list foo\n```\n\nHere\u0027s the equivalent output from glanceclient, to confirm changes:\n\n```\n# create\n\n❯ glance md-resource-type-associate --name OS::Nova::Flavor foo\n+------------+----------------------+\n| Property   | Value                |\n+------------+----------------------+\n| created_at | 2024-01-19T12:43:03Z |\n| name       | OS::Nova::Flavor     |\n| updated_at | 2024-01-19T12:43:03Z |\n+------------+----------------------+\n\n# list (to confirm creation)\n\n❯ glance md-namespace-resource-type-list foo\n+------------------+--------+-------------------+\n| name             | prefix | properties_target |\n+------------------+--------+-------------------+\n| OS::Nova::Flavor |        |                   |\n+------------------+--------+-------------------+\n\n# delete\n\n❯ glance md-resource-type-deassociate foo OS::Nova::Flavor\n\n# list (to confirm deletion)\n\n❯ glance md-namespace-resource-type-list foo\n+------+--------+-------------------+\n| name | prefix | properties_target |\n+------+--------+-------------------+\n+------+--------+-------------------+\n```\n\nOnce done, I cleaned up the custom namespace:\n\n```\n❯ openstack image metadef namespace delete foo\n```\n\nHint: I used [`clouds2env`](https://pypi.org/project/clouds2env/) to generate the environment variables needed for glanceclient.","commit_id":"311d146911099dd36ce70b5bde787d74dd6b90ce"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e728e74dd9297a12e7a1d9370b1eed6eb729898","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"ea12707f_f6003190","updated":"2024-01-26 14:06:48.000000000","message":"Two remaining issues. So close!","commit_id":"1b43f25819937dbc7ae3ac45c24c2cb8bca1a282"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5b58f53d5f942ac809847a9f3f4b7e4f9207e741","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"1c805eb5_ba5cce88","updated":"2024-01-29 17:49:30.000000000","message":"A few new issues, I\u0027m afraid. Sorry 😅","commit_id":"bdaf81b86473570551e872018b754a1e6cf840ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"17254ecbde77af8471005fa853a6a947228103ce","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"03a57a7c_7a2a202d","updated":"2024-04-15 11:43:45.000000000","message":"Fixed the docs typo. gtema was +2 so carrying that forward. Nice work here. Great to finally get it merged 😊","commit_id":"276dbb6f5630cf96f260c8e347e85293b86a876f"}],"doc/source/cli/data/glance.csv":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a6c53612816883d755cc56f504b95461f3725032","unresolved":true,"context_lines":[{"line_number":45,"context_line":"md-property-update,image metadef property set,Update metadata definitions property inside a namespace."},{"line_number":46,"context_line":"md-resource-type-associate,image metadef resource type association create,Associate resource type with a metadata definitions namespace."},{"line_number":47,"context_line":"md-resource-type-deassociate,image metadef resource type association delete,Deassociate resource type with a metadata definitions namespace."},{"line_number":48,"context_line":"md-namespace-resource-type-list,image metadef resource type list,List available resource type names."},{"line_number":49,"context_line":"md-tag-create,,Add a new metadata definitions tag inside a namespace."},{"line_number":50,"context_line":"md-tag-create-multiple,,Create new metadata definitions tags inside a namespace."},{"line_number":51,"context_line":"md-tag-delete,,Delete a specific metadata definitions tag inside a namespace."}],"source_content_type":"application/octet-stream","patch_set":15,"id":"36b6dab2_bd7dc25d","line":48,"range":{"start_line":48,"start_character":3,"end_line":48,"end_character":13},"updated":"2024-04-15 11:41:42.000000000","message":"I don\u0027t think you meant to add this? `md-namespace-resource-type-list` is already covered above on line 31.","commit_id":"bb47ad440b13a64c9d802948fc3325c47ad63718"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5dfb9d1871164e019d1df510ccdf4622eb79c9f8","unresolved":false,"context_lines":[{"line_number":45,"context_line":"md-property-update,image metadef property set,Update metadata definitions property inside a namespace."},{"line_number":46,"context_line":"md-resource-type-associate,image metadef resource type association create,Associate resource type with a metadata definitions namespace."},{"line_number":47,"context_line":"md-resource-type-deassociate,image metadef resource type association delete,Deassociate resource type with a metadata definitions namespace."},{"line_number":48,"context_line":"md-namespace-resource-type-list,image metadef resource type list,List available resource type names."},{"line_number":49,"context_line":"md-tag-create,,Add a new metadata definitions tag inside a namespace."},{"line_number":50,"context_line":"md-tag-create-multiple,,Create new metadata definitions tags inside a namespace."},{"line_number":51,"context_line":"md-tag-delete,,Delete a specific metadata definitions tag inside a namespace."}],"source_content_type":"application/octet-stream","patch_set":15,"id":"4cb12cf8_8f2ec8f3","line":48,"range":{"start_line":48,"start_character":3,"end_line":48,"end_character":13},"in_reply_to":"36b6dab2_bd7dc25d","updated":"2024-04-15 11:43:14.000000000","message":"Done","commit_id":"bb47ad440b13a64c9d802948fc3325c47ad63718"}],"openstackclient/image/v2/metadef_resource_type_association.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13f056cce7ab53fc3d329939ac95633aa0f78921","unresolved":true,"context_lines":[{"line_number":1,"context_line":"#   Copyright 2013 Nebula Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#   Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#   not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"6636e243_a791e84a","line":1,"updated":"2023-06-07 17:41:15.000000000","message":"Again, this is a new file. You can add this line with your own name or the name of your university if you\u0027d like attribution, but otherwise you should drop it.","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"b10af3354377809abbef696a26551b4f5838ea58","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#   Copyright 2013 Nebula Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#   Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#   not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"2254172f_c2c1df4a","line":1,"in_reply_to":"6636e243_a791e84a","updated":"2023-10-10 17:58:22.000000000","message":"Done","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13f056cce7ab53fc3d329939ac95633aa0f78921","unresolved":true,"context_lines":[{"line_number":32,"context_line":"        parser.add_argument("},{"line_number":33,"context_line":"            \"metadef_namespace\","},{"line_number":34,"context_line":"            metavar\u003d\"\u003cmetadef_namespace\u003e\","},{"line_number":35,"context_line":"            help\u003d_(\"The name of the namespace whose details you want to see\"),"},{"line_number":36,"context_line":"        )"},{"line_number":37,"context_line":"        parser.add_argument("},{"line_number":38,"context_line":"            \"name\","}],"source_content_type":"text/x-python","patch_set":1,"id":"9aac5e92_f0affccb","line":35,"updated":"2023-06-07 17:41:15.000000000","message":"We don\u0027t want to see the namespace, we want to create the resource type assocaition inside the namespace.","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"b10af3354377809abbef696a26551b4f5838ea58","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        parser.add_argument("},{"line_number":33,"context_line":"            \"metadef_namespace\","},{"line_number":34,"context_line":"            metavar\u003d\"\u003cmetadef_namespace\u003e\","},{"line_number":35,"context_line":"            help\u003d_(\"The name of the namespace whose details you want to see\"),"},{"line_number":36,"context_line":"        )"},{"line_number":37,"context_line":"        parser.add_argument("},{"line_number":38,"context_line":"            \"name\","}],"source_content_type":"text/x-python","patch_set":1,"id":"82311eaf_3b05a8a5","line":35,"in_reply_to":"9aac5e92_f0affccb","updated":"2023-10-10 17:58:22.000000000","message":"Done","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13f056cce7ab53fc3d329939ac95633aa0f78921","unresolved":true,"context_lines":[{"line_number":42,"context_line":"        parser.add_argument("},{"line_number":43,"context_line":"            \"--properties-target\","},{"line_number":44,"context_line":"            metavar\u003d\"\u003cproperties_target\u003e\","},{"line_number":45,"context_line":"            help\u003d_(\"A target of the namespace\"),"},{"line_number":46,"context_line":"        )"},{"line_number":47,"context_line":"        return parser"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"70582c62_571a9719","line":45,"updated":"2023-06-07 17:41:15.000000000","message":"This could provide a little more information. Maybe you could look at what the equivalent glanceclient command is saying (hint: it\u0027s `glance md-resource-type-associate` and you can view the help using `glance help md-resource-type-associate`) (hint: you can install glanceclient like so: `pipx install python-glanceclient`)","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"b10af3354377809abbef696a26551b4f5838ea58","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        parser.add_argument("},{"line_number":43,"context_line":"            \"--properties-target\","},{"line_number":44,"context_line":"            metavar\u003d\"\u003cproperties_target\u003e\","},{"line_number":45,"context_line":"            help\u003d_(\"A target of the namespace\"),"},{"line_number":46,"context_line":"        )"},{"line_number":47,"context_line":"        return parser"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"d3b86b2d_9f6cac49","line":45,"in_reply_to":"70582c62_571a9719","updated":"2023-10-10 17:58:22.000000000","message":"Done","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13f056cce7ab53fc3d329939ac95633aa0f78921","unresolved":true,"context_lines":[{"line_number":54,"context_line":"        for key in filter_keys:"},{"line_number":55,"context_line":"            argument \u003d getattr(parsed_args, key, None)"},{"line_number":56,"context_line":"            if argument is not None:"},{"line_number":57,"context_line":"                kwargs[key] \u003d argument"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        data \u003d image_client.create_metadef_resource_type_association(**kwargs)"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"e6ba95b8_e48b14b3","line":57,"updated":"2023-06-07 17:41:15.000000000","message":"Try to avoid using `getattr` unless you need to. It makes code harder to grasp. Also, you\u0027ve used `if` for all three parameters but two of them are mandatory. Do you really need the `if`?","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"b10af3354377809abbef696a26551b4f5838ea58","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        for key in filter_keys:"},{"line_number":55,"context_line":"            argument \u003d getattr(parsed_args, key, None)"},{"line_number":56,"context_line":"            if argument is not None:"},{"line_number":57,"context_line":"                kwargs[key] \u003d argument"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        data \u003d image_client.create_metadef_resource_type_association(**kwargs)"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"26087c79_70383053","line":57,"in_reply_to":"e6ba95b8_e48b14b3","updated":"2023-10-10 17:58:22.000000000","message":"Done","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13f056cce7ab53fc3d329939ac95633aa0f78921","unresolved":true,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        data \u003d image_client.create_metadef_resource_type_association(**kwargs)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        return zip(*sorted(data.items()))"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class DeleteMetadefResourceTypeAssociation(command.Command):"}],"source_content_type":"text/x-python","patch_set":1,"id":"87e295fb_4396c15c","line":61,"updated":"2023-06-07 17:41:15.000000000","message":"This works but all that it does is dumps everything that was returned by SDK back to the user, including things we don\u0027t want to show like `location`. Instead of doing this, perhaps you could use `get_osc_show_columns_for_sdk_resource` and `utils.get_item_properties` from `osc_lib.utils`? You used the latter in the previous change. You can avoid the former by manually specifying a list of columns but it\u0027s a bit cleverer in that it avoids you needing to keep the list of columns up-to-date.","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"b10af3354377809abbef696a26551b4f5838ea58","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        data \u003d image_client.create_metadef_resource_type_association(**kwargs)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        return zip(*sorted(data.items()))"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class DeleteMetadefResourceTypeAssociation(command.Command):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a8efc91_6f8f76c4","line":61,"in_reply_to":"87e295fb_4396c15c","updated":"2023-10-10 17:58:22.000000000","message":"Done","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13f056cce7ab53fc3d329939ac95633aa0f78921","unresolved":true,"context_lines":[{"line_number":88,"context_line":"            \u0027name\u0027,"},{"line_number":89,"context_line":"        }"},{"line_number":90,"context_line":"        for attr in copy_attrs:"},{"line_number":91,"context_line":"            val \u003d getattr(parsed_args, attr, None)"},{"line_number":92,"context_line":"            if val is not None:"},{"line_number":93,"context_line":"                kwargs[attr] \u003d val"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a8d872c_02e42a89","line":91,"updated":"2023-06-07 17:41:15.000000000","message":"Same comment about not using `getattr`","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"b10af3354377809abbef696a26551b4f5838ea58","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            \u0027name\u0027,"},{"line_number":89,"context_line":"        }"},{"line_number":90,"context_line":"        for attr in copy_attrs:"},{"line_number":91,"context_line":"            val \u003d getattr(parsed_args, attr, None)"},{"line_number":92,"context_line":"            if val is not None:"},{"line_number":93,"context_line":"                kwargs[attr] \u003d val"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"d622de7c_151e2e78","line":91,"in_reply_to":"5a8d872c_02e42a89","updated":"2023-10-10 17:58:22.000000000","message":"Done","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13f056cce7ab53fc3d329939ac95633aa0f78921","unresolved":true,"context_lines":[{"line_number":93,"context_line":"                kwargs[attr] \u003d val"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        result \u003d 0"},{"line_number":96,"context_line":"        for i in parsed_args.name:"},{"line_number":97,"context_line":"            try:"},{"line_number":98,"context_line":"                resource_type \u003d image_client.metadef_resource_type_associations(**kwargs)  # noqa: E501"},{"line_number":99,"context_line":"                print(resource_type)"}],"source_content_type":"text/x-python","patch_set":1,"id":"db2c8e5b_442b2c7c","line":96,"updated":"2023-06-07 17:41:15.000000000","message":"nit: `i` is usually used for counters (read: a numerical value). Could you come up with a better name for this loop variable?","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"b10af3354377809abbef696a26551b4f5838ea58","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                kwargs[attr] \u003d val"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        result \u003d 0"},{"line_number":96,"context_line":"        for i in parsed_args.name:"},{"line_number":97,"context_line":"            try:"},{"line_number":98,"context_line":"                resource_type \u003d image_client.metadef_resource_type_associations(**kwargs)  # noqa: E501"},{"line_number":99,"context_line":"                print(resource_type)"}],"source_content_type":"text/x-python","patch_set":1,"id":"dd299c9d_c8bb0d6e","line":96,"in_reply_to":"db2c8e5b_442b2c7c","updated":"2023-10-10 17:58:22.000000000","message":"Done","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13f056cce7ab53fc3d329939ac95633aa0f78921","unresolved":true,"context_lines":[{"line_number":95,"context_line":"        result \u003d 0"},{"line_number":96,"context_line":"        for i in parsed_args.name:"},{"line_number":97,"context_line":"            try:"},{"line_number":98,"context_line":"                resource_type \u003d image_client.metadef_resource_type_associations(**kwargs)  # noqa: E501"},{"line_number":99,"context_line":"                print(resource_type)"},{"line_number":100,"context_line":"                print(list(resource_type))"},{"line_number":101,"context_line":"                image_client.delete_metadef_resource_type_association("}],"source_content_type":"text/x-python","patch_set":1,"id":"9aaa7ade_2005cc75","line":98,"updated":"2023-06-07 17:41:15.000000000","message":"This *lists* resource types, but I think you only want one? If so, you want `get_metadef_resource_type_association`.\n\nHowever, you probably don\u0027t need to do that since `delete_metadef_resource_type_association` accepts an ID. It even says so in the docstring!\n\n```\n\u003e\u003e\u003e import openstack\n\u003e\u003e\u003e conn \u003d openstack.connect()\n\u003e\u003e\u003e help(conn.image.delete_metadef_resource_type_association)\n```\n\nwhich shows.\n\n```\nHelp on method delete_metadef_resource_type_association in module openstack.image.v2._proxy:\n\ndelete_metadef_resource_type_association(metadef_resource_type, metadef_namespace, ignore_missing\u003dTrue) method of openstack.image.v2._proxy.Proxy instance\n    Removes a resource type association in a namespace.\n    \n    :param metadef_resource_type: The value can be either the name of\n        a metadef resource type association or an\n        :class:`~openstack.image.v2.metadef_resource_type.MetadefResourceTypeAssociation`\n        instance.\n    :param metadef_namespace: The value can be either the name of metadef\n        namespace or an\n        :class:`~openstack.image.v2.metadef_namespace.MetadefNamespace`\n        instance\n    :param bool ignore_missing: When set to ``False``,\n        :class:`~openstack.exceptions.ResourceNotFound` will be raised when\n        the metadef resource type association does not exist.\n    :returns: ``None``\n```\n\n(You could get the same info by looking at the source code locally or on GitHub)","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"b10af3354377809abbef696a26551b4f5838ea58","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        result \u003d 0"},{"line_number":96,"context_line":"        for i in parsed_args.name:"},{"line_number":97,"context_line":"            try:"},{"line_number":98,"context_line":"                resource_type \u003d image_client.metadef_resource_type_associations(**kwargs)  # noqa: E501"},{"line_number":99,"context_line":"                print(resource_type)"},{"line_number":100,"context_line":"                print(list(resource_type))"},{"line_number":101,"context_line":"                image_client.delete_metadef_resource_type_association("}],"source_content_type":"text/x-python","patch_set":1,"id":"675b3b10_1539b80a","line":98,"in_reply_to":"9aaa7ade_2005cc75","updated":"2023-10-10 17:58:22.000000000","message":"Done","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13f056cce7ab53fc3d329939ac95633aa0f78921","unresolved":true,"context_lines":[{"line_number":98,"context_line":"                resource_type \u003d image_client.metadef_resource_type_associations(**kwargs)  # noqa: E501"},{"line_number":99,"context_line":"                print(resource_type)"},{"line_number":100,"context_line":"                print(list(resource_type))"},{"line_number":101,"context_line":"                image_client.delete_metadef_resource_type_association("},{"line_number":102,"context_line":"                    resource_type.id"},{"line_number":103,"context_line":"                )"},{"line_number":104,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":1,"id":"448cd2b9_56414a1d","line":101,"updated":"2023-06-07 17:41:15.000000000","message":"If you look a the above, you\u0027ll see this needs *two* arguments: `metadef_resource_type` *and* `metadef_namespace`. You\u0027ve only provided one of these here.","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"b10af3354377809abbef696a26551b4f5838ea58","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                resource_type \u003d image_client.metadef_resource_type_associations(**kwargs)  # noqa: E501"},{"line_number":99,"context_line":"                print(resource_type)"},{"line_number":100,"context_line":"                print(list(resource_type))"},{"line_number":101,"context_line":"                image_client.delete_metadef_resource_type_association("},{"line_number":102,"context_line":"                    resource_type.id"},{"line_number":103,"context_line":"                )"},{"line_number":104,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":1,"id":"02f52510_f3bbf56f","line":101,"in_reply_to":"448cd2b9_56414a1d","updated":"2023-10-10 17:58:22.000000000","message":"Done","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13f056cce7ab53fc3d329939ac95633aa0f78921","unresolved":true,"context_lines":[{"line_number":114,"context_line":"        if result \u003e 0:"},{"line_number":115,"context_line":"            total \u003d len(parsed_args.metadef_namespace)"},{"line_number":116,"context_line":"            msg \u003d _("},{"line_number":117,"context_line":"                \"%(result)s of %(total)s resource type failed \" \"to delete.\""},{"line_number":118,"context_line":"            ) % {\u0027result\u0027: result, \u0027total\u0027: total}"},{"line_number":119,"context_line":"            raise exceptions.CommandError(msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"a9e9b037_2b8a3212","line":117,"range":{"start_line":117,"start_character":62,"end_line":117,"end_character":65},"updated":"2023-06-07 17:41:15.000000000","message":"nit: Looks like `black` rewrapped some code on you. You can drop this.","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"b10af3354377809abbef696a26551b4f5838ea58","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        if result \u003e 0:"},{"line_number":115,"context_line":"            total \u003d len(parsed_args.metadef_namespace)"},{"line_number":116,"context_line":"            msg \u003d _("},{"line_number":117,"context_line":"                \"%(result)s of %(total)s resource type failed \" \"to delete.\""},{"line_number":118,"context_line":"            ) % {\u0027result\u0027: result, \u0027total\u0027: total}"},{"line_number":119,"context_line":"            raise exceptions.CommandError(msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"e9ab3d0c_0c2c37da","line":117,"range":{"start_line":117,"start_character":62,"end_line":117,"end_character":65},"in_reply_to":"a9e9b037_2b8a3212","updated":"2023-10-10 17:58:22.000000000","message":"Done","commit_id":"95d4a5b335e447c90630f47407e60d44a76a992d"}],"openstackclient/image/v2/metadef_resource_type_associations.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7df42b0d85b32f8de24880c9af9f8d8b487c95e3","unresolved":true,"context_lines":[{"line_number":53,"context_line":"            \"--properties-target\","},{"line_number":54,"context_line":"            metavar\u003d\"\u003cproperties_target\u003e\","},{"line_number":55,"context_line":"            help\u003d_("},{"line_number":56,"context_line":"                \"Name a namespace target to remove ambuiguity, \""},{"line_number":57,"context_line":"                \"as some resource types allow more than one \""},{"line_number":58,"context_line":"                \"key/value pair per instance.\""},{"line_number":59,"context_line":"            ),"}],"source_content_type":"text/x-python","patch_set":10,"id":"47a54324_9c108f8f","line":56,"range":{"start_line":56,"start_character":51,"end_line":56,"end_character":61},"updated":"2023-10-19 15:06:33.000000000","message":"nit: ambiguity","commit_id":"a43769079d66947c3489e0bf0a59528bde15ea36"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"e3fa7933c9b7e0237e09ff7cb873eecb2c84aa70","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            \"--properties-target\","},{"line_number":54,"context_line":"            metavar\u003d\"\u003cproperties_target\u003e\","},{"line_number":55,"context_line":"            help\u003d_("},{"line_number":56,"context_line":"                \"Name a namespace target to remove ambuiguity, \""},{"line_number":57,"context_line":"                \"as some resource types allow more than one \""},{"line_number":58,"context_line":"                \"key/value pair per instance.\""},{"line_number":59,"context_line":"            ),"}],"source_content_type":"text/x-python","patch_set":10,"id":"b752256a_7ee91e7a","line":56,"range":{"start_line":56,"start_character":51,"end_line":56,"end_character":61},"in_reply_to":"47a54324_9c108f8f","updated":"2024-01-10 18:30:40.000000000","message":"Done","commit_id":"a43769079d66947c3489e0bf0a59528bde15ea36"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7df42b0d85b32f8de24880c9af9f8d8b487c95e3","unresolved":true,"context_lines":[{"line_number":94,"context_line":"            \"name\","},{"line_number":95,"context_line":"            metavar\u003d\"\u003cname\u003e\","},{"line_number":96,"context_line":"            nargs\u003d\"+\","},{"line_number":97,"context_line":"            help\u003d_(\"The name of the resource type\"),"},{"line_number":98,"context_line":"        )"},{"line_number":99,"context_line":"        return parser"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"754fff9f_862521c9","line":97,"range":{"start_line":97,"start_character":45,"end_line":97,"end_character":49},"updated":"2023-10-19 15:06:33.000000000","message":"nit:\n\n```\n(repeat option to delete multiple metadef resource type associations)\n```","commit_id":"a43769079d66947c3489e0bf0a59528bde15ea36"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"e3fa7933c9b7e0237e09ff7cb873eecb2c84aa70","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            \"name\","},{"line_number":95,"context_line":"            metavar\u003d\"\u003cname\u003e\","},{"line_number":96,"context_line":"            nargs\u003d\"+\","},{"line_number":97,"context_line":"            help\u003d_(\"The name of the resource type\"),"},{"line_number":98,"context_line":"        )"},{"line_number":99,"context_line":"        return parser"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"10ce113f_bd6a7f84","line":97,"range":{"start_line":97,"start_character":45,"end_line":97,"end_character":49},"in_reply_to":"754fff9f_862521c9","updated":"2024-01-10 18:30:40.000000000","message":"Done","commit_id":"a43769079d66947c3489e0bf0a59528bde15ea36"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7df42b0d85b32f8de24880c9af9f8d8b487c95e3","unresolved":true,"context_lines":[{"line_number":112,"context_line":"                # metadef namespace must be unprotected, so set that"},{"line_number":113,"context_line":"                # value to false if need be"},{"line_number":114,"context_line":"                set_protected \u003d False"},{"line_number":115,"context_line":"                if metadef_namespace.is_protected:"},{"line_number":116,"context_line":"                    kwargs \u003d {}"},{"line_number":117,"context_line":"                    set_protected \u003d True"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"19019d04_2709c274","line":115,"updated":"2023-10-19 15:06:33.000000000","message":"I wonder if we want to require a `--force` parameter or similar to allow this, rather than doing it by default? It kind of defeats the purpose of having a `protected` attribute on the parent resource otherwise 😅","commit_id":"a43769079d66947c3489e0bf0a59528bde15ea36"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"e3fa7933c9b7e0237e09ff7cb873eecb2c84aa70","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                # metadef namespace must be unprotected, so set that"},{"line_number":113,"context_line":"                # value to false if need be"},{"line_number":114,"context_line":"                set_protected \u003d False"},{"line_number":115,"context_line":"                if metadef_namespace.is_protected:"},{"line_number":116,"context_line":"                    kwargs \u003d {}"},{"line_number":117,"context_line":"                    set_protected \u003d True"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"a3cb320e_e740b5d7","line":115,"in_reply_to":"19019d04_2709c274","updated":"2024-01-10 18:30:40.000000000","message":"Done","commit_id":"a43769079d66947c3489e0bf0a59528bde15ea36"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7df42b0d85b32f8de24880c9af9f8d8b487c95e3","unresolved":true,"context_lines":[{"line_number":116,"context_line":"                    kwargs \u003d {}"},{"line_number":117,"context_line":"                    set_protected \u003d True"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"                    if metadef_namespace.description:"},{"line_number":120,"context_line":"                        kwargs[\u0027description\u0027] \u003d metadef_namespace.description"},{"line_number":121,"context_line":"                    if metadef_namespace.display_name:"},{"line_number":122,"context_line":"                        kwargs[\u0027display_name\u0027] \u003d metadef_namespace.display_name"},{"line_number":123,"context_line":"                    if metadef_namespace.namespace:"},{"line_number":124,"context_line":"                        kwargs[\u0027namespace\u0027] \u003d metadef_namespace.namespace"},{"line_number":125,"context_line":"                    if metadef_namespace.visibility:"},{"line_number":126,"context_line":"                        kwargs[\u0027visibility\u0027] \u003d metadef_namespace.visibility"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"                    kwargs[\u0027is_protected\u0027] \u003d False"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"720394db_4cc33113","line":126,"range":{"start_line":119,"start_character":0,"end_line":126,"end_character":75},"updated":"2023-10-19 15:06:33.000000000","message":"I don\u0027t think you need to do any of these, do you? They won\u0027t be updated unless they\u0027ve changed.","commit_id":"a43769079d66947c3489e0bf0a59528bde15ea36"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"e3fa7933c9b7e0237e09ff7cb873eecb2c84aa70","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                    kwargs \u003d {}"},{"line_number":117,"context_line":"                    set_protected \u003d True"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"                    if metadef_namespace.description:"},{"line_number":120,"context_line":"                        kwargs[\u0027description\u0027] \u003d metadef_namespace.description"},{"line_number":121,"context_line":"                    if metadef_namespace.display_name:"},{"line_number":122,"context_line":"                        kwargs[\u0027display_name\u0027] \u003d metadef_namespace.display_name"},{"line_number":123,"context_line":"                    if metadef_namespace.namespace:"},{"line_number":124,"context_line":"                        kwargs[\u0027namespace\u0027] \u003d metadef_namespace.namespace"},{"line_number":125,"context_line":"                    if metadef_namespace.visibility:"},{"line_number":126,"context_line":"                        kwargs[\u0027visibility\u0027] \u003d metadef_namespace.visibility"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"                    kwargs[\u0027is_protected\u0027] \u003d False"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"0127e061_4d3fe4bd","line":126,"range":{"start_line":119,"start_character":0,"end_line":126,"end_character":75},"in_reply_to":"720394db_4cc33113","updated":"2024-01-10 18:30:40.000000000","message":"Done","commit_id":"a43769079d66947c3489e0bf0a59528bde15ea36"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1bfe6fda6a2db8ae11ffbd503bb4ed79662bcbbc","unresolved":true,"context_lines":[{"line_number":10,"context_line":"#   License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#   under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"\"\"\"Image V2 Action Implementations\"\"\""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import logging"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"a38d3941_9be98e37","line":13,"range":{"start_line":13,"start_character":3,"end_line":13,"end_character":11},"updated":"2024-01-19 12:49:15.000000000","message":"Is this accurate?","commit_id":"311d146911099dd36ce70b5bde787d74dd6b90ce"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"816219f41526a7adb791e1a028dec1b93562832a","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#   License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#   under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"\"\"\"Image V2 Action Implementations\"\"\""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import logging"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"5b30f985_0c527bcd","line":13,"range":{"start_line":13,"start_character":3,"end_line":13,"end_character":11},"in_reply_to":"4f3eefb9_cb53dec2","updated":"2024-01-29 17:37:30.000000000","message":"Done","commit_id":"311d146911099dd36ce70b5bde787d74dd6b90ce"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e728e74dd9297a12e7a1d9370b1eed6eb729898","unresolved":true,"context_lines":[{"line_number":10,"context_line":"#   License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#   under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"\"\"\"Image V2 Action Implementations\"\"\""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import logging"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"4f3eefb9_cb53dec2","line":13,"range":{"start_line":13,"start_character":3,"end_line":13,"end_character":11},"in_reply_to":"848d13e8_e0ffdaaf","updated":"2024-01-26 14:06:48.000000000","message":"I think `Image Metadef Resource Associations` would be more useful? That or you could drop this?","commit_id":"311d146911099dd36ce70b5bde787d74dd6b90ce"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"179ccdd3ab6ec811838049a45c7f97534684e079","unresolved":true,"context_lines":[{"line_number":10,"context_line":"#   License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#   under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"\"\"\"Image V2 Action Implementations\"\"\""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import logging"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"848d13e8_e0ffdaaf","line":13,"range":{"start_line":13,"start_character":3,"end_line":13,"end_character":11},"in_reply_to":"a38d3941_9be98e37","updated":"2024-01-25 18:37:24.000000000","message":"I noticed the other image files had this header, and I thought they were Image implementations, but I can remove this if need be!","commit_id":"311d146911099dd36ce70b5bde787d74dd6b90ce"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1bfe6fda6a2db8ae11ffbd503bb4ed79662bcbbc","unresolved":true,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"                image_client.delete_metadef_resource_type_association("},{"line_number":136,"context_line":"                    resource_type,"},{"line_number":137,"context_line":"                    metadef_namespace,"},{"line_number":138,"context_line":"                )"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"                # had to force protection to false, update back to true"}],"source_content_type":"text/x-python","patch_set":12,"id":"5fb8c85e_1fe613e5","line":137,"updated":"2024-01-19 12:49:15.000000000","message":"Do we want to pass `ignore_missing\u003dFalse` here? We seem to do it inconsistently. Without passing it, things will appear to succeed even if the resource type doesn\u0027t exist or you have a typo.","commit_id":"311d146911099dd36ce70b5bde787d74dd6b90ce"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"179ccdd3ab6ec811838049a45c7f97534684e079","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"                image_client.delete_metadef_resource_type_association("},{"line_number":136,"context_line":"                    resource_type,"},{"line_number":137,"context_line":"                    metadef_namespace,"},{"line_number":138,"context_line":"                )"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"                # had to force protection to false, update back to true"}],"source_content_type":"text/x-python","patch_set":12,"id":"bc05bd9c_a8e0a37b","line":137,"in_reply_to":"5fb8c85e_1fe613e5","updated":"2024-01-25 18:37:24.000000000","message":"Ah yes I see that too. I\u0027ll add it to the delete command","commit_id":"311d146911099dd36ce70b5bde787d74dd6b90ce"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e728e74dd9297a12e7a1d9370b1eed6eb729898","unresolved":true,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"                    image_client.update_metadef_namespace("},{"line_number":132,"context_line":"                        metadef_namespace.namespace, **kwargs"},{"line_number":133,"context_line":"                    )"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"                image_client.delete_metadef_resource_type_association("},{"line_number":136,"context_line":"                    resource_type, metadef_namespace, ignore_missing\u003dFalse"}],"source_content_type":"text/x-python","patch_set":13,"id":"2ae96ed5_c433af0d","line":133,"updated":"2024-01-26 14:06:48.000000000","message":"What happens if `is_protected` is `True` and `force` is False? Do we want to let it fail server-side or here, client-side?","commit_id":"1b43f25819937dbc7ae3ac45c24c2cb8bca1a282"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"816219f41526a7adb791e1a028dec1b93562832a","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"                    image_client.update_metadef_namespace("},{"line_number":132,"context_line":"                        metadef_namespace.namespace, **kwargs"},{"line_number":133,"context_line":"                    )"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"                image_client.delete_metadef_resource_type_association("},{"line_number":136,"context_line":"                    resource_type, metadef_namespace, ignore_missing\u003dFalse"}],"source_content_type":"text/x-python","patch_set":13,"id":"86fd07d6_a0f5a88d","line":133,"in_reply_to":"2ae96ed5_c433af0d","updated":"2024-01-29 17:37:30.000000000","message":"Acknowledged","commit_id":"1b43f25819937dbc7ae3ac45c24c2cb8bca1a282"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e728e74dd9297a12e7a1d9370b1eed6eb729898","unresolved":true,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"                # had to force protection to false, update back to true"},{"line_number":140,"context_line":"                if parsed_args.force:"},{"line_number":141,"context_line":"                    kwargs[\u0027is_protected\u0027] \u003d True"},{"line_number":142,"context_line":"                    image_client.update_metadef_namespace("},{"line_number":143,"context_line":"                        metadef_namespace.namespace, **kwargs"},{"line_number":144,"context_line":"                    )"}],"source_content_type":"text/x-python","patch_set":13,"id":"1bd44239_c5720992","line":141,"updated":"2024-01-26 14:06:48.000000000","message":"This logic isn\u0027t correct. You\u0027re assuming the namespace was protected previously but you don\u0027t know that for sure (i.e. `force` could be `True` but `is_protected` could be `False`). Rather than checking if `force` is `True`, it would be better to store the fact that you set `is_protected` to `False` and use that flag to determine if you should re-add protection. A simple `is_protected` variable that you set inside the above `if` block would do the trick.","commit_id":"1b43f25819937dbc7ae3ac45c24c2cb8bca1a282"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"816219f41526a7adb791e1a028dec1b93562832a","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"                # had to force protection to false, update back to true"},{"line_number":140,"context_line":"                if parsed_args.force:"},{"line_number":141,"context_line":"                    kwargs[\u0027is_protected\u0027] \u003d True"},{"line_number":142,"context_line":"                    image_client.update_metadef_namespace("},{"line_number":143,"context_line":"                        metadef_namespace.namespace, **kwargs"},{"line_number":144,"context_line":"                    )"}],"source_content_type":"text/x-python","patch_set":13,"id":"c0595425_b8cfe6d4","line":141,"in_reply_to":"1bd44239_c5720992","updated":"2024-01-29 17:37:30.000000000","message":"Done","commit_id":"1b43f25819937dbc7ae3ac45c24c2cb8bca1a282"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5b58f53d5f942ac809847a9f3f4b7e4f9207e741","unresolved":true,"context_lines":[{"line_number":1,"context_line":"#   Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#   not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#   a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":14,"id":"79b4e2b4_53bcdf39","line":1,"updated":"2024-01-29 17:49:30.000000000","message":"We tend to name these files in the singular. If there are files that named plurally then that\u0027s a mistake to be fixed. Could you rename this back to `metadef_resource_type_association.py`?","commit_id":"bdaf81b86473570551e872018b754a1e6cf840ae"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"20560ab84e6222b217a82e4071d1347cb60d0f09","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#   Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#   not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#   a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":14,"id":"4bee2877_9ba20cc5","line":1,"in_reply_to":"79b4e2b4_53bcdf39","updated":"2024-01-29 18:43:16.000000000","message":"Done","commit_id":"bdaf81b86473570551e872018b754a1e6cf840ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5b58f53d5f942ac809847a9f3f4b7e4f9207e741","unresolved":true,"context_lines":[{"line_number":121,"context_line":"                # To be able to delete a resource type association the"},{"line_number":122,"context_line":"                # metadef namespace must be unprotected, so set that"},{"line_number":123,"context_line":"                # value to false if force is true and namespace is protected"},{"line_number":124,"context_line":"                is_protected \u003d True"},{"line_number":125,"context_line":"                if metadef_namespace.is_protected and parsed_args.force:"},{"line_number":126,"context_line":"                    kwargs \u003d {}"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"fec97ad7_4fe7d334","line":124,"updated":"2024-01-29 17:49:30.000000000","message":"This works but it\u0027s confusing. I\u0027d expect the values to be reversed. I\u0027d treat this variable more like `is_initially_protected` (i.e. hold a value to indicate whether the namespace was initially unprotected).","commit_id":"bdaf81b86473570551e872018b754a1e6cf840ae"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"20560ab84e6222b217a82e4071d1347cb60d0f09","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                # To be able to delete a resource type association the"},{"line_number":122,"context_line":"                # metadef namespace must be unprotected, so set that"},{"line_number":123,"context_line":"                # value to false if force is true and namespace is protected"},{"line_number":124,"context_line":"                is_protected \u003d True"},{"line_number":125,"context_line":"                if metadef_namespace.is_protected and parsed_args.force:"},{"line_number":126,"context_line":"                    kwargs \u003d {}"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ceb7fe27_72049f5f","line":124,"in_reply_to":"fec97ad7_4fe7d334","updated":"2024-01-29 18:43:16.000000000","message":"Done","commit_id":"bdaf81b86473570551e872018b754a1e6cf840ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5b58f53d5f942ac809847a9f3f4b7e4f9207e741","unresolved":true,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"                image_client.delete_metadef_resource_type_association("},{"line_number":136,"context_line":"                    resource_type, metadef_namespace, ignore_missing\u003dFalse"},{"line_number":137,"context_line":"                )"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"                # had to force protection to false, update back to true"},{"line_number":140,"context_line":"                if is_protected is False:"}],"source_content_type":"text/x-python","patch_set":14,"id":"1348e4d9_4adcade2","line":137,"updated":"2024-01-29 17:49:30.000000000","message":"If this fails, we\u0027ll raise an exception and the namespace will be left unprotected. You probably want to wrap the delete call in a `try-finally` block?","commit_id":"bdaf81b86473570551e872018b754a1e6cf840ae"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"20560ab84e6222b217a82e4071d1347cb60d0f09","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"                image_client.delete_metadef_resource_type_association("},{"line_number":136,"context_line":"                    resource_type, metadef_namespace, ignore_missing\u003dFalse"},{"line_number":137,"context_line":"                )"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"                # had to force protection to false, update back to true"},{"line_number":140,"context_line":"                if is_protected is False:"}],"source_content_type":"text/x-python","patch_set":14,"id":"c2d67718_ec68fb1a","line":137,"in_reply_to":"1348e4d9_4adcade2","updated":"2024-01-29 18:43:16.000000000","message":"Done","commit_id":"bdaf81b86473570551e872018b754a1e6cf840ae"}],"openstackclient/tests/unit/image/v2/test_metadef_resource_type_associations.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7df42b0d85b32f8de24880c9af9f8d8b487c95e3","unresolved":true,"context_lines":[{"line_number":18,"context_line":"    def setUp(self):"},{"line_number":19,"context_line":"        super().setUp()"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"        self.client \u003d self.app.client_manager.image"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class TestMetadefResourceTypeAssociationCreate("}],"source_content_type":"text/x-python","patch_set":10,"id":"6598039f_09ca909a","line":21,"updated":"2023-10-19 15:06:33.000000000","message":"This is [already exposed by the `TestImagev2` class](https://github.com/openstack/python-openstackclient/blob/0fb1cae1a895be77d63b83e8bce2d1a79a1c8006/openstackclient/tests/unit/image/v2/fakes.py#L32-L40). You don\u0027t need this base class. Simply inherit from `TestImagev2` below and replace `self.client` with `self.image_client`.","commit_id":"a43769079d66947c3489e0bf0a59528bde15ea36"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"d2275947dd19ce9334e99af0b9da414486604690","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    def setUp(self):"},{"line_number":19,"context_line":"        super().setUp()"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"        self.client \u003d self.app.client_manager.image"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class TestMetadefResourceTypeAssociationCreate("}],"source_content_type":"text/x-python","patch_set":10,"id":"0f532f73_b98b84ce","line":21,"in_reply_to":"6598039f_09ca909a","updated":"2024-01-10 18:32:36.000000000","message":"Done","commit_id":"a43769079d66947c3489e0bf0a59528bde15ea36"}],"releasenotes/notes/add-image-metadef-resource-type-association-commands-4d373d7d8eca5d55.yaml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7df42b0d85b32f8de24880c9af9f8d8b487c95e3","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    Added ``image metadef resource type association list``"},{"line_number":5,"context_line":"    to list resource type associations for the image service."},{"line_number":6,"context_line":"    This is equivalent to the"},{"line_number":7,"context_line":"    ``+md-namespace-resource-type-association-list``"},{"line_number":8,"context_line":"    command in glance."},{"line_number":9,"context_line":"  - |"},{"line_number":10,"context_line":"    Added ``image metadef resource type association create``"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"e7f2ef7e_681033fd","line":7,"updated":"2023-10-19 15:06:33.000000000","message":"What\u0027s the formatting of these commands?","commit_id":"a43769079d66947c3489e0bf0a59528bde15ea36"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3776fab15d1c3921e56e0c3ac18c59e7a8667977","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Added ``image metadef resource type association list``"},{"line_number":5,"context_line":"    to list resource type associations for the image service."},{"line_number":6,"context_line":"    This is equivalent to the"},{"line_number":7,"context_line":"    ``+md-namespace-resource-type-association-list``"},{"line_number":8,"context_line":"    command in glance."},{"line_number":9,"context_line":"  - |"},{"line_number":10,"context_line":"    Added ``image metadef resource type association create``"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"a4abb4ad_f5d4420c","line":7,"in_reply_to":"148495d8_1e54e154","updated":"2024-01-19 12:51:07.000000000","message":"Per my comment below, the equivalent is slightly different (I figured this out by running `glance help | grep associat` 😅)","commit_id":"a43769079d66947c3489e0bf0a59528bde15ea36"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"e3fa7933c9b7e0237e09ff7cb873eecb2c84aa70","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    Added ``image metadef resource type association list``"},{"line_number":5,"context_line":"    to list resource type associations for the image service."},{"line_number":6,"context_line":"    This is equivalent to the"},{"line_number":7,"context_line":"    ``+md-namespace-resource-type-association-list``"},{"line_number":8,"context_line":"    command in glance."},{"line_number":9,"context_line":"  - |"},{"line_number":10,"context_line":"    Added ``image metadef resource type association create``"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"148495d8_1e54e154","line":7,"in_reply_to":"e7f2ef7e_681033fd","updated":"2024-01-10 18:30:40.000000000","message":"I couldn\u0027t find this command, so I\u0027m not sure what I was doing the first time I wrote these release notes. Fixing it in my current commit. \n\nAssociation: https://docs.openstack.org/python-glanceclient/rocky/cli/details.html#glance-md-resource-type-associate\n\nDelete Association: https://docs.openstack.org/python-glanceclient/rocky/cli/details.html#glance-md-resource-type-deassociate\n\nList (is this for associations? Does an equivalent command exist?): https://docs.openstack.org/python-glanceclient/rocky/cli/details.html#glance-md-resource-type-list","commit_id":"a43769079d66947c3489e0bf0a59528bde15ea36"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1bfe6fda6a2db8ae11ffbd503bb4ed79662bcbbc","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    Added ``image metadef resource type association list``"},{"line_number":5,"context_line":"    to list resource type associations for the image service."},{"line_number":6,"context_line":"    This is equivalent to the"},{"line_number":7,"context_line":"    ``+md-resource-type-list`` command in glance."},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    Added ``image metadef resource type association create``"},{"line_number":10,"context_line":"    to create a resource type association for the image service."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"3ce0041f_a5aa5dc0","line":7,"range":{"start_line":7,"start_character":7,"end_line":7,"end_character":28},"updated":"2024-01-19 12:49:15.000000000","message":"This isn\u0027t the equivalent command. The equivalent command is `md-namespace-resource-type-list`","commit_id":"311d146911099dd36ce70b5bde787d74dd6b90ce"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1bfe6fda6a2db8ae11ffbd503bb4ed79662bcbbc","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    Added ``image metadef resource type association list``"},{"line_number":5,"context_line":"    to list resource type associations for the image service."},{"line_number":6,"context_line":"    This is equivalent to the"},{"line_number":7,"context_line":"    ``+md-resource-type-list`` command in glance."},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    Added ``image metadef resource type association create``"},{"line_number":10,"context_line":"    to create a resource type association for the image service."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"180cb50e_ecffe5a3","line":7,"range":{"start_line":7,"start_character":6,"end_line":7,"end_character":7},"updated":"2024-01-19 12:49:15.000000000","message":"What\u0027s the `+` for?","commit_id":"311d146911099dd36ce70b5bde787d74dd6b90ce"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"179ccdd3ab6ec811838049a45c7f97534684e079","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Added ``image metadef resource type association list``"},{"line_number":5,"context_line":"    to list resource type associations for the image service."},{"line_number":6,"context_line":"    This is equivalent to the"},{"line_number":7,"context_line":"    ``+md-resource-type-list`` command in glance."},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    Added ``image metadef resource type association create``"},{"line_number":10,"context_line":"    to create a resource type association for the image service."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"8f27d994_b4389b95","line":7,"range":{"start_line":7,"start_character":6,"end_line":7,"end_character":7},"in_reply_to":"180cb50e_ecffe5a3","updated":"2024-01-25 18:37:24.000000000","message":"I believe I had seen a note with the plus, but I honestly can\u0027t remember why I added it. Removing.","commit_id":"311d146911099dd36ce70b5bde787d74dd6b90ce"},{"author":{"_account_id":35548,"name":"Antonia Gaete","email":"antoniagaete@osuosl.org","username":"antoniagaete"},"change_message_id":"179ccdd3ab6ec811838049a45c7f97534684e079","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Added ``image metadef resource type association list``"},{"line_number":5,"context_line":"    to list resource type associations for the image service."},{"line_number":6,"context_line":"    This is equivalent to the"},{"line_number":7,"context_line":"    ``+md-resource-type-list`` command in glance."},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    Added ``image metadef resource type association create``"},{"line_number":10,"context_line":"    to create a resource type association for the image service."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"e78822fd_b7386677","line":7,"range":{"start_line":7,"start_character":7,"end_line":7,"end_character":28},"in_reply_to":"3ce0041f_a5aa5dc0","updated":"2024-01-25 18:37:24.000000000","message":"Done","commit_id":"311d146911099dd36ce70b5bde787d74dd6b90ce"}]}
