)]}'
{"neutron/tests/tempest/api/base_security_groups.py":[{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"b4c369da1dbcd48d4480e6016e53306e4a50c79d","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            secgroup_list.append(secgroup[\u0027id\u0027])"},{"line_number":50,"context_line":"        self.assertNotIn(secgroup_id, secgroup_list)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def _test_create_show_delete_security_group_rule(self, protocols):"},{"line_number":53,"context_line":"        group_create_body, _ \u003d self._create_security_group()"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        # Create rules for each protocol"}],"source_content_type":"text/x-python","patch_set":3,"id":"7f287b81_fb7bf888","line":52,"updated":"2017-09-06 22:18:57.000000000","message":"This method is copied from the tempest repo","commit_id":"801d2072ac73e824e90899e8a68c470e40e804c5"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"23dd137a9a46b1015679790661c1fc943ef1723b","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class BaseSecGroupTest(base.BaseNetworkTest):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    V4_NAMES \u003d set(key for key in constants.IP_PROTOCOL_MAP if \u0027v6\u0027not in key)"},{"line_number":26,"context_line":"    V4_INTS \u003d set(v for k, v in constants.IP_PROTOCOL_MAP.items()"},{"line_number":27,"context_line":"                  if \u0027v6\u0027 not in k)"},{"line_number":28,"context_line":"    V6_LEGACY \u003d set([\u0027icmpv6\u0027])"},{"line_number":29,"context_line":"    V6_NAMES \u003d set(constants.IP_PROTOCOL_MAP) - (V4_NAMES | V6_LEGACY)"},{"line_number":30,"context_line":"    V6_INTS \u003d set(constants.IP_PROTOCOL_MAP.values()) - V4_INTS"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def _create_security_group(self, **kwargs):"},{"line_number":33,"context_line":"        # Create a security group"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_b0d94a23","line":30,"range":{"start_line":25,"start_character":4,"end_line":30,"end_character":63},"updated":"2017-10-05 19:48:22.000000000","message":"these could go into neutron-lib","commit_id":"5e66daf3a81b0520720298205b806d88f8aebd4e"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"895b0474b32ffe51855eca4aa35b50119361286e","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            secgroup_list.append(secgroup[\u0027id\u0027])"},{"line_number":50,"context_line":"        self.assertNotIn(secgroup_id, secgroup_list)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def _test_create_show_delete_security_group_rule(self, protocols):"},{"line_number":53,"context_line":"        group_create_body, _ \u003d self._create_security_group()"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        # Create rules for each protocol"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_b715b9e7","line":52,"range":{"start_line":52,"start_character":8,"end_line":52,"end_character":52},"updated":"2017-10-06 03:53:55.000000000","message":"This method name is too general because this creates with protocol only. I think that it\u0027s better to parepare a method like \"_create_security_group_rule\" which has create of rule and check of rule and also it should be able to receive other attributes(e.g. direction, etc).","commit_id":"5e66daf3a81b0520720298205b806d88f8aebd4e"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"b435403dffe1b6c40c6c0a7ccaed8a404056ac53","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            secgroup_list.append(secgroup[\u0027id\u0027])"},{"line_number":50,"context_line":"        self.assertNotIn(secgroup_id, secgroup_list)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def _test_create_show_delete_security_group_rule(self, protocols):"},{"line_number":53,"context_line":"        group_create_body, _ \u003d self._create_security_group()"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        # Create rules for each protocol"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_d95e2075","line":52,"range":{"start_line":52,"start_character":8,"end_line":52,"end_character":52},"in_reply_to":"7f515b1d_b715b9e7","updated":"2017-10-06 12:48:19.000000000","message":"yeah good point, I see this method isn\u0027t deleting the rules either. It was copied from the tempest test case, weird.","commit_id":"5e66daf3a81b0520720298205b806d88f8aebd4e"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"72afabec500adac38e7103ce1e25602963ed9257","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class BaseSecGroupTest(base.BaseNetworkTest):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    V4_NAMES \u003d set(key for key in constants.IP_PROTOCOL_MAP if \u0027v6\u0027not in key)"},{"line_number":26,"context_line":"    V4_INTS \u003d set(v for k, v in constants.IP_PROTOCOL_MAP.items()"},{"line_number":27,"context_line":"                  if \u0027v6\u0027 not in k)"},{"line_number":28,"context_line":"    V6_LEGACY \u003d set([\u0027icmpv6\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f4e5783_4824d60d","line":25,"range":{"start_line":25,"start_character":63,"end_line":25,"end_character":70},"updated":"2017-10-11 02:38:28.000000000","message":"Guess pep8 didn\u0027t care about the missing space","commit_id":"4a746382c9d7bf853cce2a8a734a94ddc442697a"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"8285dec08a7e615328eb63df16ee5d7140103bc4","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class BaseSecGroupTest(base.BaseNetworkTest):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    V4_NAMES \u003d set(key for key in constants.IP_PROTOCOL_MAP if \u0027v6\u0027not in key)"},{"line_number":26,"context_line":"    V4_INTS \u003d set(v for k, v in constants.IP_PROTOCOL_MAP.items()"},{"line_number":27,"context_line":"                  if \u0027v6\u0027 not in k)"},{"line_number":28,"context_line":"    V6_LEGACY \u003d set([\u0027icmpv6\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f4e5783_c64dc99a","line":25,"range":{"start_line":25,"start_character":63,"end_line":25,"end_character":70},"in_reply_to":"5f4e5783_4824d60d","updated":"2017-10-16 18:40:44.000000000","message":"Done","commit_id":"4a746382c9d7bf853cce2a8a734a94ddc442697a"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fbf6b2c4365f7a8ea57aeb4b1bcd65b466a4ce7b","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class BaseSecGroupTest(base.BaseNetworkTest):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    V4_NAMES \u003d set(key for key in constants.IP_PROTOCOL_MAP if \u0027v6\u0027 not in key)"},{"line_number":26,"context_line":"    V4_INTS \u003d set(v for k, v in constants.IP_PROTOCOL_MAP.items()"},{"line_number":27,"context_line":"                  if \u0027v6\u0027 not in k)"},{"line_number":28,"context_line":"    V6_LEGACY \u003d set([\u0027icmpv6\u0027])"},{"line_number":29,"context_line":"    V6_NAMES \u003d set(constants.IP_PROTOCOL_MAP) - (V4_NAMES | V6_LEGACY)"},{"line_number":30,"context_line":"    V6_INTS \u003d set(constants.IP_PROTOCOL_MAP.values()) - V4_INTS"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_80dd5ae1","line":27,"range":{"start_line":25,"start_character":0,"end_line":27,"end_character":35},"updated":"2017-10-17 16:44:03.000000000","message":"IMO, these belong in class SecGroupTest here: https://review.openstack.org/#/c/499786/6/neutron/tests/tempest/api/test_security_groups.py@22.","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"42e57040775cf5fe78aa8f452209e52a57b3134d","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class BaseSecGroupTest(base.BaseNetworkTest):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    V4_NAMES \u003d set(key for key in constants.IP_PROTOCOL_MAP if \u0027v6\u0027 not in key)"},{"line_number":26,"context_line":"    V4_INTS \u003d set(v for k, v in constants.IP_PROTOCOL_MAP.items()"},{"line_number":27,"context_line":"                  if \u0027v6\u0027 not in k)"},{"line_number":28,"context_line":"    V6_LEGACY \u003d set([\u0027icmpv6\u0027])"},{"line_number":29,"context_line":"    V6_NAMES \u003d set(constants.IP_PROTOCOL_MAP) - (V4_NAMES | V6_LEGACY)"},{"line_number":30,"context_line":"    V6_INTS \u003d set(constants.IP_PROTOCOL_MAP.values()) - V4_INTS"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_816e76fd","line":27,"range":{"start_line":25,"start_character":0,"end_line":27,"end_character":35},"in_reply_to":"5f4e5783_80dd5ae1","updated":"2017-10-17 21:37:02.000000000","message":"can\u0027t quite do that, but I proposed something else.","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fbf6b2c4365f7a8ea57aeb4b1bcd65b466a4ce7b","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    V4_NAMES \u003d set(key for key in constants.IP_PROTOCOL_MAP if \u0027v6\u0027 not in key)"},{"line_number":26,"context_line":"    V4_INTS \u003d set(v for k, v in constants.IP_PROTOCOL_MAP.items()"},{"line_number":27,"context_line":"                  if \u0027v6\u0027 not in k)"},{"line_number":28,"context_line":"    V6_LEGACY \u003d set([\u0027icmpv6\u0027])"},{"line_number":29,"context_line":"    V6_NAMES \u003d set(constants.IP_PROTOCOL_MAP) - (V4_NAMES | V6_LEGACY)"},{"line_number":30,"context_line":"    V6_INTS \u003d set(constants.IP_PROTOCOL_MAP.values()) - V4_INTS"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def _create_security_group(self, **kwargs):"},{"line_number":33,"context_line":"        # Create a security group"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_e0c3eeeb","line":30,"range":{"start_line":28,"start_character":0,"end_line":30,"end_character":63},"updated":"2017-10-17 16:44:03.000000000","message":"IMO these belong in class SecGroupIPv6Test here: https://review.openstack.org/#/c/499786/6/neutron/tests/tempest/api/test_security_groups.py@89.","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"42e57040775cf5fe78aa8f452209e52a57b3134d","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    V4_NAMES \u003d set(key for key in constants.IP_PROTOCOL_MAP if \u0027v6\u0027 not in key)"},{"line_number":26,"context_line":"    V4_INTS \u003d set(v for k, v in constants.IP_PROTOCOL_MAP.items()"},{"line_number":27,"context_line":"                  if \u0027v6\u0027 not in k)"},{"line_number":28,"context_line":"    V6_LEGACY \u003d set([\u0027icmpv6\u0027])"},{"line_number":29,"context_line":"    V6_NAMES \u003d set(constants.IP_PROTOCOL_MAP) - (V4_NAMES | V6_LEGACY)"},{"line_number":30,"context_line":"    V6_INTS \u003d set(constants.IP_PROTOCOL_MAP.values()) - V4_INTS"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def _create_security_group(self, **kwargs):"},{"line_number":33,"context_line":"        # Create a security group"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_4174fece","line":30,"range":{"start_line":28,"start_character":0,"end_line":30,"end_character":63},"in_reply_to":"5f4e5783_e0c3eeeb","updated":"2017-10-17 21:37:02.000000000","message":"can\u0027t quite do that, but I proposed something else.","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"996b6c65795b40e82d11a0f5e85290dc0f2cc29c","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        show_rule_body \u003d self.client.show_security_group_rule("},{"line_number":67,"context_line":"                rule_create_body[\u0027security_group_rule\u0027][\u0027id\u0027])"},{"line_number":68,"context_line":"        create_dict \u003d rule_create_body[\u0027security_group_rule\u0027]"},{"line_number":69,"context_line":"        for key, value in create_dict.items():"},{"line_number":70,"context_line":"            self.assertEqual(value,"},{"line_number":71,"context_line":"                             show_rule_body[\u0027security_group_rule\u0027][key],"},{"line_number":72,"context_line":"                             \"%s does not match.\" % key)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _delete_security_group_rule(self, secgroup_rule_id):"},{"line_number":75,"context_line":"        self.client.delete_security_group_rule(secgroup_rule_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_238a4669","line":72,"range":{"start_line":69,"start_character":8,"end_line":72,"end_character":56},"updated":"2017-10-17 01:20:29.000000000","message":"This checks all attributes of security group rule although they include some attributes we don\u0027t need to check(e.g. id, project_id, tenant_id). Can we give parameters which we must check? I guess that we can generate the parameter from kwargs.","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"42e57040775cf5fe78aa8f452209e52a57b3134d","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        show_rule_body \u003d self.client.show_security_group_rule("},{"line_number":67,"context_line":"                rule_create_body[\u0027security_group_rule\u0027][\u0027id\u0027])"},{"line_number":68,"context_line":"        create_dict \u003d rule_create_body[\u0027security_group_rule\u0027]"},{"line_number":69,"context_line":"        for key, value in create_dict.items():"},{"line_number":70,"context_line":"            self.assertEqual(value,"},{"line_number":71,"context_line":"                             show_rule_body[\u0027security_group_rule\u0027][key],"},{"line_number":72,"context_line":"                             \"%s does not match.\" % key)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _delete_security_group_rule(self, secgroup_rule_id):"},{"line_number":75,"context_line":"        self.client.delete_security_group_rule(secgroup_rule_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_e14e4a95","line":72,"range":{"start_line":69,"start_character":8,"end_line":72,"end_character":56},"in_reply_to":"5f4e5783_238a4669","updated":"2017-10-17 21:37:02.000000000","message":"Nice catch, I was trying to figure out how to slim down run time. This might help a bit.","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"996b6c65795b40e82d11a0f5e85290dc0f2cc29c","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                     for rule in rule_list_body[\u0027security_group_rules\u0027]]"},{"line_number":79,"context_line":"        self.assertNotIn(secgroup_rule_id, rule_list)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _test_create_show_delete_security_group_rule(self, **kwargs):"},{"line_number":82,"context_line":"        rule_create_body \u003d self._create_security_group_rule(**kwargs)"},{"line_number":83,"context_line":"        self._show_security_group_rule(rule_create_body)"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_23efe61e","line":81,"range":{"start_line":81,"start_character":8,"end_line":81,"end_character":52},"updated":"2017-10-17 01:20:29.000000000","message":"The method name means that this deletes security_group_rule but delete isn\u0027t called here although I understand that created rule is deleted by L61.","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fbf6b2c4365f7a8ea57aeb4b1bcd65b466a4ce7b","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                     for rule in rule_list_body[\u0027security_group_rules\u0027]]"},{"line_number":79,"context_line":"        self.assertNotIn(secgroup_rule_id, rule_list)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _test_create_show_delete_security_group_rule(self, **kwargs):"},{"line_number":82,"context_line":"        rule_create_body \u003d self._create_security_group_rule(**kwargs)"},{"line_number":83,"context_line":"        self._show_security_group_rule(rule_create_body)"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_457534f9","line":81,"range":{"start_line":81,"start_character":8,"end_line":81,"end_character":52},"in_reply_to":"5f4e5783_23efe61e","updated":"2017-10-17 16:44:03.000000000","message":"I would go as far as to suggest that this method should be moved to class SecGroupTest here: https://review.openstack.org/#/c/499786/6/neutron/tests/tempest/api/test_security_groups.py@22.","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"42e57040775cf5fe78aa8f452209e52a57b3134d","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                     for rule in rule_list_body[\u0027security_group_rules\u0027]]"},{"line_number":79,"context_line":"        self.assertNotIn(secgroup_rule_id, rule_list)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _test_create_show_delete_security_group_rule(self, **kwargs):"},{"line_number":82,"context_line":"        rule_create_body \u003d self._create_security_group_rule(**kwargs)"},{"line_number":83,"context_line":"        self._show_security_group_rule(rule_create_body)"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_79921459","line":81,"range":{"start_line":81,"start_character":8,"end_line":81,"end_character":52},"in_reply_to":"5f4e5783_23efe61e","updated":"2017-10-17 21:37:02.000000000","message":"I\u0027ll add a comment.","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"42e57040775cf5fe78aa8f452209e52a57b3134d","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                     for rule in rule_list_body[\u0027security_group_rules\u0027]]"},{"line_number":79,"context_line":"        self.assertNotIn(secgroup_rule_id, rule_list)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _test_create_show_delete_security_group_rule(self, **kwargs):"},{"line_number":82,"context_line":"        rule_create_body \u003d self._create_security_group_rule(**kwargs)"},{"line_number":83,"context_line":"        self._show_security_group_rule(rule_create_body)"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_39981c73","line":81,"range":{"start_line":81,"start_character":8,"end_line":81,"end_character":52},"in_reply_to":"5f4e5783_457534f9","updated":"2017-10-17 21:37:02.000000000","message":"This is in base, because it is useful for both positive and negative tests.","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"996b6c65795b40e82d11a0f5e85290dc0f2cc29c","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _test_create_show_delete_security_group_rule(self, **kwargs):"},{"line_number":82,"context_line":"        rule_create_body \u003d self._create_security_group_rule(**kwargs)"},{"line_number":83,"context_line":"        self._show_security_group_rule(rule_create_body)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _test_create_security_group_rule_with_bad_protocols(self, protocols):"},{"line_number":86,"context_line":"        group_create_body, _ \u003d self._create_security_group()"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_c062480a","line":83,"range":{"start_line":83,"start_character":39,"end_line":83,"end_character":55},"updated":"2017-10-17 01:20:29.000000000","message":"nit: I think that it\u0027s better to pass rule_create_body[\u0027security_group_rule\u0027] so that L68 is unnecessary.","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"42e57040775cf5fe78aa8f452209e52a57b3134d","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _test_create_show_delete_security_group_rule(self, **kwargs):"},{"line_number":82,"context_line":"        rule_create_body \u003d self._create_security_group_rule(**kwargs)"},{"line_number":83,"context_line":"        self._show_security_group_rule(rule_create_body)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _test_create_security_group_rule_with_bad_protocols(self, protocols):"},{"line_number":86,"context_line":"        group_create_body, _ \u003d self._create_security_group()"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_213462dd","line":83,"range":{"start_line":83,"start_character":39,"end_line":83,"end_character":55},"in_reply_to":"5f4e5783_c062480a","updated":"2017-10-17 21:37:02.000000000","message":"not necessary anymore.","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"996b6c65795b40e82d11a0f5e85290dc0f2cc29c","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        rule_create_body \u003d self._create_security_group_rule(**kwargs)"},{"line_number":83,"context_line":"        self._show_security_group_rule(rule_create_body)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _test_create_security_group_rule_with_bad_protocols(self, protocols):"},{"line_number":86,"context_line":"        group_create_body, _ \u003d self._create_security_group()"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        # Create rule with bad protocol name"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_23348692","line":85,"range":{"start_line":85,"start_character":4,"end_line":85,"end_character":77},"updated":"2017-10-17 01:20:29.000000000","message":"I think that this method doesn\u0027t suit base because it\u0027s a specific case and it\u0027s not often called. It\u0027s better to move it into test_security_groups_negative.py.","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"42e57040775cf5fe78aa8f452209e52a57b3134d","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        rule_create_body \u003d self._create_security_group_rule(**kwargs)"},{"line_number":83,"context_line":"        self._show_security_group_rule(rule_create_body)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _test_create_security_group_rule_with_bad_protocols(self, protocols):"},{"line_number":86,"context_line":"        group_create_body, _ \u003d self._create_security_group()"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        # Create rule with bad protocol name"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_f9e284d4","line":85,"range":{"start_line":85,"start_character":4,"end_line":85,"end_character":77},"in_reply_to":"5f4e5783_23348692","updated":"2017-10-17 21:37:02.000000000","message":"right, it\u0027s used in negative tests only.","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"820d73b1025dd79873cd1290e0b66b92b9d6d8c0","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class V6Mixin(object):"},{"line_number":29,"context_line":"    V6_LEGACY \u003d set([\u0027icmpv6\u0027])"},{"line_number":30,"context_line":"    V6_NAMES \u003d (set(key for key in constants.IP_PROTOCOL_MAP if \u0027v6\u0027 in key) -"},{"line_number":31,"context_line":"                V6_LEGACY)"},{"line_number":32,"context_line":"    V6_INTS \u003d set(v for k, v in constants.IP_PROTOCOL_MAP.items() if \u0027v6\u0027 in k)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_ad6d7399","line":29,"updated":"2017-10-20 20:19:03.000000000","message":"why this one is \"hardcoded\" here and constant PROTO_NAME_IPV6_ICMP_LEGACY is not used instead?","commit_id":"d9d9770fc8ca548921fa8da2fbacca1aff830dd4"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"919a7bb9c7850b7774185024efac514089d87e77","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class V6Mixin(object):"},{"line_number":29,"context_line":"    V6_LEGACY \u003d set([\u0027icmpv6\u0027])"},{"line_number":30,"context_line":"    V6_NAMES \u003d (set(key for key in constants.IP_PROTOCOL_MAP if \u0027v6\u0027 in key) -"},{"line_number":31,"context_line":"                V6_LEGACY)"},{"line_number":32,"context_line":"    V6_INTS \u003d set(v for k, v in constants.IP_PROTOCOL_MAP.items() if \u0027v6\u0027 in k)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_cd9d4f58","line":29,"in_reply_to":"3f4b6375_ad6d7399","updated":"2017-10-20 21:02:01.000000000","message":"Done","commit_id":"d9d9770fc8ca548921fa8da2fbacca1aff830dd4"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"150937a1b088b21f8a146380704a2384c3ef0141","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from neutron.tests.tempest.api import base"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class V4Mixin(object):"},{"line_number":23,"context_line":"    V4_NAMES \u003d set(key for key in constants.IP_PROTOCOL_MAP if \u0027v6\u0027 not in key)"},{"line_number":24,"context_line":"    V4_INTS \u003d set(v for k, v in constants.IP_PROTOCOL_MAP.items()"},{"line_number":25,"context_line":"                  if \u0027v6\u0027 not in k)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class V6Mixin(object):"},{"line_number":29,"context_line":"    V6_LEGACY \u003d set([constants.PROTO_NAME_IPV6_ICMP_LEGACY])"},{"line_number":30,"context_line":"    V6_NAMES \u003d (set(key for key in constants.IP_PROTOCOL_MAP if \u0027v6\u0027 in key) -"},{"line_number":31,"context_line":"                V6_LEGACY)"},{"line_number":32,"context_line":"    V6_INTS \u003d set(v for k, v in constants.IP_PROTOCOL_MAP.items() if \u0027v6\u0027 in k)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class BaseSecGroupTest(base.BaseNetworkTest):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f4b6375_7a2f1aa1","line":32,"range":{"start_line":22,"start_character":0,"end_line":32,"end_character":79},"updated":"2017-10-23 04:09:19.000000000","message":"Why did you make class to just parepare constant? I think that it\u0027s better to define the constants out of class if Mixin class doesn\u0027t have logic and have just constants.\n\nAnyway, the name is too generic so it\u0027s better to add specific word like \"PROTOCOL\".","commit_id":"dab933d20d4d98ad50a1ea1d8b78025022ca244d"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"0d8ec1b49f05eb69b5b35d0048dd91aa56020e3c","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from neutron.tests.tempest.api import base"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class V4Mixin(object):"},{"line_number":23,"context_line":"    V4_NAMES \u003d set(key for key in constants.IP_PROTOCOL_MAP if \u0027v6\u0027 not in key)"},{"line_number":24,"context_line":"    V4_INTS \u003d set(v for k, v in constants.IP_PROTOCOL_MAP.items()"},{"line_number":25,"context_line":"                  if \u0027v6\u0027 not in k)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class V6Mixin(object):"},{"line_number":29,"context_line":"    V6_LEGACY \u003d set([constants.PROTO_NAME_IPV6_ICMP_LEGACY])"},{"line_number":30,"context_line":"    V6_NAMES \u003d (set(key for key in constants.IP_PROTOCOL_MAP if \u0027v6\u0027 in key) -"},{"line_number":31,"context_line":"                V6_LEGACY)"},{"line_number":32,"context_line":"    V6_INTS \u003d set(v for k, v in constants.IP_PROTOCOL_MAP.items() if \u0027v6\u0027 in k)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class BaseSecGroupTest(base.BaseNetworkTest):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f4b6375_89e72813","line":32,"range":{"start_line":22,"start_character":0,"end_line":32,"end_character":79},"in_reply_to":"3f4b6375_7a2f1aa1","updated":"2017-10-23 14:24:37.000000000","message":"Why? No particular reason. I\u0027ll move them outside the classes.","commit_id":"dab933d20d4d98ad50a1ea1d8b78025022ca244d"}],"neutron/tests/tempest/api/test_security_groups.py":[{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fbf6b2c4365f7a8ea57aeb4b1bcd65b466a4ce7b","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class SecGroupIPv6Test(SecGroupTest):"},{"line_number":90,"context_line":"    _ip_version \u003d 6"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @decorators.idempotent_id(\u00271f7cc9f5-e0d5-487c-8384-3d74060ab530\u0027)"},{"line_number":93,"context_line":"    def test_create_security_group_rule_with_ipv6_protocol_names(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_d442f70e","line":90,"range":{"start_line":90,"start_character":4,"end_line":90,"end_character":19},"updated":"2017-10-17 16:44:03.000000000","message":"do we need this?","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"42e57040775cf5fe78aa8f452209e52a57b3134d","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class SecGroupIPv6Test(SecGroupTest):"},{"line_number":90,"context_line":"    _ip_version \u003d 6"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @decorators.idempotent_id(\u00271f7cc9f5-e0d5-487c-8384-3d74060ab530\u0027)"},{"line_number":93,"context_line":"    def test_create_security_group_rule_with_ipv6_protocol_names(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_d99d880a","line":90,"range":{"start_line":90,"start_character":4,"end_line":90,"end_character":19},"in_reply_to":"5f4e5783_d442f70e","updated":"2017-10-17 21:37:02.000000000","message":"yes. It enforces the following\n1. v4 rules can be created in v6 networks\n2. v6 rules can be created in v6 networks.\nremoving this line causes failures in the 2nd case.","commit_id":"57b96ecd45e0f79e02d28fe3ed5edb9e192c72fc"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"820d73b1025dd79873cd1290e0b66b92b9d6d8c0","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"class SecGroupIPv6Test(SecGroupProtocolTest, base.V6Mixin):"},{"line_number":93,"context_line":"    _ip_version \u003d 6"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @decorators.idempotent_id(\u00271f7cc9f5-e0d5-487c-8384-3d74060ab530\u0027)"},{"line_number":96,"context_line":"    def test_create_security_group_rule_with_ipv6_protocol_names(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_8d687787","line":93,"updated":"2017-10-20 20:19:03.000000000","message":"nit: I think that there is constant for that in neutron-lib: https://github.com/openstack/neutron-lib/blob/master/neutron_lib/constants.py#L87","commit_id":"d9d9770fc8ca548921fa8da2fbacca1aff830dd4"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"919a7bb9c7850b7774185024efac514089d87e77","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"class SecGroupIPv6Test(SecGroupProtocolTest, base.V6Mixin):"},{"line_number":93,"context_line":"    _ip_version \u003d 6"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @decorators.idempotent_id(\u00271f7cc9f5-e0d5-487c-8384-3d74060ab530\u0027)"},{"line_number":96,"context_line":"    def test_create_security_group_rule_with_ipv6_protocol_names(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_784df770","line":93,"in_reply_to":"3f4b6375_8d687787","updated":"2017-10-20 21:02:01.000000000","message":"Done, also got the ingress constant.","commit_id":"d9d9770fc8ca548921fa8da2fbacca1aff830dd4"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"820d73b1025dd79873cd1290e0b66b92b9d6d8c0","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    @decorators.idempotent_id(\u00271f7cc9f5-e0d5-487c-8384-3d74060ab530\u0027)"},{"line_number":96,"context_line":"    def test_create_security_group_rule_with_ipv6_protocol_names(self):"},{"line_number":97,"context_line":"        group_create_body, _ \u003d self._create_security_group()"},{"line_number":98,"context_line":"        for protocol in self.V6_LEGACY:"},{"line_number":99,"context_line":"            self._test_create_show_delete_security_group_rule("},{"line_number":100,"context_line":"                security_group_id\u003dgroup_create_body[\u0027security_group\u0027][\u0027id\u0027],"},{"line_number":101,"context_line":"                protocol\u003dprotocol,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_6d053bc2","line":98,"updated":"2017-10-20 20:19:03.000000000","message":"shouldn\u0027t it be \"in self.V6_NAMES\" instead of self.V6_LEGACY here? Now it\u0027s the same test like next one","commit_id":"d9d9770fc8ca548921fa8da2fbacca1aff830dd4"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"919a7bb9c7850b7774185024efac514089d87e77","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    @decorators.idempotent_id(\u00271f7cc9f5-e0d5-487c-8384-3d74060ab530\u0027)"},{"line_number":96,"context_line":"    def test_create_security_group_rule_with_ipv6_protocol_names(self):"},{"line_number":97,"context_line":"        group_create_body, _ \u003d self._create_security_group()"},{"line_number":98,"context_line":"        for protocol in self.V6_LEGACY:"},{"line_number":99,"context_line":"            self._test_create_show_delete_security_group_rule("},{"line_number":100,"context_line":"                security_group_id\u003dgroup_create_body[\u0027security_group\u0027][\u0027id\u0027],"},{"line_number":101,"context_line":"                protocol\u003dprotocol,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_ad9e9360","line":98,"in_reply_to":"3f4b6375_6d053bc2","updated":"2017-10-20 21:02:01.000000000","message":"yeah that is right.","commit_id":"d9d9770fc8ca548921fa8da2fbacca1aff830dd4"}],"neutron/tests/tempest/api/test_security_groups_negative.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"72afabec500adac38e7103ce1e25602963ed9257","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                          sg[\u0027id\u0027], name\u003dTrue)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"class NegativeSecGroupProtocolTest(base.BaseSecGroupTest):"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @decorators.attr(type\u003d[\u0027negative\u0027])"},{"line_number":73,"context_line":"    @decorators.idempotent_id(\u0027cccbb0f3-c273-43ed-b3fc-1efc48833810\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f4e5783_c8f4465e","line":70,"updated":"2017-10-11 02:38:28.000000000","message":"Do you also need _ip_version \u003d 6 here ?","commit_id":"4a746382c9d7bf853cce2a8a734a94ddc442697a"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"8285dec08a7e615328eb63df16ee5d7140103bc4","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                          sg[\u0027id\u0027], name\u003dTrue)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"class NegativeSecGroupProtocolTest(base.BaseSecGroupTest):"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @decorators.attr(type\u003d[\u0027negative\u0027])"},{"line_number":73,"context_line":"    @decorators.idempotent_id(\u0027cccbb0f3-c273-43ed-b3fc-1efc48833810\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f4e5783_06e2c1a0","line":70,"in_reply_to":"5f4e5783_c8f4465e","updated":"2017-10-16 18:40:44.000000000","message":"no because the negative test is testing that v6 protocol rules can not be created when a v4 network type is specified.","commit_id":"4a746382c9d7bf853cce2a8a734a94ddc442697a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"72afabec500adac38e7103ce1e25602963ed9257","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"class NegativeSecGroupIPv6Test(NegativeSecGroupTest):"},{"line_number":84,"context_line":"    _ip_version \u003d 6"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f4e5783_c8c206ea","line":84,"updated":"2017-10-11 02:38:28.000000000","message":"Maybe this class should be above since it logically goes with the NegativeSecGroupTest class","commit_id":"4a746382c9d7bf853cce2a8a734a94ddc442697a"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"8285dec08a7e615328eb63df16ee5d7140103bc4","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"class NegativeSecGroupIPv6Test(NegativeSecGroupTest):"},{"line_number":84,"context_line":"    _ip_version \u003d 6"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f4e5783_e67a05b8","line":84,"in_reply_to":"5f4e5783_c8c206ea","updated":"2017-10-16 18:40:44.000000000","message":"Done","commit_id":"4a746382c9d7bf853cce2a8a734a94ddc442697a"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"11258ec46779d521a273b0ca46a5f482b838784a","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        group_create_body, _ \u003d self._create_security_group()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        # Create rule with bad protocol name"},{"line_number":81,"context_line":"        for protocol in protocols:"},{"line_number":82,"context_line":"            self.assertRaises("},{"line_number":83,"context_line":"                lib_exc.BadRequest,"},{"line_number":84,"context_line":"                self.client.create_security_group_rule,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_3ebbe472","line":81,"updated":"2017-10-21 08:22:30.000000000","message":"Thx :)","commit_id":"d9d9770fc8ca548921fa8da2fbacca1aff830dd4"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"820d73b1025dd79873cd1290e0b66b92b9d6d8c0","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        group_create_body, _ \u003d self._create_security_group()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        # Create rule with bad protocol name"},{"line_number":81,"context_line":"        for protocol in protocols:"},{"line_number":82,"context_line":"            self.assertRaises("},{"line_number":83,"context_line":"                lib_exc.BadRequest,"},{"line_number":84,"context_line":"                self.client.create_security_group_rule,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_4d083fd8","line":81,"updated":"2017-10-20 20:19:03.000000000","message":"sorry if I just don\u0027t understand something but why self.V6_NAMES are \"bad\" protocol names here?\nI suppose that it can be because _ip_version is not set to 6 in this class. If I am right maybe word of comment would be useful here?","commit_id":"d9d9770fc8ca548921fa8da2fbacca1aff830dd4"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"919a7bb9c7850b7774185024efac514089d87e77","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        group_create_body, _ \u003d self._create_security_group()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        # Create rule with bad protocol name"},{"line_number":81,"context_line":"        for protocol in protocols:"},{"line_number":82,"context_line":"            self.assertRaises("},{"line_number":83,"context_line":"                lib_exc.BadRequest,"},{"line_number":84,"context_line":"                self.client.create_security_group_rule,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_cdcaef6c","line":81,"in_reply_to":"3f4b6375_4d083fd8","updated":"2017-10-20 21:02:01.000000000","message":"yeah you are right, _ip_version is not set to 6, I will add a comment.","commit_id":"d9d9770fc8ca548921fa8da2fbacca1aff830dd4"}]}
