)]}'
{"openstack/cloud/openstackcloud.py":[{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"3d45812ddd2974d18946cb8d4848fa77e5f10c0f","unresolved":false,"context_lines":[{"line_number":12438,"context_line":"        :raises: OpenStackBadRequest if parameters are malformed"},{"line_number":12439,"context_line":"        \"\"\""},{"line_number":12440,"context_line":"        data \u003d self.network.create_firewall_rule(**kwargs)"},{"line_number":12441,"context_line":"        return meta.obj_to_munch(data.to_dict())"},{"line_number":12442,"context_line":""},{"line_number":12443,"context_line":"    def delete_firewall_rule(self, name_or_id, filters\u003d{}):"},{"line_number":12444,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_0de4c541","line":12441,"updated":"2018-10-06 13:34:18.000000000","message":"You should just be able to return data directly rather than doing munch(to_dict()) ... the Resource objects are dict subclasses now.","commit_id":"89e961f55bb9514fc5731e2825d4276c5c05ff99"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"273f5bea00146fb25198e72c00f0cab42e761e62","unresolved":false,"context_lines":[{"line_number":12478,"context_line":"        :return: list of firewall rules"},{"line_number":12479,"context_line":"        :rtype: list[munch.Munch]"},{"line_number":12480,"context_line":"        \"\"\""},{"line_number":12481,"context_line":"        generator \u003d self.network.firewall_rules(**filters)"},{"line_number":12482,"context_line":"        return [meta.obj_to_munch(rule.to_dict()) for rule in generator]"},{"line_number":12483,"context_line":""},{"line_number":12484,"context_line":"    def update_firewall_rule(self, name_or_id, filters\u003d{}, **kwargs):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_edf2a905","line":12481,"updated":"2018-10-06 13:40:00.000000000","message":"You will need to keep the list wrapper - but can skip the munch/to_dict ... so return list(self.network.firewall_rules(**filters))","commit_id":"89e961f55bb9514fc5731e2825d4276c5c05ff99"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"273f5bea00146fb25198e72c00f0cab42e761e62","unresolved":false,"context_lines":[{"line_number":12481,"context_line":"        generator \u003d self.network.firewall_rules(**filters)"},{"line_number":12482,"context_line":"        return [meta.obj_to_munch(rule.to_dict()) for rule in generator]"},{"line_number":12483,"context_line":""},{"line_number":12484,"context_line":"    def update_firewall_rule(self, name_or_id, filters\u003d{}, **kwargs):"},{"line_number":12485,"context_line":"        \"\"\""},{"line_number":12486,"context_line":"        Updates firewall rule."},{"line_number":12487,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_4de15d2b","line":12484,"range":{"start_line":12484,"start_character":47,"end_line":12484,"end_character":57},"updated":"2018-10-06 13:40:00.000000000","message":"{} in an argument list creates a singleton dict, which is usually not whatyou want. Make this filters\u003dNone then in the body do \"if not filters: filters \u003d {}\" - otherwise this can have unintended consequences.","commit_id":"89e961f55bb9514fc5731e2825d4276c5c05ff99"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"273f5bea00146fb25198e72c00f0cab42e761e62","unresolved":false,"context_lines":[{"line_number":12499,"context_line":"        data \u003d self.network.update_firewall_rule(firewall_rule, **kwargs)"},{"line_number":12500,"context_line":"        return meta.obj_to_munch(data.to_dict())"},{"line_number":12501,"context_line":""},{"line_number":12502,"context_line":"    def _get_firewall_rule_ids(self, name_or_id_list, filters\u003d{}):"},{"line_number":12503,"context_line":"        \"\"\""},{"line_number":12504,"context_line":"        Takes a list of firewall rule name or ids, looks them up and returns"},{"line_number":12505,"context_line":"        a list of firewall rule ids."}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_6dde996b","line":12502,"range":{"start_line":12502,"start_character":54,"end_line":12502,"end_character":65},"updated":"2018-10-06 13:40:00.000000000","message":"same here","commit_id":"89e961f55bb9514fc5731e2825d4276c5c05ff99"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"273f5bea00146fb25198e72c00f0cab42e761e62","unresolved":false,"context_lines":[{"line_number":12541,"context_line":"        data \u003d self.network.create_firewall_policy(**kwargs)"},{"line_number":12542,"context_line":"        return meta.obj_to_munch(data.to_dict())"},{"line_number":12543,"context_line":""},{"line_number":12544,"context_line":"    def delete_firewall_policy(self, name_or_id, filters\u003d{}):"},{"line_number":12545,"context_line":"        \"\"\""},{"line_number":12546,"context_line":"        Deletes firewall policy."},{"line_number":12547,"context_line":"        Prints debug message in case to-be-deleted resource was not found."}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_0dcda5b9","line":12544,"range":{"start_line":12544,"start_character":49,"end_line":12544,"end_character":59},"updated":"2018-10-06 13:40:00.000000000","message":"same","commit_id":"89e961f55bb9514fc5731e2825d4276c5c05ff99"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3ffac59fa4088871d3ee27c5689cb5f2bf53fe4b","unresolved":false,"context_lines":[{"line_number":12407,"context_line":"                name\u003dname_or_id))"},{"line_number":12408,"context_line":"        return self._get_and_munchify(key\u003dNone, data\u003ddata)"},{"line_number":12409,"context_line":""},{"line_number":12410,"context_line":"    def create_firewall_rule(self, **kwargs):"},{"line_number":12411,"context_line":"        \"\"\""},{"line_number":12412,"context_line":"        Creates firewall rule."},{"line_number":12413,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_4cb7d8d8","line":12410,"updated":"2018-10-10 10:15:18.000000000","message":"why not list all the known parameters in the method contract? I know this is simple, but you\u0027re allowing users to provide whatever they want, missing or nonsense attributes.","commit_id":"781d326ecb528cd989d5ed742ab90bda59d1650c"},{"author":{"_account_id":28653,"name":"Matthias Lisin","email":"lisin@strato.de","username":"ml"},"change_message_id":"4650aec033adf67e95538e7b3c4366d5db375ab7","unresolved":false,"context_lines":[{"line_number":12407,"context_line":"                name\u003dname_or_id))"},{"line_number":12408,"context_line":"        return self._get_and_munchify(key\u003dNone, data\u003ddata)"},{"line_number":12409,"context_line":""},{"line_number":12410,"context_line":"    def create_firewall_rule(self, **kwargs):"},{"line_number":12411,"context_line":"        \"\"\""},{"line_number":12412,"context_line":"        Creates firewall rule."},{"line_number":12413,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_36c96624","line":12410,"in_reply_to":"3f79a3b5_4cb7d8d8","updated":"2018-10-11 14:38:03.000000000","message":"Done","commit_id":"781d326ecb528cd989d5ed742ab90bda59d1650c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3ffac59fa4088871d3ee27c5689cb5f2bf53fe4b","unresolved":false,"context_lines":[{"line_number":12456,"context_line":"        else:"},{"line_number":12457,"context_line":"            self.log.debug(\u0027Firewall rule %s not found for deleting\u0027,"},{"line_number":12458,"context_line":"                           name_or_id)"},{"line_number":12459,"context_line":"        return None"},{"line_number":12460,"context_line":""},{"line_number":12461,"context_line":"    def get_firewall_rule(self, name_or_id, filters\u003dNone):"},{"line_number":12462,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_cc99a86b","line":12459,"updated":"2018-10-10 10:15:18.000000000","message":"the delete methods in sdk generally return true upon successful deletion and false otherwise, including when the resource does not exist. it\u0027d be nice to keep this consistent","commit_id":"781d326ecb528cd989d5ed742ab90bda59d1650c"},{"author":{"_account_id":28653,"name":"Matthias Lisin","email":"lisin@strato.de","username":"ml"},"change_message_id":"4650aec033adf67e95538e7b3c4366d5db375ab7","unresolved":false,"context_lines":[{"line_number":12456,"context_line":"        else:"},{"line_number":12457,"context_line":"            self.log.debug(\u0027Firewall rule %s not found for deleting\u0027,"},{"line_number":12458,"context_line":"                           name_or_id)"},{"line_number":12459,"context_line":"        return None"},{"line_number":12460,"context_line":""},{"line_number":12461,"context_line":"    def get_firewall_rule(self, name_or_id, filters\u003dNone):"},{"line_number":12462,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_56dd02dc","line":12459,"in_reply_to":"3f79a3b5_cc99a86b","updated":"2018-10-11 14:38:03.000000000","message":"Done","commit_id":"781d326ecb528cd989d5ed742ab90bda59d1650c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3ffac59fa4088871d3ee27c5689cb5f2bf53fe4b","unresolved":false,"context_lines":[{"line_number":12546,"context_line":""},{"line_number":12547,"context_line":"        return self.network.create_firewall_policy(**kwargs)"},{"line_number":12548,"context_line":""},{"line_number":12549,"context_line":"    def delete_firewall_policy(self, name_or_id, filters\u003dNone):"},{"line_number":12550,"context_line":"        \"\"\""},{"line_number":12551,"context_line":"        Deletes firewall policy."},{"line_number":12552,"context_line":"        Prints debug message in case to-be-deleted resource was not found."}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_0cffa066","line":12549,"range":{"start_line":12549,"start_character":49,"end_line":12549,"end_character":61},"updated":"2018-10-10 10:15:18.000000000","message":"why does delete has filters in it? doesnt name_or_id uniquely identify a firewall policy?","commit_id":"781d326ecb528cd989d5ed742ab90bda59d1650c"},{"author":{"_account_id":28653,"name":"Matthias Lisin","email":"lisin@strato.de","username":"ml"},"change_message_id":"4650aec033adf67e95538e7b3c4366d5db375ab7","unresolved":false,"context_lines":[{"line_number":12546,"context_line":""},{"line_number":12547,"context_line":"        return self.network.create_firewall_policy(**kwargs)"},{"line_number":12548,"context_line":""},{"line_number":12549,"context_line":"    def delete_firewall_policy(self, name_or_id, filters\u003dNone):"},{"line_number":12550,"context_line":"        \"\"\""},{"line_number":12551,"context_line":"        Deletes firewall policy."},{"line_number":12552,"context_line":"        Prints debug message in case to-be-deleted resource was not found."}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_5648a2b2","line":12549,"range":{"start_line":12549,"start_character":49,"end_line":12549,"end_character":61},"in_reply_to":"3f79a3b5_0cffa066","updated":"2018-10-11 14:38:03.000000000","message":"unfortunately no. Multiple firewall policies can exists with the same name.","commit_id":"781d326ecb528cd989d5ed742ab90bda59d1650c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3ffac59fa4088871d3ee27c5689cb5f2bf53fe4b","unresolved":false,"context_lines":[{"line_number":12566,"context_line":"                           name_or_id)"},{"line_number":12567,"context_line":"        return None"},{"line_number":12568,"context_line":""},{"line_number":12569,"context_line":"    def get_firewall_policy(self, name_or_id, filters\u003dNone):"},{"line_number":12570,"context_line":"        \"\"\""},{"line_number":12571,"context_line":"        Retrieves a single firewall policy."},{"line_number":12572,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_0c348048","line":12569,"range":{"start_line":12569,"start_character":46,"end_line":12569,"end_character":58},"updated":"2018-10-10 10:15:18.000000000","message":"same comment as above. name_or_id should uniquely identify a policy","commit_id":"781d326ecb528cd989d5ed742ab90bda59d1650c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3ffac59fa4088871d3ee27c5689cb5f2bf53fe4b","unresolved":false,"context_lines":[{"line_number":12592,"context_line":"            filters \u003d {}"},{"line_number":12593,"context_line":"        return list(self.network.firewall_policies(**filters))"},{"line_number":12594,"context_line":""},{"line_number":12595,"context_line":"    def update_firewall_policy(self, name_or_id, filters\u003dNone, **kwargs):"},{"line_number":12596,"context_line":"        \"\"\""},{"line_number":12597,"context_line":"        Updates firewall policy."},{"line_number":12598,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_2c105cab","line":12595,"range":{"start_line":12595,"start_character":49,"end_line":12595,"end_character":61},"updated":"2018-10-10 10:15:18.000000000","message":"ditto","commit_id":"781d326ecb528cd989d5ed742ab90bda59d1650c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3ffac59fa4088871d3ee27c5689cb5f2bf53fe4b","unresolved":false,"context_lines":[{"line_number":12701,"context_line":"        return self.network.remove_rule_from_policy(firewall_policy[\u0027id\u0027],"},{"line_number":12702,"context_line":"                                                    firewall_rule[\u0027id\u0027])"},{"line_number":12703,"context_line":""},{"line_number":12704,"context_line":"    def create_firewall_group(self, **kwargs):"},{"line_number":12705,"context_line":"        \"\"\""},{"line_number":12706,"context_line":"        Creates firewall group. The keys egress_firewall_policy and"},{"line_number":12707,"context_line":"        ingress_firewall_policy are looked up and mapped as"},{"line_number":12708,"context_line":"        egress_firewall_policy_id and ingress_firewall_policy_id respectively."}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_cc1e88bb","line":12705,"range":{"start_line":12704,"start_character":35,"end_line":12705,"end_character":11},"updated":"2018-10-10 10:15:18.000000000","message":"same comment as in 12410 create_firewall_rule","commit_id":"781d326ecb528cd989d5ed742ab90bda59d1650c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3ffac59fa4088871d3ee27c5689cb5f2bf53fe4b","unresolved":false,"context_lines":[{"line_number":12729,"context_line":"            kwargs[\u0027ports\u0027] \u003d self._get_port_ids(kwargs[\u0027ports\u0027])"},{"line_number":12730,"context_line":"        return self.network.create_firewall_group(**kwargs)"},{"line_number":12731,"context_line":""},{"line_number":12732,"context_line":"    def delete_firewall_group(self, name_or_id, filters\u003dNone):"},{"line_number":12733,"context_line":"        \"\"\""},{"line_number":12734,"context_line":"        Deletes firewall group."},{"line_number":12735,"context_line":"        Prints debug message in case to-be-deleted resource was not found."}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_2c75bc00","line":12732,"range":{"start_line":12732,"start_character":48,"end_line":12732,"end_character":60},"updated":"2018-10-10 10:15:18.000000000","message":"should not require filters, doesn\u0027t name_or_id uniquely identify a firewall group?","commit_id":"781d326ecb528cd989d5ed742ab90bda59d1650c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3ffac59fa4088871d3ee27c5689cb5f2bf53fe4b","unresolved":false,"context_lines":[{"line_number":12749,"context_line":"                           name_or_id)"},{"line_number":12750,"context_line":"        return None"},{"line_number":12751,"context_line":""},{"line_number":12752,"context_line":"    def get_firewall_group(self, name_or_id, filters\u003dNone):"},{"line_number":12753,"context_line":"        \"\"\""},{"line_number":12754,"context_line":"        Retrieves firewall group."},{"line_number":12755,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_cc63e844","line":12752,"range":{"start_line":12752,"start_character":44,"end_line":12752,"end_character":57},"updated":"2018-10-10 10:15:18.000000000","message":"ditto","commit_id":"781d326ecb528cd989d5ed742ab90bda59d1650c"}]}
