)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34208,"name":"Rafael Castillo","email":"rcastill@redhat.com","username":"rcastill"},"change_message_id":"2b3e551832519d868e556d8330ed9c15b5a52fae","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"15310116_6c545998","updated":"2022-06-17 16:07:12.000000000","message":"Please add this to tox_extra_args in .zuul.yaml so the ci runs your tests.","commit_id":"bd77e04185ec2aea476310623eb935bdcfc7e3f7"},{"author":{"_account_id":34208,"name":"Rafael Castillo","email":"rcastill@redhat.com","username":"rcastill"},"change_message_id":"5d7b403556005b4a77f0df85455d06355a555c8a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"046cdda9_86af33ae","updated":"2022-06-27 18:13:15.000000000","message":"LGTM, thanks!","commit_id":"e7bd3fdd52173ea3d28e6fee94b8c2668f33fb44"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"8b04fd3a1344976cd8818de6bff8f605f490b1d7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":28,"id":"5bade5c5_bea66c66","updated":"2022-07-05 12:29:11.000000000","message":"Solid refactoring! Thank you, Ananya :) That was quite difficult, esp. due to self.conn.search_security_groups() incompatibility with our tags related arguments..😅\n\nDid some minor changes:\n* added ci tests for filtering by description and not_tags\n* added missing stateful to expected_fields\n* added explanation why self.conn.search_security_groups cannot be used\n* splitted argument processing into two steps to make special handling for tags more explicit/visible\n","commit_id":"2cf1afaa3f6235aace74c1c474c7a1b98a19f8d9"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"85cedd68feacd211cf01e45d5f8c85828ddcf317","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"3a4f2f53_c0344a7b","updated":"2022-07-05 14:37:29.000000000","message":"The last patchset moved the inline comment about self.conn.search_security_groups() to commit message, because @sshnaidm heavily disagreed with putting a long comment into the code 😉","commit_id":"d600284645ee8f5b83b0644693422c8fa2a1614e"}],"ci/roles/security_group/defaults/main.yml":[{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"58211e3d3b29cf9d3bf3ff6749e7396935a370eb","unresolved":true,"context_lines":[{"line_number":3,"context_line":"- created_at"},{"line_number":4,"context_line":"- description"},{"line_number":5,"context_line":"- name"},{"line_number":6,"context_line":"- stateful"},{"line_number":7,"context_line":"- project_id"},{"line_number":8,"context_line":"- security_group_rules"},{"line_number":9,"context_line":"- tenant_id"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"84e178f3_fa799eaa","line":6,"range":{"start_line":6,"start_character":2,"end_line":6,"end_character":10},"updated":"2022-07-04 21:44:50.000000000","message":"Seems like this doesn\u0027t appear, and fail the test:\n\n  failed: [localhost] (item\u003dstateful) \u003d\u003e {\n    \"ansible_loop_var\": \"item\",\n    \"assertion\": \"item in rule.rule\",\n    \"changed\": false,\n    \"evaluated_to\": false,\n    \"item\": \"stateful\",\n    \"msg\": \"Assertion failed\"","commit_id":"7f7897db83eadd2ed38e2f047e22cca507e1d919"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"149c7749f1e017a6bb3e5031c21bcad0e82f66c6","unresolved":false,"context_lines":[{"line_number":3,"context_line":"- created_at"},{"line_number":4,"context_line":"- description"},{"line_number":5,"context_line":"- name"},{"line_number":6,"context_line":"- stateful"},{"line_number":7,"context_line":"- project_id"},{"line_number":8,"context_line":"- security_group_rules"},{"line_number":9,"context_line":"- tenant_id"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"881d08f1_8551f178","line":6,"range":{"start_line":6,"start_character":2,"end_line":6,"end_character":10},"in_reply_to":"84e178f3_fa799eaa","updated":"2022-07-05 12:19:49.000000000","message":"This was caused by a merge conflict. When applied on top of master, Zuul CI would create a merge commit. This resulting commit had two expected_fields parameters. To prevent this, i split the ci test into two separate roles:\n\nhttps://review.opendev.org/c/openstack/ansible-collections-openstack/+/848735","commit_id":"7f7897db83eadd2ed38e2f047e22cca507e1d919"}],"plugins/modules/security_group_info.py":[{"author":{"_account_id":32458,"name":"Ananya","display_name":"Ananya Banerjee","email":"anbanerj@redhat.com","username":"frenzyfriday"},"change_message_id":"4140f3f9746151b0c4df667316c359f67f7f3ea3","unresolved":true,"context_lines":[{"line_number":161,"context_line":"        result \u003d self.conn.network.networks.security_groups(**attrs)"},{"line_number":162,"context_line":"        result \u003d [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":163,"context_line":"        if name:"},{"line_number":164,"context_line":"            result \u003d [item for item in result if name in (item[\u0027id\u0027], item[\u0027name\u0027])]"},{"line_number":165,"context_line":"        self.results.update({\u0027security_groups\u0027: result})"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"98516931_60827021","line":164,"updated":"2022-05-16 09:31:13.000000000","message":"do we need this?","commit_id":"e078f1a90b8b6b26cda6af285f7929894a57f7a2"},{"author":{"_account_id":34208,"name":"Rafael Castillo","email":"rcastill@redhat.com","username":"rcastill"},"change_message_id":"cb54afef33424053f6f0aca4b9a64cdced4b4cd0","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        result \u003d self.conn.network.networks.security_groups(**attrs)"},{"line_number":162,"context_line":"        result \u003d [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":163,"context_line":"        if name:"},{"line_number":164,"context_line":"            result \u003d [item for item in result if name in (item[\u0027id\u0027], item[\u0027name\u0027])]"},{"line_number":165,"context_line":"        self.results.update({\u0027security_groups\u0027: result})"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"d6c2ef65_14f7d41a","line":164,"in_reply_to":"2ce7fe11_0b8987be","updated":"2022-06-09 18:20:26.000000000","message":"See Jakob\u0027s comment below.","commit_id":"e078f1a90b8b6b26cda6af285f7929894a57f7a2"},{"author":{"_account_id":34208,"name":"Rafael Castillo","email":"rcastill@redhat.com","username":"rcastill"},"change_message_id":"5273565649e64c08b69d08eb8d93694b1c3d86a8","unresolved":true,"context_lines":[{"line_number":161,"context_line":"        result \u003d self.conn.network.networks.security_groups(**attrs)"},{"line_number":162,"context_line":"        result \u003d [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":163,"context_line":"        if name:"},{"line_number":164,"context_line":"            result \u003d [item for item in result if name in (item[\u0027id\u0027], item[\u0027name\u0027])]"},{"line_number":165,"context_line":"        self.results.update({\u0027security_groups\u0027: result})"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"2ce7fe11_0b8987be","line":164,"in_reply_to":"98516931_60827021","updated":"2022-05-30 23:11:32.000000000","message":"See above. As it stands this block is redundant but we need to handle the case where name is defined separately.","commit_id":"e078f1a90b8b6b26cda6af285f7929894a57f7a2"},{"author":{"_account_id":34208,"name":"Rafael Castillo","email":"rcastill@redhat.com","username":"rcastill"},"change_message_id":"5273565649e64c08b69d08eb8d93694b1c3d86a8","unresolved":true,"context_lines":[{"line_number":61,"context_line":"RETURN \u003d \u0027\u0027\u0027"},{"line_number":62,"context_line":"security_groups:"},{"line_number":63,"context_line":"  description: List of dictionaries describing security groups."},{"line_number":64,"context_line":"  type: dict"},{"line_number":65,"context_line":"  elements: list"},{"line_number":66,"context_line":"  returned: On Success."},{"line_number":67,"context_line":"  contains:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ceb018b2_b6a2b8e4","line":64,"updated":"2022-05-30 23:11:32.000000000","message":"these are swapped. Should be type: list with elements: dict.","commit_id":"3082e4622002619e9d2d5625ea645ade0ae2ef28"},{"author":{"_account_id":34208,"name":"Rafael Castillo","email":"rcastill@redhat.com","username":"rcastill"},"change_message_id":"cb54afef33424053f6f0aca4b9a64cdced4b4cd0","unresolved":false,"context_lines":[{"line_number":61,"context_line":"RETURN \u003d \u0027\u0027\u0027"},{"line_number":62,"context_line":"security_groups:"},{"line_number":63,"context_line":"  description: List of dictionaries describing security groups."},{"line_number":64,"context_line":"  type: dict"},{"line_number":65,"context_line":"  elements: list"},{"line_number":66,"context_line":"  returned: On Success."},{"line_number":67,"context_line":"  contains:"}],"source_content_type":"text/x-python","patch_set":4,"id":"bbfdfb53_e2e77ef1","line":64,"in_reply_to":"ceb018b2_b6a2b8e4","updated":"2022-06-09 18:20:26.000000000","message":"Done","commit_id":"3082e4622002619e9d2d5625ea645ade0ae2ef28"},{"author":{"_account_id":34208,"name":"Rafael Castillo","email":"rcastill@redhat.com","username":"rcastill"},"change_message_id":"5273565649e64c08b69d08eb8d93694b1c3d86a8","unresolved":true,"context_lines":[{"line_number":156,"context_line":"    def run(self):"},{"line_number":157,"context_line":"        name \u003d self.params[\u0027name\u0027]"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        attrs \u003d {k: v for k, v in self.params.items() if v is not None}"},{"line_number":160,"context_line":"        result \u003d self.conn.network.networks.security_groups(**attrs)"},{"line_number":161,"context_line":"        result \u003d [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":162,"context_line":"        if name:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f817f4f_ad0b6345","line":159,"updated":"2022-05-30 23:11:32.000000000","message":"This handles all params the same. Name is a special case since it can also be an ID.\n\nWe probably want a separate branch when name is defined where we use find_security_group, since that handles both names and IDs.","commit_id":"3082e4622002619e9d2d5625ea645ade0ae2ef28"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"c306531d5c67f1d03a8dadc65f056d6fdf4b5c10","unresolved":true,"context_lines":[{"line_number":156,"context_line":"    def run(self):"},{"line_number":157,"context_line":"        name \u003d self.params[\u0027name\u0027]"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        attrs \u003d {k: v for k, v in self.params.items() if v is not None}"},{"line_number":160,"context_line":"        result \u003d self.conn.network.networks.security_groups(**attrs)"},{"line_number":161,"context_line":"        result \u003d [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":162,"context_line":"        if name:"}],"source_content_type":"text/x-python","patch_set":4,"id":"b3de3e85_3a774a30","line":159,"in_reply_to":"3f817f4f_ad0b6345","updated":"2022-06-02 15:51:41.000000000","message":"Lets be consistent to our other *_info modules and keep it simple, i.e. dont implement branching and let SDK do the filtering etc. Other modules use SDK cloud layer\u0027s search_* functions for that, so here we might get away with using search_security_groups() [1].\n\n[1] https://github.com/openstack/openstacksdk/blob/03cf733959abdac3202b623d7730ec7b09d5971a/openstack/cloud/_security_group.py#L31","commit_id":"3082e4622002619e9d2d5625ea645ade0ae2ef28"},{"author":{"_account_id":34208,"name":"Rafael Castillo","email":"rcastill@redhat.com","username":"rcastill"},"change_message_id":"cb54afef33424053f6f0aca4b9a64cdced4b4cd0","unresolved":false,"context_lines":[{"line_number":156,"context_line":"    def run(self):"},{"line_number":157,"context_line":"        name \u003d self.params[\u0027name\u0027]"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        attrs \u003d {k: v for k, v in self.params.items() if v is not None}"},{"line_number":160,"context_line":"        result \u003d self.conn.network.networks.security_groups(**attrs)"},{"line_number":161,"context_line":"        result \u003d [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":162,"context_line":"        if name:"}],"source_content_type":"text/x-python","patch_set":4,"id":"b0790ee3_08872543","line":159,"in_reply_to":"b3de3e85_3a774a30","updated":"2022-06-09 18:20:26.000000000","message":"Ack","commit_id":"3082e4622002619e9d2d5625ea645ade0ae2ef28"},{"author":{"_account_id":34208,"name":"Rafael Castillo","email":"rcastill@redhat.com","username":"rcastill"},"change_message_id":"5273565649e64c08b69d08eb8d93694b1c3d86a8","unresolved":true,"context_lines":[{"line_number":161,"context_line":"        result \u003d [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":162,"context_line":"        if name:"},{"line_number":163,"context_line":"            result \u003d [item for item in result if name in (item[\u0027id\u0027], item[\u0027name\u0027])]"},{"line_number":164,"context_line":"        self.results.update({\u0027security_groups\u0027: result})"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"def main():"}],"source_content_type":"text/x-python","patch_set":4,"id":"c9fbb578_9342f84e","line":164,"updated":"2022-05-30 23:11:32.000000000","message":"Please update this to use self.exit_json instead.","commit_id":"3082e4622002619e9d2d5625ea645ade0ae2ef28"},{"author":{"_account_id":34208,"name":"Rafael Castillo","email":"rcastill@redhat.com","username":"rcastill"},"change_message_id":"cb54afef33424053f6f0aca4b9a64cdced4b4cd0","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        result \u003d [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":162,"context_line":"        if name:"},{"line_number":163,"context_line":"            result \u003d [item for item in result if name in (item[\u0027id\u0027], item[\u0027name\u0027])]"},{"line_number":164,"context_line":"        self.results.update({\u0027security_groups\u0027: result})"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"def main():"}],"source_content_type":"text/x-python","patch_set":4,"id":"854d24bf_59659034","line":164,"in_reply_to":"c9fbb578_9342f84e","updated":"2022-06-09 18:20:26.000000000","message":"Done","commit_id":"3082e4622002619e9d2d5625ea645ade0ae2ef28"},{"author":{"_account_id":32458,"name":"Ananya","display_name":"Ananya Banerjee","email":"anbanerj@redhat.com","username":"frenzyfriday"},"change_message_id":"03a95bcdf8f5d7b3f617b2b7e82a9943893e0f08","unresolved":true,"context_lines":[{"line_number":158,"context_line":"        attrs \u003d {k: v for k, v in self.params.items() if v is not None}"},{"line_number":159,"context_line":"        if name:"},{"line_number":160,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":161,"context_line":"        result \u003d self.conn.network.security_groups(**attrs)"},{"line_number":162,"context_line":"        result \u003d [item.to_dict(computed\u003dFalse) for item in result]"},{"line_number":163,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"bcd89e58_4e9f8ee1","line":161,"updated":"2022-06-02 15:09:29.000000000","message":"still fails with \"msg\": \"Invalid query params: wait,interface,timeout\"","commit_id":"3b585aaec6ccc4ddaae2a5099a0cb069cbf4e978"},{"author":{"_account_id":32458,"name":"Ananya","display_name":"Ananya Banerjee","email":"anbanerj@redhat.com","username":"frenzyfriday"},"change_message_id":"565bbf2ecda85d0922ba076c5513dabbec217a80","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        attrs \u003d {k: v for k, v in self.params.items() if v is not None}"},{"line_number":159,"context_line":"        if name:"},{"line_number":160,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":161,"context_line":"        result \u003d self.conn.network.security_groups(**attrs)"},{"line_number":162,"context_line":"        result \u003d [item.to_dict(computed\u003dFalse) for item in result]"},{"line_number":163,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"177d79fb_ed2a14bc","line":161,"in_reply_to":"6b28f801_d5710f26","updated":"2022-07-05 10:40:54.000000000","message":"Done","commit_id":"3b585aaec6ccc4ddaae2a5099a0cb069cbf4e978"},{"author":{"_account_id":32458,"name":"Ananya","display_name":"Ananya Banerjee","email":"anbanerj@redhat.com","username":"frenzyfriday"},"change_message_id":"54656ee22e431cb7ea92182d4ce0f404563acac5","unresolved":true,"context_lines":[{"line_number":158,"context_line":"        attrs \u003d {k: v for k, v in self.params.items() if v is not None}"},{"line_number":159,"context_line":"        if name:"},{"line_number":160,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":161,"context_line":"        result \u003d self.conn.network.security_groups(**attrs)"},{"line_number":162,"context_line":"        result \u003d [item.to_dict(computed\u003dFalse) for item in result]"},{"line_number":163,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"94df6ab3_67214ff4","line":161,"in_reply_to":"bcd89e58_4e9f8ee1","updated":"2022-06-02 15:43:55.000000000","message":"The full traceback is:\n  File \"/tmp/ansible_openstack.cloud.security_group_info_payload_afmckk1d/ansible_openstack.cloud.security_group_info_payload.zip/ansible_collections/openstack/cloud/plugins/module_utils/openstack.py\", line 438, in __call__\n    results \u003d self.run()\n  File \"/tmp/ansible_openstack.cloud.security_group_info_payload_afmckk1d/ansible_openstack.cloud.security_group_info_payload.zip/ansible_collections/openstack/cloud/plugins/modules/security_group_info.py\", line 162, in run\n  File \"/tmp/ansible_openstack.cloud.security_group_info_payload_afmckk1d/ansible_openstack.cloud.security_group_info_payload.zip/ansible_collections/openstack/cloud/plugins/modules/security_group_info.py\", line 162, in \u003clistcomp\u003e\n  File \"/usr/local/lib/python3.8/dist-packages/openstack/resource.py\", line 1748, in list\n    params \u003d cls._query_mapping._validate(\n  File \"/usr/local/lib/python3.8/dist-packages/openstack/resource.py\", line 353, in _validate\n    raise exceptions.InvalidResourceQuery(\nfatal: [10.9.113.189]: FAILED! \u003d\u003e {\n    \"changed\": false,\n    \"extra_data\": {\n        \"data\": [\n            \"interface\",\n            \"wait\",\n            \"timeout\"\n        ],\n        \"details\": \"None\",\n        \"response\": \"None\"\n    },\n    \"invocation\": {\n        \"module_args\": {\n            \"any_tags\": null,\n            \"api_timeout\": null,\n            \"auth\": null,\n            \"auth_type\": null,\n            \"availability_zone\": null,\n            \"ca_cert\": null,\n            \"client_cert\": null,\n            \"client_key\": null,\n            \"description\": null,\n            \"interface\": \"public\",\n            \"name\": null,\n            \"not_any_tags\": null,\n            \"not_tags\": null,\n            \"project_id\": null,\n            \"region_name\": null,\n            \"revision_number\": null,\n            \"tags\": null,\n            \"timeout\": 180,\n            \"validate_certs\": null,\n            \"wait\": true\n        }\n    },\n    \"msg\": \"Invalid query params: interface,wait,timeout\"","commit_id":"3b585aaec6ccc4ddaae2a5099a0cb069cbf4e978"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"c306531d5c67f1d03a8dadc65f056d6fdf4b5c10","unresolved":true,"context_lines":[{"line_number":158,"context_line":"        attrs \u003d {k: v for k, v in self.params.items() if v is not None}"},{"line_number":159,"context_line":"        if name:"},{"line_number":160,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":161,"context_line":"        result \u003d self.conn.network.security_groups(**attrs)"},{"line_number":162,"context_line":"        result \u003d [item.to_dict(computed\u003dFalse) for item in result]"},{"line_number":163,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"6b28f801_d5710f26","line":161,"in_reply_to":"bcd89e58_4e9f8ee1","updated":"2022-06-02 15:51:41.000000000","message":"self.conn.network.security_groups() is the function which had been called in previous code and worked before. The issue here is that your base class OpenStackModule adds additional arguments such as \u0027wait\u0027 and \u0027interface\u0027 [2] to argument_spec [1]. Your code above\n\n  attrs \u003d {k: v for k, v in self.params.items() if v is not None}\n\ntakes all those params including \u0027wait\u0027 and \u0027interface\u0027 and passes them to self.conn.network.security_groups(). To solve this, try something like:\n  \n\n  attrs \u003d {k: self.params[k] for k in \n           [\u0027description\u0027, ......., \u0027project_id\u0027, ....]\n           if v is not None}\n\nNote that my indentation is probably wrong. As discussed in the other comment above i would probably switch from self.conn.network.security_groups() to self.conn.search_security_groups():\n\n  result \u003d self.conn.network.security_groups(name_or_id\u003dname, **attrs)\n\n[1] https://opendev.org/openstack/ansible-collections-openstack/src/commit/a9fa496ebe6fec56f01fd657aadfe6d7321269e9/plugins/module_utils/openstack.py#L269\n[2] https://opendev.org/openstack/ansible-collections-openstack/src/commit/a9fa496ebe6fec56f01fd657aadfe6d7321269e9/plugins/module_utils/openstack.py#L118","commit_id":"3b585aaec6ccc4ddaae2a5099a0cb069cbf4e978"},{"author":{"_account_id":8367,"name":"Arx Cruz","email":"arxcruz@redhat.com","username":"arxcruz"},"change_message_id":"80745806402f11886ef1195c12c2e8248e44e6cd","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        name \u003d self.params[\u0027name\u0027]"},{"line_number":158,"context_line":"        attrs \u003d {k: self.params[k] for k in"},{"line_number":159,"context_line":"                 [\u0027description\u0027, \u0027name\u0027, \u0027project_id\u0027, \u0027revision_number\u0027, \u0027tags\u0027, \u0027any_tags\u0027, \u0027not_tags\u0027, \u0027not_any_tags\u0027]"},{"line_number":160,"context_line":"                 if self.params[k] is not None}"},{"line_number":161,"context_line":"        if name:"},{"line_number":162,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":163,"context_line":"        result \u003d self.conn.search_security_groups(**attrs)"}],"source_content_type":"text/x-python","patch_set":9,"id":"e0e2c35a_b33c9999","line":160,"updated":"2022-06-15 08:02:21.000000000","message":"Great simplification!","commit_id":"45bf75d6c26ade45a50e16aab197fb917f96efc4"},{"author":{"_account_id":8367,"name":"Arx Cruz","email":"arxcruz@redhat.com","username":"arxcruz"},"change_message_id":"80745806402f11886ef1195c12c2e8248e44e6cd","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                 if self.params[k] is not None}"},{"line_number":161,"context_line":"        if name:"},{"line_number":162,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":163,"context_line":"        result \u003d self.conn.search_security_groups(**attrs)"},{"line_number":164,"context_line":"        [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":165,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"c98c0515_077e9dea","line":163,"updated":"2022-06-15 08:02:21.000000000","message":"So, this was already using proxy layer, and you changed to cloud layer, is there a reason?","commit_id":"45bf75d6c26ade45a50e16aab197fb917f96efc4"},{"author":{"_account_id":34208,"name":"Rafael Castillo","email":"rcastill@redhat.com","username":"rcastill"},"change_message_id":"cb54afef33424053f6f0aca4b9a64cdced4b4cd0","unresolved":true,"context_lines":[{"line_number":160,"context_line":"                 if self.params[k] is not None}"},{"line_number":161,"context_line":"        if name:"},{"line_number":162,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":163,"context_line":"        result \u003d self.conn.search_security_groups(**attrs)"},{"line_number":164,"context_line":"        [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":165,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"2fc64450_add99d54","line":163,"updated":"2022-06-09 18:20:26.000000000","message":"This needs the name param sent in as name_or_id to allow filtering by name or id","commit_id":"45bf75d6c26ade45a50e16aab197fb917f96efc4"},{"author":{"_account_id":32458,"name":"Ananya","display_name":"Ananya Banerjee","email":"anbanerj@redhat.com","username":"frenzyfriday"},"change_message_id":"122feb990b9fa55c394a0716e6c7b1fea08155aa","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                 if self.params[k] is not None}"},{"line_number":161,"context_line":"        if name:"},{"line_number":162,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":163,"context_line":"        result \u003d self.conn.search_security_groups(**attrs)"},{"line_number":164,"context_line":"        [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":165,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5412f0eb_050b5c80","line":163,"in_reply_to":"2fc64450_add99d54","updated":"2022-06-16 08:52:21.000000000","message":"Done","commit_id":"45bf75d6c26ade45a50e16aab197fb917f96efc4"},{"author":{"_account_id":32458,"name":"Ananya","display_name":"Ananya Banerjee","email":"anbanerj@redhat.com","username":"frenzyfriday"},"change_message_id":"565bbf2ecda85d0922ba076c5513dabbec217a80","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                 if self.params[k] is not None}"},{"line_number":161,"context_line":"        if name:"},{"line_number":162,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":163,"context_line":"        result \u003d self.conn.search_security_groups(**attrs)"},{"line_number":164,"context_line":"        [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":165,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"acb3f470_414cd37b","line":163,"in_reply_to":"6c766e12_df92d9f4","updated":"2022-07-05 10:40:54.000000000","message":"Done","commit_id":"45bf75d6c26ade45a50e16aab197fb917f96efc4"},{"author":{"_account_id":34208,"name":"Rafael Castillo","email":"rcastill@redhat.com","username":"rcastill"},"change_message_id":"2b3e551832519d868e556d8330ed9c15b5a52fae","unresolved":true,"context_lines":[{"line_number":160,"context_line":"                 if self.params[k] is not None}"},{"line_number":161,"context_line":"        if name:"},{"line_number":162,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":163,"context_line":"        result \u003d self.conn.search_security_groups(**attrs)"},{"line_number":164,"context_line":"        [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":165,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"6c766e12_df92d9f4","line":163,"in_reply_to":"8eb1b936_50701180","updated":"2022-06-17 16:07:12.000000000","message":"The cloud layer handles a small edge case for us (proxying security groups through nova). So it might be best to keep this there.","commit_id":"45bf75d6c26ade45a50e16aab197fb917f96efc4"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"d98df58745caa1ff5031417d2f6fc0e2ae3103b0","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                 if self.params[k] is not None}"},{"line_number":161,"context_line":"        if name:"},{"line_number":162,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":163,"context_line":"        result \u003d self.conn.search_security_groups(**attrs)"},{"line_number":164,"context_line":"        [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":165,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"f26db4ef_60f4b1c2","line":163,"in_reply_to":"acb3f470_414cd37b","updated":"2022-07-05 12:24:06.000000000","message":"Explained in patchset 27+28 why we cannot use self.conn.search_security_groups here.","commit_id":"45bf75d6c26ade45a50e16aab197fb917f96efc4"},{"author":{"_account_id":32458,"name":"Ananya","display_name":"Ananya Banerjee","email":"anbanerj@redhat.com","username":"frenzyfriday"},"change_message_id":"c283b24ec71ccc37873fd64db7854a489f4537de","unresolved":true,"context_lines":[{"line_number":160,"context_line":"                 if self.params[k] is not None}"},{"line_number":161,"context_line":"        if name:"},{"line_number":162,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":163,"context_line":"        result \u003d self.conn.search_security_groups(**attrs)"},{"line_number":164,"context_line":"        [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":165,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"8eb1b936_50701180","line":163,"in_reply_to":"c98c0515_077e9dea","updated":"2022-06-16 09:00:29.000000000","message":"If we use the proxy layer we will have to split into 2 cases: one to search with name or id (find_security_group) and other with the filters.\nsearch_security_groups already handles both the cases. And it will also be more consistent with other modules where we are using filters.\n\nI am not sure which approach will be the best here : cloud layer or proxy layer","commit_id":"45bf75d6c26ade45a50e16aab197fb917f96efc4"},{"author":{"_account_id":34208,"name":"Rafael Castillo","email":"rcastill@redhat.com","username":"rcastill"},"change_message_id":"2b3e551832519d868e556d8330ed9c15b5a52fae","unresolved":true,"context_lines":[{"line_number":170,"context_line":"        if name:"},{"line_number":171,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":172,"context_line":"        result \u003d self.conn.search_security_groups(name_or_id\u003dname, **attrs)"},{"line_number":173,"context_line":"        [item if isinstance(item, dict) else item.to_dict(computed\u003dFalse) for item in result]"},{"line_number":174,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"f0bac68e_14f5ea77","line":173,"updated":"2022-06-17 16:07:12.000000000","message":"This isn\u0027t getting assigned to anything.\n\nIt seems we might need to check if results are dicts though, as it seems search_security_groups might be returning munches in some cases.","commit_id":"bd77e04185ec2aea476310623eb935bdcfc7e3f7"},{"author":{"_account_id":32458,"name":"Ananya","display_name":"Ananya Banerjee","email":"anbanerj@redhat.com","username":"frenzyfriday"},"change_message_id":"565bbf2ecda85d0922ba076c5513dabbec217a80","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        if name:"},{"line_number":171,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":172,"context_line":"        result \u003d self.conn.search_security_groups(name_or_id\u003dname, **attrs)"},{"line_number":173,"context_line":"        [item if isinstance(item, dict) else item.to_dict(computed\u003dFalse) for item in result]"},{"line_number":174,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"6b2d7c5e_ce04ef39","line":173,"in_reply_to":"26054f28_a229f8a0","updated":"2022-07-05 10:40:54.000000000","message":"Done","commit_id":"bd77e04185ec2aea476310623eb935bdcfc7e3f7"},{"author":{"_account_id":32458,"name":"Ananya","display_name":"Ananya Banerjee","email":"anbanerj@redhat.com","username":"frenzyfriday"},"change_message_id":"301ff71a89fbcbdea381745fd5e6678ac594e49d","unresolved":true,"context_lines":[{"line_number":170,"context_line":"        if name:"},{"line_number":171,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":172,"context_line":"        result \u003d self.conn.search_security_groups(name_or_id\u003dname, **attrs)"},{"line_number":173,"context_line":"        [item if isinstance(item, dict) else item.to_dict(computed\u003dFalse) for item in result]"},{"line_number":174,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"26054f28_a229f8a0","line":173,"in_reply_to":"f0bac68e_14f5ea77","updated":"2022-06-20 13:01:09.000000000","message":"Sorry, missed to add \u0027result \u003d\u0027 😂","commit_id":"bd77e04185ec2aea476310623eb935bdcfc7e3f7"},{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"36a4adf5b3ddef5a71c28d88eea03c8643152e07","unresolved":true,"context_lines":[{"line_number":165,"context_line":"    def run(self):"},{"line_number":166,"context_line":"        name \u003d self.params[\u0027name\u0027]"},{"line_number":167,"context_line":"        attrs \u003d {k: self.params[k] for k in"},{"line_number":168,"context_line":"                 [\u0027description\u0027, \u0027name\u0027, \u0027project_id\u0027, \u0027revision_number\u0027, \u0027tags\u0027, \u0027any_tags\u0027, \u0027not_tags\u0027, \u0027not_any_tags\u0027]"},{"line_number":169,"context_line":"                 if self.params[k] is not None}"},{"line_number":170,"context_line":"        if name:"},{"line_number":171,"context_line":"            attrs.pop(\u0027name\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1891a3cf_a3c16793","line":168,"range":{"start_line":168,"start_character":16,"end_line":168,"end_character":121},"updated":"2022-07-04 11:57:46.000000000","message":"let\u0027s make it a variable for better readability?","commit_id":"e7bd3fdd52173ea3d28e6fee94b8c2668f33fb44"},{"author":{"_account_id":32458,"name":"Ananya","display_name":"Ananya Banerjee","email":"anbanerj@redhat.com","username":"frenzyfriday"},"change_message_id":"83ac8158174cfa4f1f87350d004355178753965a","unresolved":false,"context_lines":[{"line_number":165,"context_line":"    def run(self):"},{"line_number":166,"context_line":"        name \u003d self.params[\u0027name\u0027]"},{"line_number":167,"context_line":"        attrs \u003d {k: self.params[k] for k in"},{"line_number":168,"context_line":"                 [\u0027description\u0027, \u0027name\u0027, \u0027project_id\u0027, \u0027revision_number\u0027, \u0027tags\u0027, \u0027any_tags\u0027, \u0027not_tags\u0027, \u0027not_any_tags\u0027]"},{"line_number":169,"context_line":"                 if self.params[k] is not None}"},{"line_number":170,"context_line":"        if name:"},{"line_number":171,"context_line":"            attrs.pop(\u0027name\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5872f03e_a0357f01","line":168,"range":{"start_line":168,"start_character":16,"end_line":168,"end_character":121},"in_reply_to":"1891a3cf_a3c16793","updated":"2022-07-04 12:55:26.000000000","message":"Ack","commit_id":"e7bd3fdd52173ea3d28e6fee94b8c2668f33fb44"},{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"36a4adf5b3ddef5a71c28d88eea03c8643152e07","unresolved":true,"context_lines":[{"line_number":170,"context_line":"        if name:"},{"line_number":171,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":172,"context_line":"        result \u003d self.conn.search_security_groups(name_or_id\u003dname, **attrs)"},{"line_number":173,"context_line":"        result \u003d [item if isinstance(item, dict) else item.to_dict(computed\u003dFalse) for item in result]"},{"line_number":174,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"77750966_fb387385","line":173,"range":{"start_line":173,"start_character":17,"end_line":173,"end_character":48},"updated":"2022-07-04 11:57:46.000000000","message":"I think we don\u0027t need to do this check now?","commit_id":"e7bd3fdd52173ea3d28e6fee94b8c2668f33fb44"},{"author":{"_account_id":32458,"name":"Ananya","display_name":"Ananya Banerjee","email":"anbanerj@redhat.com","username":"frenzyfriday"},"change_message_id":"565bbf2ecda85d0922ba076c5513dabbec217a80","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        if name:"},{"line_number":171,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":172,"context_line":"        result \u003d self.conn.search_security_groups(name_or_id\u003dname, **attrs)"},{"line_number":173,"context_line":"        result \u003d [item if isinstance(item, dict) else item.to_dict(computed\u003dFalse) for item in result]"},{"line_number":174,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"75a18d44_5322e2b2","line":173,"range":{"start_line":173,"start_character":17,"end_line":173,"end_character":48},"in_reply_to":"6e942fe5_1f0c990b","updated":"2022-07-05 10:40:54.000000000","message":"Done","commit_id":"e7bd3fdd52173ea3d28e6fee94b8c2668f33fb44"},{"author":{"_account_id":32458,"name":"Ananya","display_name":"Ananya Banerjee","email":"anbanerj@redhat.com","username":"frenzyfriday"},"change_message_id":"83ac8158174cfa4f1f87350d004355178753965a","unresolved":true,"context_lines":[{"line_number":170,"context_line":"        if name:"},{"line_number":171,"context_line":"            attrs.pop(\u0027name\u0027)"},{"line_number":172,"context_line":"        result \u003d self.conn.search_security_groups(name_or_id\u003dname, **attrs)"},{"line_number":173,"context_line":"        result \u003d [item if isinstance(item, dict) else item.to_dict(computed\u003dFalse) for item in result]"},{"line_number":174,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"6e942fe5_1f0c990b","line":173,"range":{"start_line":173,"start_character":17,"end_line":173,"end_character":48},"in_reply_to":"77750966_fb387385","updated":"2022-07-04 12:55:26.000000000","message":"I added a comment in the method","commit_id":"e7bd3fdd52173ea3d28e6fee94b8c2668f33fb44"},{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"7f036221ac3ad40c531c96f67164205c4682d8c7","unresolved":true,"context_lines":[{"line_number":175,"context_line":"        # Check if the elements in result are Munch obj"},{"line_number":176,"context_line":"        # If not, convert to dict"},{"line_number":177,"context_line":"        # https://github.com/openstack/openstacksdk/blob/0898398415ae7b0e2447d61226acf50f01567cdd/openstack/cloud/_security_group.py#L67"},{"line_number":178,"context_line":"        result \u003d [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":179,"context_line":"        if name:"},{"line_number":180,"context_line":"            result \u003d [item for item in result if name in (item[\u0027id\u0027], item[\u0027name\u0027])]"},{"line_number":181,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"}],"source_content_type":"text/x-python","patch_set":23,"id":"437a5bfe_bc63e91f","line":178,"range":{"start_line":178,"start_character":66,"end_line":178,"end_character":68},"updated":"2022-07-04 21:42:59.000000000","message":"I think we use usually to_dict(computed\u003dFalse) and then we for sure don\u0027t have Munch objects in the result.","commit_id":"7f7897db83eadd2ed38e2f047e22cca507e1d919"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"149c7749f1e017a6bb3e5031c21bcad0e82f66c6","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        # Check if the elements in result are Munch obj"},{"line_number":176,"context_line":"        # If not, convert to dict"},{"line_number":177,"context_line":"        # https://github.com/openstack/openstacksdk/blob/0898398415ae7b0e2447d61226acf50f01567cdd/openstack/cloud/_security_group.py#L67"},{"line_number":178,"context_line":"        result \u003d [item if isinstance(item, dict) else item.to_dict() for item in result]"},{"line_number":179,"context_line":"        if name:"},{"line_number":180,"context_line":"            result \u003d [item for item in result if name in (item[\u0027id\u0027], item[\u0027name\u0027])]"},{"line_number":181,"context_line":"        self.exit(changed\u003dFalse, security_groups\u003dresult)"}],"source_content_type":"text/x-python","patch_set":23,"id":"80d3c2ea_e86f0ec7","line":178,"range":{"start_line":178,"start_character":66,"end_line":178,"end_character":68},"in_reply_to":"437a5bfe_bc63e91f","updated":"2022-07-05 12:19:49.000000000","message":"self.conn.search_security_groups() might return Munch objects [1] which are dicts [2] already and thus do not have to be converted.\n\n[1] https://github.com/openstack/openstacksdk/blob/0898398415ae7b0e2447d61226acf50f01567cdd/openstack/cloud/_security_group.py#L67\n[2] https://github.com/Infinidat/munch/blob/23f7aa3011039551588b4ef34761a9c85d907cfc/munch/__init__.py#L44\n\nBut we cannot use self.conn.search_security_groups() as mentioned in the code, hence this can be marked as resolved.","commit_id":"7f7897db83eadd2ed38e2f047e22cca507e1d919"}]}
