)]}'
{"plugins/modules/os_image.py":[{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"fbd458e69e036f2f9f7aa892492303382d2c1dac","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        kernel\u003ddict(default\u003dNone),"},{"line_number":168,"context_line":"        properties\u003ddict(type\u003d\u0027dict\u0027, default\u003d{}),"},{"line_number":169,"context_line":"        volume\u003ddict(default\u003dNone),"},{"line_number":170,"context_line":"        tags\u003ddict(type\u003d\u0027list\u0027, default\u003dNone),"},{"line_number":171,"context_line":"        state\u003ddict(default\u003d\u0027present\u0027, choices\u003d[\u0027absent\u0027, \u0027present\u0027]),"},{"line_number":172,"context_line":"    )"},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_9d1d53c1","line":170,"range":{"start_line":170,"start_character":8,"end_line":170,"end_character":44},"updated":"2020-02-02 08:58:43.000000000","message":"can you please add test for it in https://github.com/openstack/ansible-collections-openstack/blob/master/ci/roles/image/tasks/main.yml","commit_id":"0365796a3beba1a4181d6af9a9e38fe413a4519f"},{"author":{"_account_id":31557,"name":"Vladimir Ermakov","email":"vooon341@gmail.com","username":"vooon341"},"change_message_id":"4f12f0a1ba861c8994383e742b3229afea4d8743","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        kernel\u003ddict(default\u003dNone),"},{"line_number":168,"context_line":"        properties\u003ddict(type\u003d\u0027dict\u0027, default\u003d{}),"},{"line_number":169,"context_line":"        volume\u003ddict(default\u003dNone),"},{"line_number":170,"context_line":"        tags\u003ddict(type\u003d\u0027list\u0027, default\u003dNone),"},{"line_number":171,"context_line":"        state\u003ddict(default\u003d\u0027present\u0027, choices\u003d[\u0027absent\u0027, \u0027present\u0027]),"},{"line_number":172,"context_line":"    )"},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_bde28f9b","line":170,"range":{"start_line":170,"start_character":8,"end_line":170,"end_character":44},"in_reply_to":"3fa7e38b_9d1d53c1","updated":"2020-02-02 09:50:51.000000000","message":"Will do.","commit_id":"0365796a3beba1a4181d6af9a9e38fe413a4519f"},{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"fbd458e69e036f2f9f7aa892492303382d2c1dac","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                ramdisk\u003dmodule.params[\u0027ramdisk\u0027],"},{"line_number":217,"context_line":"                protected\u003dmodule.params[\u0027protected\u0027],"},{"line_number":218,"context_line":"                **module.params[\u0027properties\u0027])"},{"line_number":219,"context_line":"            if module.params[\u0027tags\u0027] is not None:"},{"line_number":220,"context_line":"                # NOTE: In theory all what you need - pass `tags` to function above."},{"line_number":221,"context_line":"                #       Unfortunately i always got 400 Bad Request with SDK 0.33.0."},{"line_number":222,"context_line":"                #       cloud.image.add/remove_tags works, but raise AttributeError"},{"line_number":223,"context_line":"                #       *after* the successful call is done."},{"line_number":224,"context_line":"                existing_tags \u003d set(image.tags)"},{"line_number":225,"context_line":"                required_tags \u003d set(module.params[\u0027tags\u0027])"},{"line_number":226,"context_line":"                for tag in existing_tags.difference(required_tags):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_7d2097fa","line":223,"range":{"start_line":219,"start_character":12,"end_line":223,"end_character":60},"updated":"2020-02-02 08:58:43.000000000","message":"If it doesn\u0027t work well with SDK 0.33, let\u0027s fix SDK then. Or worth to try to test it with latest, maybe it\u0027s already solved. I\u0027m not sure making complex workarounds because of buggy SDK is a good idea. \nIf we know exactly that specific versions of SDK have specific bug that fails this functionality, let\u0027s add version check and apply this specific workaround to those specific versions. For example see: https://review.opendev.org/#/c/705054/4/plugins/modules/os_network.py\nBut it should be known and clear reason why it doesn\u0027t work or works not consistently, and it\u0027s not problem with your setup or other circumstances.","commit_id":"0365796a3beba1a4181d6af9a9e38fe413a4519f"},{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"41e30f0496ddfc202c632e709756403745d92f77","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                ramdisk\u003dmodule.params[\u0027ramdisk\u0027],"},{"line_number":217,"context_line":"                protected\u003dmodule.params[\u0027protected\u0027],"},{"line_number":218,"context_line":"                **module.params[\u0027properties\u0027])"},{"line_number":219,"context_line":"            if module.params[\u0027tags\u0027] is not None:"},{"line_number":220,"context_line":"                # NOTE: In theory all what you need - pass `tags` to function above."},{"line_number":221,"context_line":"                #       Unfortunately i always got 400 Bad Request with SDK 0.33.0."},{"line_number":222,"context_line":"                #       cloud.image.add/remove_tags works, but raise AttributeError"},{"line_number":223,"context_line":"                #       *after* the successful call is done."},{"line_number":224,"context_line":"                existing_tags \u003d set(image.tags)"},{"line_number":225,"context_line":"                required_tags \u003d set(module.params[\u0027tags\u0027])"},{"line_number":226,"context_line":"                for tag in existing_tags.difference(required_tags):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_260b7dd4","line":223,"range":{"start_line":219,"start_character":12,"end_line":223,"end_character":60},"in_reply_to":"3fa7e38b_608647ba","updated":"2020-02-10 13:51:47.000000000","message":"Vladimir, thanks for your investigation, I really appreciate it. \nI\u0027ll call for SDK folks to check this topic, maybe we can sort it out with their help. If we\u0027ll still have the current state, I\u0027m fine to go with this workaround. Thanks again for your investigation of this issue.","commit_id":"0365796a3beba1a4181d6af9a9e38fe413a4519f"},{"author":{"_account_id":31557,"name":"Vladimir Ermakov","email":"vooon341@gmail.com","username":"vooon341"},"change_message_id":"4f12f0a1ba861c8994383e742b3229afea4d8743","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                ramdisk\u003dmodule.params[\u0027ramdisk\u0027],"},{"line_number":217,"context_line":"                protected\u003dmodule.params[\u0027protected\u0027],"},{"line_number":218,"context_line":"                **module.params[\u0027properties\u0027])"},{"line_number":219,"context_line":"            if module.params[\u0027tags\u0027] is not None:"},{"line_number":220,"context_line":"                # NOTE: In theory all what you need - pass `tags` to function above."},{"line_number":221,"context_line":"                #       Unfortunately i always got 400 Bad Request with SDK 0.33.0."},{"line_number":222,"context_line":"                #       cloud.image.add/remove_tags works, but raise AttributeError"},{"line_number":223,"context_line":"                #       *after* the successful call is done."},{"line_number":224,"context_line":"                existing_tags \u003d set(image.tags)"},{"line_number":225,"context_line":"                required_tags \u003d set(module.params[\u0027tags\u0027])"},{"line_number":226,"context_line":"                for tag in existing_tags.difference(required_tags):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_1dbc036a","line":223,"range":{"start_line":219,"start_character":12,"end_line":223,"end_character":60},"in_reply_to":"3fa7e38b_7d2097fa","updated":"2020-02-02 09:50:51.000000000","message":"I\u0027m pretty sure that even newest version don\u0027t work, see: https://docs.openstack.org/openstacksdk/latest/user/proxies/image_v2.html\n\nConstructor do not have `tags`, and it\u0027s only one with `array` type in the Create API: https://docs.openstack.org/api-ref/image/v2/?expanded\u003dcreate-image-detail\n\nAs i remember SDK incorrectly encode tags array and as a result i got 400 error.\nSo use of add/remove_tags() will work on any version of SDK.\n\nSo real SDK bug is only that resource.TagMixin.add_tag() raises AttributeError.\nBut i will check SDK 0.40.","commit_id":"0365796a3beba1a4181d6af9a9e38fe413a4519f"},{"author":{"_account_id":31557,"name":"Vladimir Ermakov","email":"vooon341@gmail.com","username":"vooon341"},"change_message_id":"daa5ea838c7de4dcc2a1c3f6a36cac8c326b8a36","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                ramdisk\u003dmodule.params[\u0027ramdisk\u0027],"},{"line_number":217,"context_line":"                protected\u003dmodule.params[\u0027protected\u0027],"},{"line_number":218,"context_line":"                **module.params[\u0027properties\u0027])"},{"line_number":219,"context_line":"            if module.params[\u0027tags\u0027] is not None:"},{"line_number":220,"context_line":"                # NOTE: In theory all what you need - pass `tags` to function above."},{"line_number":221,"context_line":"                #       Unfortunately i always got 400 Bad Request with SDK 0.33.0."},{"line_number":222,"context_line":"                #       cloud.image.add/remove_tags works, but raise AttributeError"},{"line_number":223,"context_line":"                #       *after* the successful call is done."},{"line_number":224,"context_line":"                existing_tags \u003d set(image.tags)"},{"line_number":225,"context_line":"                required_tags \u003d set(module.params[\u0027tags\u0027])"},{"line_number":226,"context_line":"                for tag in existing_tags.difference(required_tags):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_608647ba","line":223,"range":{"start_line":219,"start_character":12,"end_line":223,"end_character":60},"in_reply_to":"3fa7e38b_7d2097fa","updated":"2020-02-09 07:49:39.000000000","message":"Sagi, i tested with SDK 0.36, 0.40, 0.41:\nall of them have patch: [cb240b13][1]\nwhich solved two problems: `tags` on image create and `add/remove_tag()` do not raise AttributeError.\n\nBut it didn\u0027t fix `update_image_properties()`, so i kept workaround.\nUnfortunately i have very limited free time to make contributions, so it may took me ages to get enough understanding of SDK class hierarchy.\n\n[1]: https://github.com/openstack/openstacksdk/commit/cb240b1308768a51572864ee675c26cb87fbfe7a#diff-db324f2a16c069feab36204b6fb627a5","commit_id":"0365796a3beba1a4181d6af9a9e38fe413a4519f"}]}
