)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Nachi Ueno \u003cnachi@nttmcl.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2012-11-15 23:53:44 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Iptables secuirty group implementation for LinuxBridge"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implements bp quantum-security-groups-iptables"},{"line_number":10,"context_line":"- Added firewall driver"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"AAAAMH%2F%2F5oQ%3D","line":7,"updated":"2012-11-16 14:43:35.000000000","message":"typo \u003d\u003e secuirty","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Nachi Ueno \u003cnachi@nttmcl.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2012-11-15 23:53:44 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Iptables secuirty group implementation for LinuxBridge"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implements bp quantum-security-groups-iptables"},{"line_number":10,"context_line":"- Added firewall driver"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"AAAAMH%2F%2F5Tg%3D","line":7,"in_reply_to":"AAAAMH%2F%2F5oQ%3D","updated":"2012-11-16 22:35:48.000000000","message":"Done","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"}],"quantum/agent/firewall.py":[{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"change_message_id":"52d11f5af4718fc1af23dbbcbb82d22e621008b2","unresolved":false,"context_lines":[{"line_number":19,"context_line":"class FirewallDriver(object):"},{"line_number":20,"context_line":"    \"\"\" Firewall Driver base class."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"        Defines methods that any driver providing security groups"},{"line_number":23,"context_line":"        and provider firewall functionality should implement."},{"line_number":24,"context_line":"        Note port attirbute should have information of security group ids and"},{"line_number":25,"context_line":"        security group rules."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F6DA%3D","line":22,"updated":"2012-11-16 05:02:28.000000000","message":"Just for consistency the docstring from this line below should be aligned to the first indent","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":19,"context_line":"class FirewallDriver(object):"},{"line_number":20,"context_line":"    \"\"\" Firewall Driver base class."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"        Defines methods that any driver providing security groups"},{"line_number":23,"context_line":"        and provider firewall functionality should implement."},{"line_number":24,"context_line":"        Note port attirbute should have information of security group ids and"},{"line_number":25,"context_line":"        security group rules."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F56A%3D","line":22,"in_reply_to":"AAAAMH%2F%2F6DA%3D","updated":"2012-11-16 07:31:27.000000000","message":"Done","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"change_message_id":"52d11f5af4718fc1af23dbbcbb82d22e621008b2","unresolved":false,"context_lines":[{"line_number":35,"context_line":"              source_prefix in server side"},{"line_number":36,"context_line":"    \"\"\""},{"line_number":37,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":38,"context_line":"        \"\"\"Prepare filters for the port."},{"line_number":39,"context_line":"        At this point, the port isn\u0027t added to the bridge.\"\"\""},{"line_number":40,"context_line":"        raise NotImplementedError()"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F6C8%3D","line":38,"updated":"2012-11-16 05:02:28.000000000","message":"needs a blank line below this line","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":35,"context_line":"              source_prefix in server side"},{"line_number":36,"context_line":"    \"\"\""},{"line_number":37,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":38,"context_line":"        \"\"\"Prepare filters for the port."},{"line_number":39,"context_line":"        At this point, the port isn\u0027t added to the bridge.\"\"\""},{"line_number":40,"context_line":"        raise NotImplementedError()"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F558%3D","line":38,"in_reply_to":"AAAAMH%2F%2F6C8%3D","updated":"2012-11-16 07:31:27.000000000","message":"Done","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class FirewallDriver(object):"},{"line_number":20,"context_line":"    \"\"\" Firewall Driver base class."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    Defines methods that any driver providing security groups"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F50w%3D","line":19,"updated":"2012-11-16 13:45:01.000000000","message":"Please consider make this class an abstract class using abc.","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class FirewallDriver(object):"},{"line_number":20,"context_line":"    \"\"\" Firewall Driver base class."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    Defines methods that any driver providing security groups"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5TM%3D","line":19,"in_reply_to":"AAAAMH%2F%2F50w%3D","updated":"2012-11-16 22:35:48.000000000","message":"Done","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    Defines methods that any driver providing security groups"},{"line_number":25,"context_line":"    and provider firewall functionality should implement."},{"line_number":26,"context_line":"    Note port attirbute should have information of security group ids and"},{"line_number":27,"context_line":"    security group rules."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    the dict of port should have"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3p4%3D","line":26,"updated":"2012-11-19 14:47:11.000000000","message":"attirbute \u003d\u003e attributes","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    Defines methods that any driver providing security groups"},{"line_number":25,"context_line":"    and provider firewall functionality should implement."},{"line_number":26,"context_line":"    Note port attirbute should have information of security group ids and"},{"line_number":27,"context_line":"    security group rules."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    the dict of port should have"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3AQ%3D","line":26,"in_reply_to":"AAAAMH%2F%2F3p4%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":67,"context_line":"        \"\"\"Stop filtering port\"\"\""},{"line_number":68,"context_line":"        raise NotImplementedError()"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def filter_defer_apply_on(self):"},{"line_number":71,"context_line":"        \"\"\"Defer application of IPTables rules\"\"\""},{"line_number":72,"context_line":"        pass"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3aM%3D","line":70,"updated":"2012-11-19 19:24:55.000000000","message":"Is this method specific to iptables or more generic one?\nThe docstring mentions iptables only. I feel it is not specific to iptables.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":67,"context_line":"        \"\"\"Stop filtering port\"\"\""},{"line_number":68,"context_line":"        raise NotImplementedError()"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def filter_defer_apply_on(self):"},{"line_number":71,"context_line":"        \"\"\"Defer application of IPTables rules\"\"\""},{"line_number":72,"context_line":"        pass"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3AA%3D","line":70,"in_reply_to":"AAAAMH%2F%2F3aM%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":32,"context_line":"      device_owner: owner of the device"},{"line_number":33,"context_line":"      fixed_ips: ips of the device"},{"line_number":34,"context_line":"      mac_address: mac_address of the device"},{"line_number":35,"context_line":"      security_groups: [sgids, sgids]"},{"line_number":36,"context_line":"      security_group_rules : [ rule, rule ]"},{"line_number":37,"context_line":"      the rule must contain ethertype and direction"},{"line_number":38,"context_line":"      the rule may contain security_group_id,"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAMX%2F%2F50w%3D","line":35,"updated":"2012-12-08 16:58:16.000000000","message":"[sgids, sgids] -\u003e [sgid, sgid]?","commit_id":"0f7dec272c25cb96e85d5afd2b7f9394074ea425"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":32,"context_line":"      device_owner: owner of the device"},{"line_number":33,"context_line":"      fixed_ips: ips of the device"},{"line_number":34,"context_line":"      mac_address: mac_address of the device"},{"line_number":35,"context_line":"      security_groups: [sgids, sgids]"},{"line_number":36,"context_line":"      security_group_rules : [ rule, rule ]"},{"line_number":37,"context_line":"      the rule must contain ethertype and direction"},{"line_number":38,"context_line":"      the rule may contain security_group_id,"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAMX%2F%2F5rg%3D","line":35,"in_reply_to":"AAAAMX%2F%2F50w%3D","updated":"2012-12-09 07:06:44.000000000","message":"Done","commit_id":"0f7dec272c25cb96e85d5afd2b7f9394074ea425"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":33,"context_line":"      fixed_ips: ips of the device"},{"line_number":34,"context_line":"      mac_address: mac_address of the device"},{"line_number":35,"context_line":"      security_groups: [sgid, sgid]"},{"line_number":36,"context_line":"      security_group_rules : [ rule, rule ]"},{"line_number":37,"context_line":"      the rule must contain ethertype and direction"},{"line_number":38,"context_line":"      the rule may contain security_group_id,"},{"line_number":39,"context_line":"          protocol, port_min, port_max"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5j4%3D","line":36,"updated":"2012-12-09 15:49:37.000000000","message":"I can see only security_groups are in port extended in securitygroup.py. Am I missing something?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":33,"context_line":"      fixed_ips: ips of the device"},{"line_number":34,"context_line":"      mac_address: mac_address of the device"},{"line_number":35,"context_line":"      security_groups: [sgid, sgid]"},{"line_number":36,"context_line":"      security_group_rules : [ rule, rule ]"},{"line_number":37,"context_line":"      the rule must contain ethertype and direction"},{"line_number":38,"context_line":"      the rule may contain security_group_id,"},{"line_number":39,"context_line":"          protocol, port_min, port_max"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5eo%3D","line":36,"in_reply_to":"AAAAMX%2F%2F5j4%3D","updated":"2012-12-10 22:54:29.000000000","message":"Yes. This API is internal api, so some param is different from REST API.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":"          source_ip_prefix, source_port_min,"},{"line_number":41,"context_line":"          source_port_max, dest_ip_prefix,"},{"line_number":42,"context_line":"      Note: source_group_id should be converted"},{"line_number":43,"context_line":"          source_prefix in server side"},{"line_number":44,"context_line":"    \"\"\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    __metaclass__ \u003d abc.ABCMeta"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5jg%3D","line":43,"updated":"2012-12-09 15:49:37.000000000","message":"I don\u0027t quite understand the Note: sentence.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":"          source_ip_prefix, source_port_min,"},{"line_number":41,"context_line":"          source_port_max, dest_ip_prefix,"},{"line_number":42,"context_line":"      Note: source_group_id should be converted"},{"line_number":43,"context_line":"          source_prefix in server side"},{"line_number":44,"context_line":"    \"\"\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    __metaclass__ \u003d abc.ABCMeta"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5ek%3D","line":43,"in_reply_to":"AAAAMX%2F%2F5jg%3D","updated":"2012-12-10 22:54:29.000000000","message":"so if 10.0.0.2 and 10.0.0.3 is in security group sg1,  the rule will be converted to source prefix ip rule. (Allow traffic from 10.0.0.2 and 10.0.0.3)","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":49,"context_line":"        \"\"\"Prepare filters for the port."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        At this point, the port isn\u0027t added to the bridge.\"\"\""},{"line_number":52,"context_line":"        raise NotImplementedError()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def apply_port_filter(self, port):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5j0%3D","line":51,"updated":"2012-12-09 15:49:37.000000000","message":"It is a abstract class. So I don\u0027t think we should speak about bridge.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":49,"context_line":"        \"\"\"Prepare filters for the port."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        At this point, the port isn\u0027t added to the bridge.\"\"\""},{"line_number":52,"context_line":"        raise NotImplementedError()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def apply_port_filter(self, port):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5eg%3D","line":51,"in_reply_to":"AAAAMX%2F%2F5j0%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":"          source_ip_prefix, source_port_min,"},{"line_number":41,"context_line":"          source_port_max, dest_ip_prefix,"},{"line_number":42,"context_line":"      Note: source_group_id should be converted"},{"line_number":43,"context_line":"          source_prefix in server side"},{"line_number":44,"context_line":"    \"\"\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    __metaclass__ \u003d abc.ABCMeta"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F1bI%3D","line":43,"updated":"2012-12-13 18:59:05.000000000","message":"This description is still ambiguous. I cannot understand the relationship between direction and source/dest_*. Do they have the same meaning as API-level security groups rules do?","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":"          source_ip_prefix, source_port_min,"},{"line_number":41,"context_line":"          source_port_max, dest_ip_prefix,"},{"line_number":42,"context_line":"      Note: source_group_id should be converted"},{"line_number":43,"context_line":"          source_prefix in server side"},{"line_number":44,"context_line":"    \"\"\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    __metaclass__ \u003d abc.ABCMeta"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0wQ%3D","line":43,"in_reply_to":"AAAAMX%2F%2F1bI%3D","updated":"2012-12-13 23:22:28.000000000","message":"I added more doc","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":49,"context_line":"        \"\"\"Prepare filters for the port."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        At this point, the port isn\u0027t connected.\"\"\""},{"line_number":52,"context_line":"        raise NotImplementedError()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def apply_port_filter(self, port):"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F1bY%3D","line":51,"updated":"2012-12-13 18:59:05.000000000","message":"It is better to describe how the method is used like \"This method should be called before the port is created\".","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":49,"context_line":"        \"\"\"Prepare filters for the port."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        At this point, the port isn\u0027t connected.\"\"\""},{"line_number":52,"context_line":"        raise NotImplementedError()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def apply_port_filter(self, port):"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0wE%3D","line":51,"in_reply_to":"AAAAMX%2F%2F1bY%3D","updated":"2012-12-13 23:22:28.000000000","message":"Done","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        Gets called when an port gets added to or removed from"},{"line_number":68,"context_line":"        the security group the port is a member of or if the"},{"line_number":69,"context_line":"        group gains or looses a rule.\"\"\""},{"line_number":70,"context_line":"        raise NotImplementedError()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def remove_port_filter(self, port):"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F09A%3D","line":69,"updated":"2012-12-13 18:59:05.000000000","message":"Insert a newline before \"\"\". According to Python convention, closing \"\"\" of a docstring with multiple lines should be placed after newline.","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        Gets called when an port gets added to or removed from"},{"line_number":68,"context_line":"        the security group the port is a member of or if the"},{"line_number":69,"context_line":"        group gains or looses a rule.\"\"\""},{"line_number":70,"context_line":"        raise NotImplementedError()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def remove_port_filter(self, port):"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0wA%3D","line":69,"in_reply_to":"AAAAMX%2F%2F09A%3D","updated":"2012-12-13 23:22:28.000000000","message":"Done","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"}],"quantum/agent/linux/iptables_firewall.py":[{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"change_message_id":"52d11f5af4718fc1af23dbbcbb82d22e621008b2","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from quantum.agent.firewall import FirewallDriver"},{"line_number":19,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":"INGRESS_DIRECTION \u003d \u0027ingress\u0027"},{"line_number":23,"context_line":"EGRESS_DIRECTION \u003d \u0027egress\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F6C0%3D","line":20,"updated":"2012-11-16 05:02:28.000000000","message":"according to HACKING there should be two blank lines after the last import","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from quantum.agent.firewall import FirewallDriver"},{"line_number":19,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":"INGRESS_DIRECTION \u003d \u0027ingress\u0027"},{"line_number":23,"context_line":"EGRESS_DIRECTION \u003d \u0027egress\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F554%3D","line":20,"in_reply_to":"AAAAMH%2F%2F6C0%3D","updated":"2012-11-16 07:31:27.000000000","message":"Done","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"change_message_id":"52d11f5af4718fc1af23dbbcbb82d22e621008b2","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        for rule in security_group_rules:"},{"line_number":131,"context_line":"            if rule.get(\u0027ethertype\u0027) \u003d\u003d \u0027IPv4\u0027:"},{"line_number":132,"context_line":"                ipv4_sg.append(rule)"},{"line_number":133,"context_line":"                continue"},{"line_number":134,"context_line":"            if rule.get(\u0027ethertype\u0027) \u003d\u003d \u0027IPv6\u0027:"},{"line_number":135,"context_line":"                if rule.get(\u0027protocol\u0027) \u003d\u003d \u0027icmp\u0027:"},{"line_number":136,"context_line":"                    rule[\u0027protocol\u0027] \u003d \u0027icmpv6\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F6CM%3D","line":133,"updated":"2012-11-16 05:02:28.000000000","message":"Are these continues needed? How about\n\n for ...\n     ethertype \u003d rule.get(\u0027ethertype\u0027)\n     if ethertype \u003d\u003d \u0027IPv4\u0027:\n         ...\n     elif ethertype \u003d\u003d \u0027IPv6\u0027:\n         ...","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        for rule in security_group_rules:"},{"line_number":131,"context_line":"            if rule.get(\u0027ethertype\u0027) \u003d\u003d \u0027IPv4\u0027:"},{"line_number":132,"context_line":"                ipv4_sg.append(rule)"},{"line_number":133,"context_line":"                continue"},{"line_number":134,"context_line":"            if rule.get(\u0027ethertype\u0027) \u003d\u003d \u0027IPv6\u0027:"},{"line_number":135,"context_line":"                if rule.get(\u0027protocol\u0027) \u003d\u003d \u0027icmp\u0027:"},{"line_number":136,"context_line":"                    rule[\u0027protocol\u0027] \u003d \u0027icmpv6\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F550%3D","line":133,"in_reply_to":"AAAAMH%2F%2F6CM%3D","updated":"2012-11-16 07:31:27.000000000","message":"Done","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":14,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":"from quantum.agent.firewall import FirewallDriver"},{"line_number":18,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4Ow%3D","line":16,"updated":"2012-11-18 15:23:54.000000000","message":"new line","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":14,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":"from quantum.agent.firewall import FirewallDriver"},{"line_number":18,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4J0%3D","line":16,"in_reply_to":"AAAAMH%2F%2F4Ow%3D","updated":"2012-11-18 21:54:20.000000000","message":"Done","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":30,"context_line":"class IptablesFirewallDriver(FirewallDriver):"},{"line_number":31,"context_line":"    \"\"\"Driver which enforces security groups through iptables rules.\"\"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def __init__(self, iptables_manager):"},{"line_number":34,"context_line":"        self.iptables \u003d iptables_manager"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        # list of port which has security group"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4Os%3D","line":33,"updated":"2012-11-18 15:23:54.000000000","message":"is this missing an include for iptables?","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":30,"context_line":"class IptablesFirewallDriver(FirewallDriver):"},{"line_number":31,"context_line":"    \"\"\"Driver which enforces security groups through iptables rules.\"\"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def __init__(self, iptables_manager):"},{"line_number":34,"context_line":"        self.iptables \u003d iptables_manager"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        # list of port which has security group"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4J4%3D","line":33,"in_reply_to":"AAAAMH%2F%2F4Os%3D","updated":"2012-11-18 21:54:20.000000000","message":"No need to include iptables here because we get object.","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self._add_fallback_chain_v4v6()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":41,"context_line":"        LOG.debug(_(\"preparing device (%s) filter\") % port[\u0027device\u0027])"},{"line_number":42,"context_line":"        self.filterd_ports[port[\u0027device\u0027]] \u003d port"},{"line_number":43,"context_line":"        # each security group have it own chains"},{"line_number":44,"context_line":"        self._setup_chains(port)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4Oo%3D","line":41,"updated":"2012-11-18 15:23:54.000000000","message":"Consider starting with a capital","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self._add_fallback_chain_v4v6()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":41,"context_line":"        LOG.debug(_(\"preparing device (%s) filter\") % port[\u0027device\u0027])"},{"line_number":42,"context_line":"        self.filterd_ports[port[\u0027device\u0027]] \u003d port"},{"line_number":43,"context_line":"        # each security group have it own chains"},{"line_number":44,"context_line":"        self._setup_chains(port)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4Js%3D","line":41,"in_reply_to":"AAAAMH%2F%2F4Oo%3D","updated":"2012-11-18 21:54:20.000000000","message":"Done","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":55,"context_line":"        self.iptables.apply()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def remove_port_filter(self, port):"},{"line_number":58,"context_line":"        LOG.debug(_(\"removing device (%s) filter\") % port[\u0027device\u0027])"},{"line_number":59,"context_line":"        # remove port from ports"},{"line_number":60,"context_line":"        if self.filterd_ports.pop(port[\u0027device\u0027], None):"},{"line_number":61,"context_line":"            self._remove_chains(port)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4Ok%3D","line":58,"updated":"2012-11-18 15:23:54.000000000","message":"Ditto","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        self.iptables.apply()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def remove_port_filter(self, port):"},{"line_number":58,"context_line":"        LOG.debug(_(\"removing device (%s) filter\") % port[\u0027device\u0027])"},{"line_number":59,"context_line":"        # remove port from ports"},{"line_number":60,"context_line":"        if self.filterd_ports.pop(port[\u0027device\u0027], None):"},{"line_number":61,"context_line":"            self._remove_chains(port)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4Jw%3D","line":58,"in_reply_to":"AAAAMH%2F%2F4Ok%3D","updated":"2012-11-18 21:54:20.000000000","message":"Done","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":35,"context_line":"        self.iptables \u003d iptables_manager"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        # list of port which has security group"},{"line_number":38,"context_line":"        self.filterd_ports \u003d {}"},{"line_number":39,"context_line":"        self._add_fallback_chain_v4v6()"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def prepare_port_filter(self, port):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3ps%3D","line":38,"updated":"2012-11-19 14:47:11.000000000","message":"filterd \u003d\u003e filtered","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":35,"context_line":"        self.iptables \u003d iptables_manager"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        # list of port which has security group"},{"line_number":38,"context_line":"        self.filterd_ports \u003d {}"},{"line_number":39,"context_line":"        self._add_fallback_chain_v4v6()"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def prepare_port_filter(self, port):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F2%2Fs%3D","line":38,"in_reply_to":"AAAAMH%2F%2F3ps%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":42,"context_line":"        LOG.debug(_(\"Preparing device (%s) filter\") % port[\u0027device\u0027])"},{"line_number":43,"context_line":"        self.filterd_ports[port[\u0027device\u0027]] \u003d port"},{"line_number":44,"context_line":"        # each security group have it own chains"},{"line_number":45,"context_line":"        self._setup_chains(port)"},{"line_number":46,"context_line":"        self.iptables.apply()"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3po%3D","line":44,"updated":"2012-11-19 14:47:11.000000000","message":"have \u003d\u003e has","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":42,"context_line":"        LOG.debug(_(\"Preparing device (%s) filter\") % port[\u0027device\u0027])"},{"line_number":43,"context_line":"        self.filterd_ports[port[\u0027device\u0027]] \u003d port"},{"line_number":44,"context_line":"        # each security group have it own chains"},{"line_number":45,"context_line":"        self._setup_chains(port)"},{"line_number":46,"context_line":"        self.iptables.apply()"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F2%2Fk%3D","line":44,"in_reply_to":"AAAAMH%2F%2F3po%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":49,"context_line":"        LOG.debug(_(\"Updating device (%s) filter\") % port[\u0027device\u0027])"},{"line_number":50,"context_line":"        if not port[\u0027device\u0027] in self.filterd_ports:"},{"line_number":51,"context_line":"            LOG.info(_(\u0027Attempted to update port filter which is not \u0027"},{"line_number":52,"context_line":"                     \u0027filtered %r\u0027) % port)"},{"line_number":53,"context_line":"            return"},{"line_number":54,"context_line":"        self._remove_chains(port)"},{"line_number":55,"context_line":"        self._setup_chains(port)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3pk%3D","line":52,"updated":"2012-11-19 14:47:11.000000000","message":"%r? Is this intentional?","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":49,"context_line":"        LOG.debug(_(\"Updating device (%s) filter\") % port[\u0027device\u0027])"},{"line_number":50,"context_line":"        if not port[\u0027device\u0027] in self.filterd_ports:"},{"line_number":51,"context_line":"            LOG.info(_(\u0027Attempted to update port filter which is not \u0027"},{"line_number":52,"context_line":"                     \u0027filtered %r\u0027) % port)"},{"line_number":53,"context_line":"            return"},{"line_number":54,"context_line":"        self._remove_chains(port)"},{"line_number":55,"context_line":"        self._setup_chains(port)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F2%2Fg%3D","line":52,"in_reply_to":"AAAAMH%2F%2F3pk%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self._remove_egress_chain(port)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def _setup_ingress_chain(self, port):"},{"line_number":79,"context_line":"        self._add_chain_and_jump_rule(port, INGRESS_DIRECTION)"},{"line_number":80,"context_line":"        self._add_rule_by_security_group(port, INGRESS_DIRECTION)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _remove_ingress_chain(self, port):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3o8%3D","line":79,"updated":"2012-11-19 14:47:11.000000000","message":"Not really sure i understand the name of the func. should it be jump to rule?","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self._remove_egress_chain(port)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def _setup_ingress_chain(self, port):"},{"line_number":79,"context_line":"        self._add_chain_and_jump_rule(port, INGRESS_DIRECTION)"},{"line_number":80,"context_line":"        self._add_rule_by_security_group(port, INGRESS_DIRECTION)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _remove_ingress_chain(self, port):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F2%2BQ%3D","line":79,"in_reply_to":"AAAAMH%2F%2F3o8%3D","updated":"2012-11-19 23:05:06.000000000","message":"I supposed the name describes the function more. but it looks confusing name for reviewers. so I removed it.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":83,"context_line":"        ingress_chain_name \u003d self._port_chain_name(port, INGRESS_DIRECTION)"},{"line_number":84,"context_line":"        self._remove_chain_by_name_v4v6(ingress_chain_name)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _setup_egress_chain(self, port):"},{"line_number":87,"context_line":"        self._add_chain_and_jump_rule(port, EGRESS_DIRECTION)"},{"line_number":88,"context_line":"        self._add_rule_by_security_group(port, EGRESS_DIRECTION)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3o4%3D","line":86,"updated":"2012-11-19 14:47:11.000000000","message":"Seems to be a duplication of _setup_ingress_chain. Why not just have one function that receives the direction?","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":83,"context_line":"        ingress_chain_name \u003d self._port_chain_name(port, INGRESS_DIRECTION)"},{"line_number":84,"context_line":"        self._remove_chain_by_name_v4v6(ingress_chain_name)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _setup_egress_chain(self, port):"},{"line_number":87,"context_line":"        self._add_chain_and_jump_rule(port, EGRESS_DIRECTION)"},{"line_number":88,"context_line":"        self._add_rule_by_security_group(port, EGRESS_DIRECTION)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F2%2BM%3D","line":86,"in_reply_to":"AAAAMH%2F%2F3o4%3D","updated":"2012-11-19 23:05:06.000000000","message":"I supposed it looks more readable, but It looks I should simplify here.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self._add_chain_and_jump_rule(port, EGRESS_DIRECTION)"},{"line_number":88,"context_line":"        self._add_rule_by_security_group(port, EGRESS_DIRECTION)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def _remove_egress_chain(self, port):"},{"line_number":91,"context_line":"        egress_chain_name \u003d self._port_chain_name(port, EGRESS_DIRECTION)"},{"line_number":92,"context_line":"        self._remove_chain_by_name_v4v6(egress_chain_name)"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3ow%3D","line":90,"updated":"2012-11-19 14:47:11.000000000","message":"Same for _remove_ingress_chain","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self._add_chain_and_jump_rule(port, EGRESS_DIRECTION)"},{"line_number":88,"context_line":"        self._add_rule_by_security_group(port, EGRESS_DIRECTION)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def _remove_egress_chain(self, port):"},{"line_number":91,"context_line":"        egress_chain_name \u003d self._port_chain_name(port, EGRESS_DIRECTION)"},{"line_number":92,"context_line":"        self._remove_chain_by_name_v4v6(egress_chain_name)"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F2%2BI%3D","line":90,"in_reply_to":"AAAAMH%2F%2F3ow%3D","updated":"2012-11-19 23:05:06.000000000","message":"same above","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":133,"context_line":"                ipv4_sg.append(rule)"},{"line_number":134,"context_line":"            elif rule.get(\u0027ethertype\u0027) \u003d\u003d \u0027IPv6\u0027:"},{"line_number":135,"context_line":"                if rule.get(\u0027protocol\u0027) \u003d\u003d \u0027icmp\u0027:"},{"line_number":136,"context_line":"                    rule[\u0027protocol\u0027] \u003d \u0027icmpv6\u0027"},{"line_number":137,"context_line":"                ipv6_sg.append(rule)"},{"line_number":138,"context_line":"        return ipv4_sg, ipv6_sg"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3ok%3D","line":136,"updated":"2012-11-19 14:47:11.000000000","message":"Why is this updated here?","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":133,"context_line":"                ipv4_sg.append(rule)"},{"line_number":134,"context_line":"            elif rule.get(\u0027ethertype\u0027) \u003d\u003d \u0027IPv6\u0027:"},{"line_number":135,"context_line":"                if rule.get(\u0027protocol\u0027) \u003d\u003d \u0027icmp\u0027:"},{"line_number":136,"context_line":"                    rule[\u0027protocol\u0027] \u003d \u0027icmpv6\u0027"},{"line_number":137,"context_line":"                ipv6_sg.append(rule)"},{"line_number":138,"context_line":"        return ipv4_sg, ipv6_sg"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F2%2FY%3D","line":136,"in_reply_to":"AAAAMH%2F%2F3Pg%3D","updated":"2012-11-19 23:05:06.000000000","message":"Thanks Akihito. same intention here.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":133,"context_line":"                ipv4_sg.append(rule)"},{"line_number":134,"context_line":"            elif rule.get(\u0027ethertype\u0027) \u003d\u003d \u0027IPv6\u0027:"},{"line_number":135,"context_line":"                if rule.get(\u0027protocol\u0027) \u003d\u003d \u0027icmp\u0027:"},{"line_number":136,"context_line":"                    rule[\u0027protocol\u0027] \u003d \u0027icmpv6\u0027"},{"line_number":137,"context_line":"                ipv6_sg.append(rule)"},{"line_number":138,"context_line":"        return ipv4_sg, ipv6_sg"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3Pg%3D","line":136,"in_reply_to":"AAAAMH%2F%2F3ok%3D","updated":"2012-11-19 19:24:55.000000000","message":"Do you mean we should convert \u0027icmp\u0027 to \u0027icmpv6\u0027 in more upper layer (ie, security_group db layer)? Currently ICMPv4 and ICMPv6 are both represented as \u0027icmp\u0027 in secgroup db layer, so we need to convert to \u0027icmpv6\u0027 here. It is reasonable for me.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":137,"context_line":"                ipv6_sg.append(rule)"},{"line_number":138,"context_line":"        return ipv4_sg, ipv6_sg"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def _select_sg_by_direction(sefl, port, direction):"},{"line_number":141,"context_line":"        security_group_rules \u003d []"},{"line_number":142,"context_line":"        for rule in port.get(\u0027security_group_rules\u0027, []):"},{"line_number":143,"context_line":"            if rule[\u0027direction\u0027] \u003d\u003d direction:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3og%3D","line":140,"updated":"2012-11-19 14:47:11.000000000","message":"sg \u003d\u003e sgr to be consistent with the above?","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":137,"context_line":"                ipv6_sg.append(rule)"},{"line_number":138,"context_line":"        return ipv4_sg, ipv6_sg"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def _select_sg_by_direction(sefl, port, direction):"},{"line_number":141,"context_line":"        security_group_rules \u003d []"},{"line_number":142,"context_line":"        for rule in port.get(\u0027security_group_rules\u0027, []):"},{"line_number":143,"context_line":"            if rule[\u0027direction\u0027] \u003d\u003d direction:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F2%2FU%3D","line":140,"in_reply_to":"AAAAMH%2F%2F3og%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":148,"context_line":"        chain_name \u003d self._port_chain_name(port, direction)"},{"line_number":149,"context_line":"        # select rules for current direction"},{"line_number":150,"context_line":"        security_group_rules \u003d self._select_sg_by_direction(port, direction)"},{"line_number":151,"context_line":"        # splict groups by version"},{"line_number":152,"context_line":"        ipv4_sg, ipv6_sg \u003d self._split_sgr_by_ethertype(security_group_rules)"},{"line_number":153,"context_line":"        ipv4_iptables_rule \u003d self._convert_sg_to_iptables_rules(ipv4_sg)"},{"line_number":154,"context_line":"        ipv6_iptables_rule \u003d self._convert_sg_to_iptables_rules(ipv6_sg)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3oQ%3D","line":151,"updated":"2012-11-19 14:47:11.000000000","message":"typo - splict\n\nCan you please clarify why we need to split the rules per version?","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":148,"context_line":"        chain_name \u003d self._port_chain_name(port, direction)"},{"line_number":149,"context_line":"        # select rules for current direction"},{"line_number":150,"context_line":"        security_group_rules \u003d self._select_sg_by_direction(port, direction)"},{"line_number":151,"context_line":"        # splict groups by version"},{"line_number":152,"context_line":"        ipv4_sg, ipv6_sg \u003d self._split_sgr_by_ethertype(security_group_rules)"},{"line_number":153,"context_line":"        ipv4_iptables_rule \u003d self._convert_sg_to_iptables_rules(ipv4_sg)"},{"line_number":154,"context_line":"        ipv6_iptables_rule \u003d self._convert_sg_to_iptables_rules(ipv6_sg)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F2%2FI%3D","line":151,"in_reply_to":"AAAAMH%2F%2F3oQ%3D","updated":"2012-11-19 23:05:06.000000000","message":"Because  ipv6 iptables6 command is used for ipv6\nI added the comment","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":156,"context_line":"                                     ipv4_iptables_rule,"},{"line_number":157,"context_line":"                                     ipv6_iptables_rule)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def _convert_sg_to_iptables_rules(self, security_group_rules):"},{"line_number":160,"context_line":"        iptables_rules \u003d self._base_iptables_rules()"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        for rule in security_group_rules:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3oI%3D","line":159,"updated":"2012-11-19 14:47:11.000000000","message":"sg \u003d\u003e sgr","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":156,"context_line":"                                     ipv4_iptables_rule,"},{"line_number":157,"context_line":"                                     ipv6_iptables_rule)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def _convert_sg_to_iptables_rules(self, security_group_rules):"},{"line_number":160,"context_line":"        iptables_rules \u003d self._base_iptables_rules()"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        for rule in security_group_rules:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F2%2B4%3D","line":159,"in_reply_to":"AAAAMH%2F%2F3oI%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":23,"context_line":"INGRESS_DIRECTION \u003d \u0027ingress\u0027"},{"line_number":24,"context_line":"EGRESS_DIRECTION \u003d \u0027egress\u0027"},{"line_number":25,"context_line":"CHAIN_NAME_PREFIX \u003d {INGRESS_DIRECTION: \u0027i\u0027,"},{"line_number":26,"context_line":"                     EGRESS_DIRECTION: \u0027o\u0027}"},{"line_number":27,"context_line":"IPTABLES_DIRECTION \u003d {INGRESS_DIRECTION: \u0027physdev-in\u0027,"},{"line_number":28,"context_line":"                      EGRESS_DIRECTION: \u0027physdev-out\u0027}"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzMQ%3D","line":26,"updated":"2012-11-22 10:05:49.000000000","message":"Silly question - why not \u0027e\u0027?","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":23,"context_line":"INGRESS_DIRECTION \u003d \u0027ingress\u0027"},{"line_number":24,"context_line":"EGRESS_DIRECTION \u003d \u0027egress\u0027"},{"line_number":25,"context_line":"CHAIN_NAME_PREFIX \u003d {INGRESS_DIRECTION: \u0027i\u0027,"},{"line_number":26,"context_line":"                     EGRESS_DIRECTION: \u0027o\u0027}"},{"line_number":27,"context_line":"IPTABLES_DIRECTION \u003d {INGRESS_DIRECTION: \u0027physdev-in\u0027,"},{"line_number":28,"context_line":"                      EGRESS_DIRECTION: \u0027physdev-out\u0027}"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy6g%3D","line":26,"in_reply_to":"AAAAMH%2F%2FzMQ%3D","updated":"2012-11-22 17:39:20.000000000","message":"Because ingress -\u003e in egress -\u003e out in the iptables terminology.","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":25,"context_line":"CHAIN_NAME_PREFIX \u003d {INGRESS_DIRECTION: \u0027i\u0027,"},{"line_number":26,"context_line":"                     EGRESS_DIRECTION: \u0027o\u0027}"},{"line_number":27,"context_line":"IPTABLES_DIRECTION \u003d {INGRESS_DIRECTION: \u0027physdev-in\u0027,"},{"line_number":28,"context_line":"                      EGRESS_DIRECTION: \u0027physdev-out\u0027}"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class IptablesFirewallDriver(FirewallDriver):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzMM%3D","line":28,"updated":"2012-11-22 10:05:49.000000000","message":"Same here for the out?","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":25,"context_line":"CHAIN_NAME_PREFIX \u003d {INGRESS_DIRECTION: \u0027i\u0027,"},{"line_number":26,"context_line":"                     EGRESS_DIRECTION: \u0027o\u0027}"},{"line_number":27,"context_line":"IPTABLES_DIRECTION \u003d {INGRESS_DIRECTION: \u0027physdev-in\u0027,"},{"line_number":28,"context_line":"                      EGRESS_DIRECTION: \u0027physdev-out\u0027}"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class IptablesFirewallDriver(FirewallDriver):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy6U%3D","line":28,"in_reply_to":"AAAAMH%2F%2FzMM%3D","updated":"2012-11-22 17:39:20.000000000","message":"same above","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self._add_fallback_chain_v4v6()"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":42,"context_line":"        LOG.debug(_(\"Preparing device (%s) filter\") % port[\u0027device\u0027])"},{"line_number":43,"context_line":"        self.filtered_ports[port[\u0027device\u0027]] \u003d port"},{"line_number":44,"context_line":"        # each security group has it own chains"},{"line_number":45,"context_line":"        self._setup_chains(port)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzMI%3D","line":42,"updated":"2012-11-22 10:05:49.000000000","message":"Does the same check that is done on line 50 need to be done here?","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self._add_fallback_chain_v4v6()"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":42,"context_line":"        LOG.debug(_(\"Preparing device (%s) filter\") % port[\u0027device\u0027])"},{"line_number":43,"context_line":"        self.filtered_ports[port[\u0027device\u0027]] \u003d port"},{"line_number":44,"context_line":"        # each security group has it own chains"},{"line_number":45,"context_line":"        self._setup_chains(port)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy6Q%3D","line":42,"in_reply_to":"AAAAMH%2F%2FzMI%3D","updated":"2012-11-22 17:39:20.000000000","message":"prepare_port_filter adds new device. so no need to check existing devices.","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":121,"context_line":"        ipv4_sg \u003d []"},{"line_number":122,"context_line":"        ipv6_sg \u003d []"},{"line_number":123,"context_line":"        for rule in security_group_rules:"},{"line_number":124,"context_line":"            if rule.get(\u0027ethertype\u0027) \u003d\u003d \u0027IPv4\u0027:"},{"line_number":125,"context_line":"                ipv4_sg.append(rule)"},{"line_number":126,"context_line":"            elif rule.get(\u0027ethertype\u0027) \u003d\u003d \u0027IPv6\u0027:"},{"line_number":127,"context_line":"                if rule.get(\u0027protocol\u0027) \u003d\u003d \u0027icmp\u0027:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2FyEk%3D","line":124,"updated":"2012-11-25 09:53:57.000000000","message":"You have define defined in https://review.openstack.org/#/c/16210/17/quantum/db/securitygroups_rpc_base.py (line 28). Is it possible to use defines here too?","commit_id":"5fce24277fd0a176c6baa9a0a7c25d1401c3b39c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":121,"context_line":"        ipv4_sg \u003d []"},{"line_number":122,"context_line":"        ipv6_sg \u003d []"},{"line_number":123,"context_line":"        for rule in security_group_rules:"},{"line_number":124,"context_line":"            if rule.get(\u0027ethertype\u0027) \u003d\u003d \u0027IPv4\u0027:"},{"line_number":125,"context_line":"                ipv4_sg.append(rule)"},{"line_number":126,"context_line":"            elif rule.get(\u0027ethertype\u0027) \u003d\u003d \u0027IPv6\u0027:"},{"line_number":127,"context_line":"                if rule.get(\u0027protocol\u0027) \u003d\u003d \u0027icmp\u0027:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2FxIE%3D","line":124,"in_reply_to":"AAAAMH%2F%2FyEk%3D","updated":"2012-11-26 19:51:10.000000000","message":"Done","commit_id":"5fce24277fd0a176c6baa9a0a7c25d1401c3b39c"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":"import netaddr"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from quantum.agent.firewall import FirewallDriver"},{"line_number":20,"context_line":"from quantum.common.constants import (IPv4, IPv6)"},{"line_number":21,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5js%3D","line":19,"updated":"2012-12-09 15:49:37.000000000","message":"We should use module level import.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":"import netaddr"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from quantum.agent.firewall import FirewallDriver"},{"line_number":20,"context_line":"from quantum.common.constants import (IPv4, IPv6)"},{"line_number":21,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4yE%3D","line":19,"in_reply_to":"AAAAMX%2F%2F5js%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":"import netaddr"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from quantum.agent.firewall import FirewallDriver"},{"line_number":20,"context_line":"from quantum.common.constants import (IPv4, IPv6)"},{"line_number":21,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5jw%3D","line":20,"updated":"2012-12-09 15:49:37.000000000","message":"We should use module level import.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":"import netaddr"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from quantum.agent.firewall import FirewallDriver"},{"line_number":20,"context_line":"from quantum.common.constants import (IPv4, IPv6)"},{"line_number":21,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4yA%3D","line":20,"in_reply_to":"AAAAMX%2F%2F5jw%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self._add_fallback_chain_v4v6()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":44,"context_line":"        LOG.debug(_(\"Preparing device (%s) filter\") % port[\u0027device\u0027])"},{"line_number":45,"context_line":"        self.filtered_ports[port[\u0027device\u0027]] \u003d port"},{"line_number":46,"context_line":"        # each security group has it own chains"},{"line_number":47,"context_line":"        self._setup_chains(port)"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5jc%3D","line":44,"updated":"2012-12-09 15:49:37.000000000","message":"We had better use  LOG.debug(_(\"Preparing device (%s) filter\"), port[\u0027device\u0027])\nIt applies to all of the LOG messages.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self._add_fallback_chain_v4v6()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":44,"context_line":"        LOG.debug(_(\"Preparing device (%s) filter\") % port[\u0027device\u0027])"},{"line_number":45,"context_line":"        self.filtered_ports[port[\u0027device\u0027]] \u003d port"},{"line_number":46,"context_line":"        # each security group has it own chains"},{"line_number":47,"context_line":"        self._setup_chains(port)"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4x4%3D","line":44,"in_reply_to":"AAAAMX%2F%2F5jc%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":48,"context_line":"        self.iptables.apply()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def update_port_filter(self, port):"},{"line_number":51,"context_line":"        LOG.debug(_(\"Updating device (%s) filter\") % port[\u0027device\u0027])"},{"line_number":52,"context_line":"        if not port[\u0027device\u0027] in self.filtered_ports:"},{"line_number":53,"context_line":"            LOG.info(_(\u0027Attempted to update port filter which is not \u0027"},{"line_number":54,"context_line":"                     \u0027filtered %s\u0027) % port[\u0027device\u0027])"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4x0%3D","line":51,"updated":"2012-12-10 22:54:29.000000000","message":"ditto","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.iptables.apply()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def remove_port_filter(self, port):"},{"line_number":61,"context_line":"        LOG.debug(_(\"Removing device (%s) filter\") % port[\u0027device\u0027])"},{"line_number":62,"context_line":"        # remove port from ports"},{"line_number":63,"context_line":"        if self.filtered_ports.pop(port[\u0027device\u0027], None):"},{"line_number":64,"context_line":"            self._remove_chains(port)"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4xs%3D","line":61,"updated":"2012-12-10 22:54:29.000000000","message":"ditto","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":65,"context_line":"            self.iptables.apply()"},{"line_number":66,"context_line":"        else:"},{"line_number":67,"context_line":"            LOG.info(_(\u0027Attempted to remove port filter which is not \u0027"},{"line_number":68,"context_line":"                     \u0027filtered %r\u0027) % port)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _setup_chains(self, port):"},{"line_number":71,"context_line":"        # setup ingress and egress chain for a port"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4xg%3D","line":68,"updated":"2012-12-10 22:54:29.000000000","message":"ditto","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def _split_sgr_by_ethertype(self, security_group_rules):"},{"line_number":123,"context_line":"        ipv4_sg \u003d []"},{"line_number":124,"context_line":"        ipv6_sg \u003d []"},{"line_number":125,"context_line":"        for rule in security_group_rules:"},{"line_number":126,"context_line":"            if rule.get(\u0027ethertype\u0027) \u003d\u003d IPv4:"},{"line_number":127,"context_line":"                ipv4_sg.append(rule)"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5jM%3D","line":124,"updated":"2012-12-09 15:49:37.000000000","message":"ipv4_sg -\u003e ipv4_sg_rules?\nipv6_sg -\u003e ipv6_sg_rules?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def _split_sgr_by_ethertype(self, security_group_rules):"},{"line_number":123,"context_line":"        ipv4_sg \u003d []"},{"line_number":124,"context_line":"        ipv6_sg \u003d []"},{"line_number":125,"context_line":"        for rule in security_group_rules:"},{"line_number":126,"context_line":"            if rule.get(\u0027ethertype\u0027) \u003d\u003d IPv4:"},{"line_number":127,"context_line":"                ipv4_sg.append(rule)"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4xc%3D","line":124,"in_reply_to":"AAAAMX%2F%2F5jM%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":131,"context_line":"                ipv6_sg.append(rule)"},{"line_number":132,"context_line":"        return ipv4_sg, ipv6_sg"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _select_sgr_by_direction(sefl, port, direction):"},{"line_number":135,"context_line":"        security_group_rules \u003d []"},{"line_number":136,"context_line":"        for rule in port.get(\u0027security_group_rules\u0027, []):"},{"line_number":137,"context_line":"            if rule[\u0027direction\u0027] \u003d\u003d direction:"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5jk%3D","line":134,"updated":"2012-12-09 15:49:37.000000000","message":"sefl -\u003e self?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":131,"context_line":"                ipv6_sg.append(rule)"},{"line_number":132,"context_line":"        return ipv4_sg, ipv6_sg"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _select_sgr_by_direction(sefl, port, direction):"},{"line_number":135,"context_line":"        security_group_rules \u003d []"},{"line_number":136,"context_line":"        for rule in port.get(\u0027security_group_rules\u0027, []):"},{"line_number":137,"context_line":"            if rule[\u0027direction\u0027] \u003d\u003d direction:"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4xY%3D","line":134,"in_reply_to":"AAAAMX%2F%2F5RU%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":131,"context_line":"                ipv6_sg.append(rule)"},{"line_number":132,"context_line":"        return ipv4_sg, ipv6_sg"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _select_sgr_by_direction(sefl, port, direction):"},{"line_number":135,"context_line":"        security_group_rules \u003d []"},{"line_number":136,"context_line":"        for rule in port.get(\u0027security_group_rules\u0027, []):"},{"line_number":137,"context_line":"            if rule[\u0027direction\u0027] \u003d\u003d direction:"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5RU%3D","line":134,"in_reply_to":"AAAAMX%2F%2F5jk%3D","updated":"2012-12-10 06:54:25.000000000","message":"good catch","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":135,"context_line":"        security_group_rules \u003d []"},{"line_number":136,"context_line":"        for rule in port.get(\u0027security_group_rules\u0027, []):"},{"line_number":137,"context_line":"            if rule[\u0027direction\u0027] \u003d\u003d direction:"},{"line_number":138,"context_line":"                security_group_rules.append(rule)"},{"line_number":139,"context_line":"        return security_group_rules"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def _arp_spoofing_rule(self, port):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5jI%3D","line":138,"updated":"2012-12-09 15:49:37.000000000","message":"return [rule for rule in port.get(\u0027security_group_rules\u0027, []) if rule[\u0027direction\u0027] \u003d\u003d direction]? Please verify it.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":135,"context_line":"        security_group_rules \u003d []"},{"line_number":136,"context_line":"        for rule in port.get(\u0027security_group_rules\u0027, []):"},{"line_number":137,"context_line":"            if rule[\u0027direction\u0027] \u003d\u003d direction:"},{"line_number":138,"context_line":"                security_group_rules.append(rule)"},{"line_number":139,"context_line":"        return security_group_rules"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def _arp_spoofing_rule(self, port):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4xM%3D","line":138,"in_reply_to":"AAAAMX%2F%2F5jI%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":141,"context_line":"    def _arp_spoofing_rule(self, port):"},{"line_number":142,"context_line":"        return [\u0027-m mac ! --mac-source %s -j DROP\u0027 % port[\u0027mac_address\u0027]]"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _ip_spoofing_rule(self, port, ipv4_rule, ipv6_rule):"},{"line_number":145,"context_line":"        ipv4_rule +\u003d [\u0027-p udp --sport 68 --dport 67 -j RETURN\u0027]"},{"line_number":146,"context_line":"        ipv6_rule +\u003d [\u0027-p icmpv6 -j RETURN\u0027]"},{"line_number":147,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5jE%3D","line":144,"updated":"2012-12-09 15:49:37.000000000","message":"ipv4_rule -\u003e ipv4_rules?\nipv6_rule -\u003e ipv6_rules?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":141,"context_line":"    def _arp_spoofing_rule(self, port):"},{"line_number":142,"context_line":"        return [\u0027-m mac ! --mac-source %s -j DROP\u0027 % port[\u0027mac_address\u0027]]"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _ip_spoofing_rule(self, port, ipv4_rule, ipv6_rule):"},{"line_number":145,"context_line":"        ipv4_rule +\u003d [\u0027-p udp --sport 68 --dport 67 -j RETURN\u0027]"},{"line_number":146,"context_line":"        ipv6_rule +\u003d [\u0027-p icmpv6 -j RETURN\u0027]"},{"line_number":147,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4xE%3D","line":144,"in_reply_to":"AAAAMX%2F%2F5jE%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":142,"context_line":"        return [\u0027-m mac ! --mac-source %s -j DROP\u0027 % port[\u0027mac_address\u0027]]"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _ip_spoofing_rule(self, port, ipv4_rule, ipv6_rule):"},{"line_number":145,"context_line":"        ipv4_rule +\u003d [\u0027-p udp --sport 68 --dport 67 -j RETURN\u0027]"},{"line_number":146,"context_line":"        ipv6_rule +\u003d [\u0027-p icmpv6 -j RETURN\u0027]"},{"line_number":147,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":148,"context_line":"            if netaddr.IPAddress(ip).version \u003d\u003d 4:"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5iw%3D","line":145,"updated":"2012-12-09 15:49:37.000000000","message":"why RETURN instead of ACCEPT?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":142,"context_line":"        return [\u0027-m mac ! --mac-source %s -j DROP\u0027 % port[\u0027mac_address\u0027]]"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _ip_spoofing_rule(self, port, ipv4_rule, ipv6_rule):"},{"line_number":145,"context_line":"        ipv4_rule +\u003d [\u0027-p udp --sport 68 --dport 67 -j RETURN\u0027]"},{"line_number":146,"context_line":"        ipv6_rule +\u003d [\u0027-p icmpv6 -j RETURN\u0027]"},{"line_number":147,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":148,"context_line":"            if netaddr.IPAddress(ip).version \u003d\u003d 4:"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4Rs%3D","line":145,"in_reply_to":"AAAAMX%2F%2F4SI%3D","updated":"2012-12-11 05:22:47.000000000","message":"l3-agent also assumes default ALLOW, so I don\u0027t think quantum will work in default DENY config.\nso user can add iptables rule, but he should care the rule didn\u0027t break quantum one.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":142,"context_line":"        return [\u0027-m mac ! --mac-source %s -j DROP\u0027 % port[\u0027mac_address\u0027]]"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _ip_spoofing_rule(self, port, ipv4_rule, ipv6_rule):"},{"line_number":145,"context_line":"        ipv4_rule +\u003d [\u0027-p udp --sport 68 --dport 67 -j RETURN\u0027]"},{"line_number":146,"context_line":"        ipv6_rule +\u003d [\u0027-p icmpv6 -j RETURN\u0027]"},{"line_number":147,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":148,"context_line":"            if netaddr.IPAddress(ip).version \u003d\u003d 4:"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4SI%3D","line":145,"in_reply_to":"AAAAMX%2F%2F4Ss%3D","updated":"2012-12-11 05:06:26.000000000","message":"iptables is in root namespace. What if user wants to open ssh port to access the compute host?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":142,"context_line":"        return [\u0027-m mac ! --mac-source %s -j DROP\u0027 % port[\u0027mac_address\u0027]]"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _ip_spoofing_rule(self, port, ipv4_rule, ipv6_rule):"},{"line_number":145,"context_line":"        ipv4_rule +\u003d [\u0027-p udp --sport 68 --dport 67 -j RETURN\u0027]"},{"line_number":146,"context_line":"        ipv6_rule +\u003d [\u0027-p icmpv6 -j RETURN\u0027]"},{"line_number":147,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":148,"context_line":"            if netaddr.IPAddress(ip).version \u003d\u003d 4:"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4Ss%3D","line":145,"in_reply_to":"AAAAMX%2F%2F4Uw%3D","updated":"2012-12-11 04:47:26.000000000","message":"so let\u0027s say there are VM1 and VM2 is on same host.\nThey have port_vm1, port_vm2 for each.\nWhen a packet comes from port_vm1, \nthe from interface of the packet is port_vm1, the to interface of the packet is port_vm2.\nIn this iptables implementation, I\u0027m using port to mach the packet in order to deal with over-wrapping ips.\nThe packet will match egress rule of port_vm1, and ingress rule of port_vm2.\nIf we accept the packet on egress rule of port_vm1, ingress rule of port_vm2 will be ignored. so I let just RETURN for each rule. \nI don\u0027t think it is needed to be support user who set default policy will be DROP, because the iptables is fully managed by quantum","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":142,"context_line":"        return [\u0027-m mac ! --mac-source %s -j DROP\u0027 % port[\u0027mac_address\u0027]]"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _ip_spoofing_rule(self, port, ipv4_rule, ipv6_rule):"},{"line_number":145,"context_line":"        ipv4_rule +\u003d [\u0027-p udp --sport 68 --dport 67 -j RETURN\u0027]"},{"line_number":146,"context_line":"        ipv6_rule +\u003d [\u0027-p icmpv6 -j RETURN\u0027]"},{"line_number":147,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":148,"context_line":"            if netaddr.IPAddress(ip).version \u003d\u003d 4:"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4Uw%3D","line":145,"in_reply_to":"AAAAMX%2F%2F4wY%3D","updated":"2012-12-11 03:57:14.000000000","message":"I don\u0027t quite understand your explanation. But I think\nWith RETURN, we will decide the fate of the packet according to the main chain\u0027s policy. And In strict deployment, the default policy will be DROP, which will fail our security rules. We can verity it.\n\nIn my google doc, we have:\n-A quantum-linuxbri-otap333bee -p udp -m udp --sport 68 --dport 67 -j RETURN\neven with I have another VM, there will be another chain for it.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":142,"context_line":"        return [\u0027-m mac ! --mac-source %s -j DROP\u0027 % port[\u0027mac_address\u0027]]"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _ip_spoofing_rule(self, port, ipv4_rule, ipv6_rule):"},{"line_number":145,"context_line":"        ipv4_rule +\u003d [\u0027-p udp --sport 68 --dport 67 -j RETURN\u0027]"},{"line_number":146,"context_line":"        ipv6_rule +\u003d [\u0027-p icmpv6 -j RETURN\u0027]"},{"line_number":147,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":148,"context_line":"            if netaddr.IPAddress(ip).version \u003d\u003d 4:"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4wY%3D","line":145,"in_reply_to":"AAAAMX%2F%2F5iw%3D","updated":"2012-12-10 22:54:29.000000000","message":"If two VM is in same machine, one packet may mach egress rule of a VM and ingress rule of the other VM. So we can\u0027t Accept packet just one rule. Instead of that I\u0027m going to RETURN here.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _ip_spoofing_rule(self, port, ipv4_rule, ipv6_rule):"},{"line_number":145,"context_line":"        ipv4_rule +\u003d [\u0027-p udp --sport 68 --dport 67 -j RETURN\u0027]"},{"line_number":146,"context_line":"        ipv6_rule +\u003d [\u0027-p icmpv6 -j RETURN\u0027]"},{"line_number":147,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":148,"context_line":"            if netaddr.IPAddress(ip).version \u003d\u003d 4:"},{"line_number":149,"context_line":"                ipv4_rule +\u003d [\u0027! -s %s -j DROP\u0027 % ip]"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5is%3D","line":146,"updated":"2012-12-09 15:49:37.000000000","message":"ditto","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _ip_spoofing_rule(self, port, ipv4_rule, ipv6_rule):"},{"line_number":145,"context_line":"        ipv4_rule +\u003d [\u0027-p udp --sport 68 --dport 67 -j RETURN\u0027]"},{"line_number":146,"context_line":"        ipv6_rule +\u003d [\u0027-p icmpv6 -j RETURN\u0027]"},{"line_number":147,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":148,"context_line":"            if netaddr.IPAddress(ip).version \u003d\u003d 4:"},{"line_number":149,"context_line":"                ipv4_rule +\u003d [\u0027! -s %s -j DROP\u0027 % ip]"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4wU%3D","line":146,"in_reply_to":"AAAAMX%2F%2F5is%3D","updated":"2012-12-10 22:54:29.000000000","message":"ditto","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":147,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":148,"context_line":"            if netaddr.IPAddress(ip).version \u003d\u003d 4:"},{"line_number":149,"context_line":"                ipv4_rule +\u003d [\u0027! -s %s -j DROP\u0027 % ip]"},{"line_number":150,"context_line":"                continue"},{"line_number":151,"context_line":"            ipv6_rule +\u003d [\u0027! -s %s -j DROP\u0027 % ip]"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def _drop_dhcp_rule(self):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5jA%3D","line":150,"updated":"2012-12-09 15:49:37.000000000","message":"Why use \u0027continue\u0027 instead of \u0027else\u0027?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":147,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":148,"context_line":"            if netaddr.IPAddress(ip).version \u003d\u003d 4:"},{"line_number":149,"context_line":"                ipv4_rule +\u003d [\u0027! -s %s -j DROP\u0027 % ip]"},{"line_number":150,"context_line":"                continue"},{"line_number":151,"context_line":"            ipv6_rule +\u003d [\u0027! -s %s -j DROP\u0027 % ip]"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def _drop_dhcp_rule(self):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4wQ%3D","line":150,"in_reply_to":"AAAAMX%2F%2F5jA%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":150,"context_line":"                continue"},{"line_number":151,"context_line":"            ipv6_rule +\u003d [\u0027! -s %s -j DROP\u0027 % ip]"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def _drop_dhcp_rule(self):"},{"line_number":154,"context_line":"        return [\u0027-p udp --sport 67 --dport 68 -j DROP\u0027]"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def _add_rule_by_security_group(self, port, direction):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5i0%3D","line":153,"updated":"2012-12-09 15:49:37.000000000","message":"Can u add some comments for each rule in this file:\nFor example, the following rule is to prevent the VM as a dhcp server, right?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":160,"context_line":"        # split groups by ip version"},{"line_number":161,"context_line":"        # for ipv4, iptables command is used"},{"line_number":162,"context_line":"        # for ipv6, iptables6 command is used"},{"line_number":163,"context_line":"        ipv4_sg, ipv6_sg \u003d self._split_sgr_by_ethertype(security_group_rules)"},{"line_number":164,"context_line":"        ipv4_iptables_rule \u003d []"},{"line_number":165,"context_line":"        ipv6_iptables_rule \u003d []"},{"line_number":166,"context_line":"        if direction \u003d\u003d EGRESS_DIRECTION:"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5i4%3D","line":163,"updated":"2012-12-09 15:49:37.000000000","message":"ipv4_sg, ipv6_sg -\u003e ipv4_sg_rules, ipv6_sg_rules?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":160,"context_line":"        # split groups by ip version"},{"line_number":161,"context_line":"        # for ipv4, iptables command is used"},{"line_number":162,"context_line":"        # for ipv6, iptables6 command is used"},{"line_number":163,"context_line":"        ipv4_sg, ipv6_sg \u003d self._split_sgr_by_ethertype(security_group_rules)"},{"line_number":164,"context_line":"        ipv4_iptables_rule \u003d []"},{"line_number":165,"context_line":"        ipv6_iptables_rule \u003d []"},{"line_number":166,"context_line":"        if direction \u003d\u003d EGRESS_DIRECTION:"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4wM%3D","line":163,"in_reply_to":"AAAAMX%2F%2F5i4%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":179,"context_line":"    def _convert_sgr_to_iptables_rules(self, security_group_rules):"},{"line_number":180,"context_line":"        iptables_rules \u003d self._base_iptables_rules()"},{"line_number":181,"context_line":"        for rule in security_group_rules:"},{"line_number":182,"context_line":"            args \u003d [\u0027-j RETURN\u0027]"},{"line_number":183,"context_line":"            args +\u003d self._protocol_arg(rule.get(\u0027protocol\u0027))"},{"line_number":184,"context_line":"            args +\u003d self._port_arg(\u0027dport\u0027,"},{"line_number":185,"context_line":"                                   rule.get(\u0027protocol\u0027),"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5ig%3D","line":182,"updated":"2012-12-09 15:49:37.000000000","message":"Why do we use RETURN instead of ACCEPT?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":179,"context_line":"    def _convert_sgr_to_iptables_rules(self, security_group_rules):"},{"line_number":180,"context_line":"        iptables_rules \u003d self._base_iptables_rules()"},{"line_number":181,"context_line":"        for rule in security_group_rules:"},{"line_number":182,"context_line":"            args \u003d [\u0027-j RETURN\u0027]"},{"line_number":183,"context_line":"            args +\u003d self._protocol_arg(rule.get(\u0027protocol\u0027))"},{"line_number":184,"context_line":"            args +\u003d self._port_arg(\u0027dport\u0027,"},{"line_number":185,"context_line":"                                   rule.get(\u0027protocol\u0027),"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4wI%3D","line":182,"in_reply_to":"AAAAMX%2F%2F5ig%3D","updated":"2012-12-10 22:54:29.000000000","message":"ditto","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":195,"context_line":"                                        rule.get(\u0027dest_ip_prefix\u0027))"},{"line_number":196,"context_line":"            iptables_rules +\u003d [\u0027 \u0027.join(args)]"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        iptables_rules +\u003d [\u0027-j $sg-fallback\u0027]"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        return iptables_rules"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5ik%3D","line":198,"updated":"2012-12-09 15:49:37.000000000","message":"Why do we need $ before sg-fallback?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":195,"context_line":"                                        rule.get(\u0027dest_ip_prefix\u0027))"},{"line_number":196,"context_line":"            iptables_rules +\u003d [\u0027 \u0027.join(args)]"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        iptables_rules +\u003d [\u0027-j $sg-fallback\u0027]"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        return iptables_rules"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4wE%3D","line":198,"in_reply_to":"AAAAMX%2F%2F5ik%3D","updated":"2012-12-10 22:54:29.000000000","message":"This is iptables spec. We need to use $ in order to jump chain.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":203,"context_line":"        # Always drop invalid packets"},{"line_number":204,"context_line":"        iptables_rules \u003d [\u0027-m state --state \u0027 \u0027INVALID -j DROP\u0027]"},{"line_number":205,"context_line":"        # Allow established connections"},{"line_number":206,"context_line":"        iptables_rules +\u003d [\u0027-m state --state ESTABLISHED,RELATED -j RETURN\u0027]"},{"line_number":207,"context_line":"        return iptables_rules"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def _protocol_arg(self, protocol):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5ic%3D","line":206,"updated":"2012-12-09 15:49:37.000000000","message":"Why we use RETURN instead of ACCEPT? nova is using ACCEPT.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":203,"context_line":"        # Always drop invalid packets"},{"line_number":204,"context_line":"        iptables_rules \u003d [\u0027-m state --state \u0027 \u0027INVALID -j DROP\u0027]"},{"line_number":205,"context_line":"        # Allow established connections"},{"line_number":206,"context_line":"        iptables_rules +\u003d [\u0027-m state --state ESTABLISHED,RELATED -j RETURN\u0027]"},{"line_number":207,"context_line":"        return iptables_rules"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def _protocol_arg(self, protocol):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4wA%3D","line":206,"in_reply_to":"AAAAMX%2F%2F5ic%3D","updated":"2012-12-10 22:54:29.000000000","message":"Because there are only ingress rule in Nova","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":233,"context_line":"        #Note (nati) make chain name short less than 16"},{"line_number":234,"context_line":"        # ( see comment in iptables_manager )"},{"line_number":235,"context_line":"        return \u0027%s%s\u0027 % (CHAIN_NAME_PREFIX[direction],"},{"line_number":236,"context_line":"                         port[\u0027device\u0027][:9])"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    def filter_defer_apply_on(self):"},{"line_number":239,"context_line":"        self.iptables.defer_apply_on()"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5jQ%3D","line":236,"updated":"2012-12-09 15:49:37.000000000","message":"CHAIN_NAME_PREFIX[direction] is just one at length. So I think we can use more characters of the port[\u0027device\u0027]","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":233,"context_line":"        #Note (nati) make chain name short less than 16"},{"line_number":234,"context_line":"        # ( see comment in iptables_manager )"},{"line_number":235,"context_line":"        return \u0027%s%s\u0027 % (CHAIN_NAME_PREFIX[direction],"},{"line_number":236,"context_line":"                         port[\u0027device\u0027][:9])"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    def filter_defer_apply_on(self):"},{"line_number":239,"context_line":"        self.iptables.defer_apply_on()"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4v8%3D","line":236,"in_reply_to":"AAAAMX%2F%2F5jQ%3D","updated":"2012-12-10 22:54:29.000000000","message":"so max is 28 chars. and we got prefix of \"quantum-linuxbri-\"\nand one char. (19 chars)\nso left is 9 chars.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2531,"name":"Xu Chen","email":"xchenum@gmail.com","username":"xchenum"},"unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def ports(self):"},{"line_number":46,"context_line":"        return self.filtered_ports"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":49,"context_line":"        LOG.debug(_(\"Preparing device (%s) filter\"), port[\u0027device\u0027])"},{"line_number":50,"context_line":"        self._remove_chains()"},{"line_number":51,"context_line":"        self.filtered_ports[port[\u0027device\u0027]] \u003d port"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5k0%3D","line":48,"updated":"2012-12-22 20:05:45.000000000","message":"prepare and update port filter are largely similar, maybe consolidate them into a single function?","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def ports(self):"},{"line_number":46,"context_line":"        return self.filtered_ports"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":49,"context_line":"        LOG.debug(_(\"Preparing device (%s) filter\"), port[\u0027device\u0027])"},{"line_number":50,"context_line":"        self._remove_chains()"},{"line_number":51,"context_line":"        self.filtered_ports[port[\u0027device\u0027]] \u003d port"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5cM%3D","line":48,"in_reply_to":"AAAAM3%2F%2F5k0%3D","updated":"2012-12-23 06:03:46.000000000","message":"it is similar in iptables driver. But it could be different for another driver. so we should separate it here.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0bc18015e3d536f5ee96cde585602c4361768c55","unresolved":false,"context_lines":[{"line_number":201,"context_line":"            self._ip_spoofing_rule(port,"},{"line_number":202,"context_line":"                                   ipv4_iptables_rule,"},{"line_number":203,"context_line":"                                   ipv6_iptables_rule)"},{"line_number":204,"context_line":"            ipv4_iptables_rule +\u003d self._drop_dhcp_rule()"},{"line_number":205,"context_line":"        ipv4_iptables_rule +\u003d self._convert_sgr_to_iptables_rules("},{"line_number":206,"context_line":"            ipv4_sg_rules)"},{"line_number":207,"context_line":"        ipv6_iptables_rule +\u003d self._convert_sgr_to_iptables_rules("}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F45w%3D","line":204,"updated":"2012-12-25 09:10:49.000000000","message":"Why put those default rules in code? Can we put those default rules in db as rules of default security groups?","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":201,"context_line":"            self._ip_spoofing_rule(port,"},{"line_number":202,"context_line":"                                   ipv4_iptables_rule,"},{"line_number":203,"context_line":"                                   ipv6_iptables_rule)"},{"line_number":204,"context_line":"            ipv4_iptables_rule +\u003d self._drop_dhcp_rule()"},{"line_number":205,"context_line":"        ipv4_iptables_rule +\u003d self._convert_sgr_to_iptables_rules("},{"line_number":206,"context_line":"            ipv4_sg_rules)"},{"line_number":207,"context_line":"        ipv6_iptables_rule +\u003d self._convert_sgr_to_iptables_rules("}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4ig%3D","line":204,"in_reply_to":"AAAAM3%2F%2F43I%3D","updated":"2012-12-26 19:15:41.000000000","message":"I agree. however provider rule didn\u0027t suite current security group db model. This patch get bigger now. so I wanna work on this refactoring after this is merged.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0bc18015e3d536f5ee96cde585602c4361768c55","unresolved":false,"context_lines":[{"line_number":201,"context_line":"            self._ip_spoofing_rule(port,"},{"line_number":202,"context_line":"                                   ipv4_iptables_rule,"},{"line_number":203,"context_line":"                                   ipv6_iptables_rule)"},{"line_number":204,"context_line":"            ipv4_iptables_rule +\u003d self._drop_dhcp_rule()"},{"line_number":205,"context_line":"        ipv4_iptables_rule +\u003d self._convert_sgr_to_iptables_rules("},{"line_number":206,"context_line":"            ipv4_sg_rules)"},{"line_number":207,"context_line":"        ipv6_iptables_rule +\u003d self._convert_sgr_to_iptables_rules("}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F43I%3D","line":204,"in_reply_to":"AAAAM3%2F%2F45w%3D","updated":"2012-12-25 14:46:10.000000000","message":"Emm...The db model of security group rule db doesn\u0027t support add such rules as ip spoofing rule and arp spoofing rule.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":14,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":"import netaddr"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from quantum.agent import firewall"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAM3%2F%2F268%3D","line":16,"updated":"2012-12-31 09:42:09.000000000","message":"Please add a new line here","commit_id":"6102cfb2de583b96cd0b6e61c6f479177a43fef5"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":14,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":"import netaddr"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from quantum.agent import firewall"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAM3%2F%2F2xs%3D","line":16,"in_reply_to":"AAAAM3%2F%2F268%3D","updated":"2012-12-31 21:40:16.000000000","message":"Done","commit_id":"6102cfb2de583b96cd0b6e61c6f479177a43fef5"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":268,"context_line":"        # with extra prefix"},{"line_number":269,"context_line":"        # ( see comment in iptables_manager )"},{"line_number":270,"context_line":"        return \u0027%s%s\u0027 % (CHAIN_NAME_PREFIX[direction],"},{"line_number":271,"context_line":"                         port[\u0027device\u0027][:9])"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def filter_defer_apply_on(self):"},{"line_number":274,"context_line":"        self.iptables.defer_apply_on()"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAM3%2F%2F264%3D","line":271,"updated":"2012-12-31 09:42:09.000000000","message":"This is something like:\nquantum-linuxbri-itap5498d1\nThis essentially gives us 6 bytes. Would it be possible to remove the tap and use an additional 3 bytes of the ID (it may reduce the chance of a collision with a port).\nDo we need the prefix \"quantum-linuxbri\"? Can we shorten this to q-lb and then maybe have more of the port id?","commit_id":"6102cfb2de583b96cd0b6e61c6f479177a43fef5"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":268,"context_line":"        # with extra prefix"},{"line_number":269,"context_line":"        # ( see comment in iptables_manager )"},{"line_number":270,"context_line":"        return \u0027%s%s\u0027 % (CHAIN_NAME_PREFIX[direction],"},{"line_number":271,"context_line":"                         port[\u0027device\u0027][:9])"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def filter_defer_apply_on(self):"},{"line_number":274,"context_line":"        self.iptables.defer_apply_on()"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAM3%2F%2F2xk%3D","line":271,"in_reply_to":"AAAAM3%2F%2F264%3D","updated":"2012-12-31 21:40:16.000000000","message":"I removed first 3 bytes.\nfor quantum-linuxbri- part, this is spec in the iptables manager class. ( They are using binary name ). So I wanna keep it here.","commit_id":"6102cfb2de583b96cd0b6e61c6f479177a43fef5"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":77,"context_line":"                     \u0027filtered %r\u0027), port)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _setup_chains(self):"},{"line_number":80,"context_line":"        # setup ingress and egress chain for a port"},{"line_number":81,"context_line":"        self._add_chain_by_name_v4v6(SG_CHAIN)"},{"line_number":82,"context_line":"        for port in self.filtered_ports.values():"},{"line_number":83,"context_line":"            self._setup_chain(port, INGRESS_DIRECTION)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2FyvQ%3D","line":80,"updated":"2013-01-04 22:50:12.000000000","message":"nit doc string instead","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":77,"context_line":"                     \u0027filtered %r\u0027), port)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _setup_chains(self):"},{"line_number":80,"context_line":"        # setup ingress and egress chain for a port"},{"line_number":81,"context_line":"        self._add_chain_by_name_v4v6(SG_CHAIN)"},{"line_number":82,"context_line":"        for port in self.filtered_ports.values():"},{"line_number":83,"context_line":"            self._setup_chain(port, INGRESS_DIRECTION)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx6c%3D","line":80,"in_reply_to":"AAAAM3%2F%2FyvQ%3D","updated":"2013-01-05 07:42:11.000000000","message":"Done","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":86,"context_line":"            self.iptables.ipv6[\u0027filter\u0027].add_rule(SG_CHAIN, \u0027-j ACCEPT\u0027)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _remove_chains(self):"},{"line_number":89,"context_line":"        # setup ingress and egress chain for a port"},{"line_number":90,"context_line":"        for port in self.filtered_ports.values():"},{"line_number":91,"context_line":"            self._remove_chain(port, INGRESS_DIRECTION)"},{"line_number":92,"context_line":"            self._remove_chain(port, EGRESS_DIRECTION)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2FyvY%3D","line":89,"updated":"2013-01-04 22:50:12.000000000","message":"Seems comment is wrong.","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":86,"context_line":"            self.iptables.ipv6[\u0027filter\u0027].add_rule(SG_CHAIN, \u0027-j ACCEPT\u0027)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _remove_chains(self):"},{"line_number":89,"context_line":"        # setup ingress and egress chain for a port"},{"line_number":90,"context_line":"        for port in self.filtered_ports.values():"},{"line_number":91,"context_line":"            self._remove_chain(port, INGRESS_DIRECTION)"},{"line_number":92,"context_line":"            self._remove_chain(port, EGRESS_DIRECTION)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx6Y%3D","line":89,"in_reply_to":"AAAAM3%2F%2FyvY%3D","updated":"2013-01-05 07:42:11.000000000","message":"Done","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":124,"context_line":"            self.iptables.ipv6[\u0027filter\u0027].add_rule(chain_name, rule)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _add_chain(self, port, direction):"},{"line_number":127,"context_line":"        # add new chain"},{"line_number":128,"context_line":"        chain_name \u003d self._port_chain_name(port, direction)"},{"line_number":129,"context_line":"        self._add_chain_by_name_v4v6(chain_name)"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fyu0%3D","line":127,"updated":"2013-01-04 22:50:12.000000000","message":"nit doc string instead or perhaps remove comment since it doesn\u0027t provide anymore information than the function name.","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":124,"context_line":"            self.iptables.ipv6[\u0027filter\u0027].add_rule(chain_name, rule)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _add_chain(self, port, direction):"},{"line_number":127,"context_line":"        # add new chain"},{"line_number":128,"context_line":"        chain_name \u003d self._port_chain_name(port, direction)"},{"line_number":129,"context_line":"        self._add_chain_by_name_v4v6(chain_name)"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx6U%3D","line":127,"in_reply_to":"AAAAM3%2F%2Fyu0%3D","updated":"2013-01-05 07:42:11.000000000","message":"Done","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":128,"context_line":"        chain_name \u003d self._port_chain_name(port, direction)"},{"line_number":129,"context_line":"        self._add_chain_by_name_v4v6(chain_name)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        # Note(nati) jump to the security group chain (SG_CHAIN)"},{"line_number":132,"context_line":"        # This is needed because the packet may much two rule in port"},{"line_number":133,"context_line":"        # if the two port is in the same host"},{"line_number":134,"context_line":"        # We accept the packet at the end of SG_CHAIN."}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fyuc%3D","line":131,"updated":"2013-01-04 22:50:12.000000000","message":"Sorry, I don\u0027t understand this comment. Why is this added twice?","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":128,"context_line":"        chain_name \u003d self._port_chain_name(port, direction)"},{"line_number":129,"context_line":"        self._add_chain_by_name_v4v6(chain_name)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        # Note(nati) jump to the security group chain (SG_CHAIN)"},{"line_number":132,"context_line":"        # This is needed because the packet may much two rule in port"},{"line_number":133,"context_line":"        # if the two port is in the same host"},{"line_number":134,"context_line":"        # We accept the packet at the end of SG_CHAIN."}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx6M%3D","line":131,"in_reply_to":"AAAAM3%2F%2Fyuc%3D","updated":"2013-01-05 07:42:11.000000000","message":"ditto with below comment","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self._add_chain_by_name_v4v6(chain_name)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        # Note(nati) jump to the security group chain (SG_CHAIN)"},{"line_number":132,"context_line":"        # This is needed because the packet may much two rule in port"},{"line_number":133,"context_line":"        # if the two port is in the same host"},{"line_number":134,"context_line":"        # We accept the packet at the end of SG_CHAIN."},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2FyuM%3D","line":132,"updated":"2013-01-04 22:50:12.000000000","message":"nit: please reword may much two rule in port","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self._add_chain_by_name_v4v6(chain_name)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        # Note(nati) jump to the security group chain (SG_CHAIN)"},{"line_number":132,"context_line":"        # This is needed because the packet may much two rule in port"},{"line_number":133,"context_line":"        # if the two port is in the same host"},{"line_number":134,"context_line":"        # We accept the packet at the end of SG_CHAIN."},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx6Q%3D","line":132,"in_reply_to":"AAAAM3%2F%2FyuM%3D","updated":"2013-01-05 07:42:11.000000000","message":"\"Two port\" is OK here.\nCould you take a look https://docs.google.com/presentation/d/1nXzNXKIfCfotdav5BzkceDiOfDypEkvtTfVXCGdq6rY/edit#slide\u003did.g59e93568_2_0 ?","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":168,"context_line":"                for rule in port.get(\u0027security_group_rules\u0027, [])"},{"line_number":169,"context_line":"                if rule[\u0027direction\u0027] \u003d\u003d direction]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def _arp_spoofing_rule(self, port):"},{"line_number":172,"context_line":"        return [\u0027-m mac ! --mac-source %s -j DROP\u0027 % port[\u0027mac_address\u0027]]"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def _ip_spoofing_rule(self, port, ipv4_rules, ipv6_rules):"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2FytA%3D","line":171,"updated":"2013-01-04 22:50:12.000000000","message":"I don\u0027t believe this function actually prevents arp spoofing. It only prevents sending packets with a mac address other than port[\u0027mac_address\u0027].   \n\nJust curious do you need this rule to be installed for things to work?  I\u0027m about to put up a spec for a portsecurity extension and it would probably be better to have this function leverage that extension rather than putting it in here by default. What do you think?","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":168,"context_line":"                for rule in port.get(\u0027security_group_rules\u0027, [])"},{"line_number":169,"context_line":"                if rule[\u0027direction\u0027] \u003d\u003d direction]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def _arp_spoofing_rule(self, port):"},{"line_number":172,"context_line":"        return [\u0027-m mac ! --mac-source %s -j DROP\u0027 % port[\u0027mac_address\u0027]]"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def _ip_spoofing_rule(self, port, ipv4_rules, ipv6_rules):"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx5c%3D","line":171,"in_reply_to":"AAAAM3%2F%2FytA%3D","updated":"2013-01-05 07:42:11.000000000","message":"This way of protection is the same way with nova doing. \nCould you share how to arp spoofing under this rule?\n\nEven if we have port security extension, iptables implementation should be placed in here because of ordering of iptables rule. IMO, Support for port security extension should be different patch.","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":171,"context_line":"    def _arp_spoofing_rule(self, port):"},{"line_number":172,"context_line":"        return [\u0027-m mac ! --mac-source %s -j DROP\u0027 % port[\u0027mac_address\u0027]]"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def _ip_spoofing_rule(self, port, ipv4_rules, ipv6_rules):"},{"line_number":175,"context_line":"        #Note(nati) allow dhcp or RA packet"},{"line_number":176,"context_line":"        ipv4_rules +\u003d [\u0027-p udp --sport 68 --dport 67 -j RETURN\u0027]"},{"line_number":177,"context_line":"        ipv6_rules +\u003d [\u0027-p icmpv6 -j RETURN\u0027]"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fys0%3D","line":174,"updated":"2013-01-04 22:50:12.000000000","message":"Is this actually needed to be called for things to work (just curious)? I think it probably is because otherwise a host could change it\u0027s ip address and then get around a security group rule blocking them from sending. Right?","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":171,"context_line":"    def _arp_spoofing_rule(self, port):"},{"line_number":172,"context_line":"        return [\u0027-m mac ! --mac-source %s -j DROP\u0027 % port[\u0027mac_address\u0027]]"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def _ip_spoofing_rule(self, port, ipv4_rules, ipv6_rules):"},{"line_number":175,"context_line":"        #Note(nati) allow dhcp or RA packet"},{"line_number":176,"context_line":"        ipv4_rules +\u003d [\u0027-p udp --sport 68 --dport 67 -j RETURN\u0027]"},{"line_number":177,"context_line":"        ipv6_rules +\u003d [\u0027-p icmpv6 -j RETURN\u0027]"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx5Y%3D","line":174,"in_reply_to":"AAAAM3%2F%2Fys0%3D","updated":"2013-01-05 07:42:11.000000000","message":"I think it should be same place here because of iptables rule ordering. \nIn this patch, we will update iptables rule when the ip is updated.","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        return iptables_rules"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def _base_iptables_rules(self):"},{"line_number":238,"context_line":"        # Always drop invalid packets"},{"line_number":239,"context_line":"        iptables_rules \u003d [\u0027-m state --state \u0027 \u0027INVALID -j DROP\u0027]"},{"line_number":240,"context_line":"        # Allow established connections"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fysg%3D","line":237,"updated":"2013-01-04 22:50:12.000000000","message":"nit: I don\u0027t think _base_iptables_rules is a good name for this function.  I would probably break this into:\n\ndef _allow_established(self): and def _drop_invalid_packets(self):","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        return iptables_rules"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def _base_iptables_rules(self):"},{"line_number":238,"context_line":"        # Always drop invalid packets"},{"line_number":239,"context_line":"        iptables_rules \u003d [\u0027-m state --state \u0027 \u0027INVALID -j DROP\u0027]"},{"line_number":240,"context_line":"        # Allow established connections"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx5Q%3D","line":237,"in_reply_to":"AAAAM3%2F%2Fysg%3D","updated":"2013-01-05 07:42:11.000000000","message":"Done","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self._remove_chains()"},{"line_number":72,"context_line":"        if self.filtered_ports.pop(port[\u0027device\u0027], None):"},{"line_number":73,"context_line":"            self._setup_chains()"},{"line_number":74,"context_line":"            self.iptables.apply()"},{"line_number":75,"context_line":"        else:"},{"line_number":76,"context_line":"            LOG.info(_(\u0027Attempted to remove port filter which is not \u0027"},{"line_number":77,"context_line":"                     \u0027filtered %r\u0027), port)"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAM3%2F%2FxOU%3D","line":74,"updated":"2013-01-06 18:20:26.000000000","message":"(Question) _remove_chains() seems to remove chains of all ports. Is that right? Don\u0027t we need to _setup_chains() for other ports?","commit_id":"6a4ad8f054e8f02310a848fd8f7d61c575fb71b2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self._remove_chains()"},{"line_number":72,"context_line":"        if self.filtered_ports.pop(port[\u0027device\u0027], None):"},{"line_number":73,"context_line":"            self._setup_chains()"},{"line_number":74,"context_line":"            self.iptables.apply()"},{"line_number":75,"context_line":"        else:"},{"line_number":76,"context_line":"            LOG.info(_(\u0027Attempted to remove port filter which is not \u0027"},{"line_number":77,"context_line":"                     \u0027filtered %r\u0027), port)"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAM3%2F%2FxKo%3D","line":74,"in_reply_to":"AAAAM3%2F%2FxOU%3D","updated":"2013-01-06 20:22:11.000000000","message":"Thanks. remove chains should be only done if we have filterd port information.","commit_id":"6a4ad8f054e8f02310a848fd8f7d61c575fb71b2"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def remove_port_filter(self, port):"},{"line_number":69,"context_line":"        LOG.debug(_(\"Removing device (%s) filter\"), port[\u0027device\u0027])"},{"line_number":70,"context_line":"        self._remove_chains()"},{"line_number":71,"context_line":"        if not self.filtered_ports.pop(port[\u0027device\u0027], None):"},{"line_number":72,"context_line":"            LOG.info(_(\u0027Attempted to remove port filter which is not \u0027"},{"line_number":73,"context_line":"                     \u0027filtered %r\u0027), port)"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAM3%2F%2FxC0%3D","line":70,"updated":"2013-01-07 01:06:07.000000000","message":"If the port is not filtered, can we avoid the iptables operations in this method?","commit_id":"d077fa71c90d6ddd26da8445582f777e39d8b1f1"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def remove_port_filter(self, port):"},{"line_number":69,"context_line":"        LOG.debug(_(\"Removing device (%s) filter\"), port[\u0027device\u0027])"},{"line_number":70,"context_line":"        self._remove_chains()"},{"line_number":71,"context_line":"        if not self.filtered_ports.pop(port[\u0027device\u0027], None):"},{"line_number":72,"context_line":"            LOG.info(_(\u0027Attempted to remove port filter which is not \u0027"},{"line_number":73,"context_line":"                     \u0027filtered %r\u0027), port)"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAM3%2F%2FvnA%3D","line":70,"in_reply_to":"AAAAM3%2F%2FvrA%3D","updated":"2013-01-07 22:50:24.000000000","message":"Sorry. I made misunderstandings here. Fixed in latest patch","commit_id":"d077fa71c90d6ddd26da8445582f777e39d8b1f1"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def remove_port_filter(self, port):"},{"line_number":69,"context_line":"        LOG.debug(_(\"Removing device (%s) filter\"), port[\u0027device\u0027])"},{"line_number":70,"context_line":"        self._remove_chains()"},{"line_number":71,"context_line":"        if not self.filtered_ports.pop(port[\u0027device\u0027], None):"},{"line_number":72,"context_line":"            LOG.info(_(\u0027Attempted to remove port filter which is not \u0027"},{"line_number":73,"context_line":"                     \u0027filtered %r\u0027), port)"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAM3%2F%2FvrA%3D","line":70,"in_reply_to":"AAAAM3%2F%2FwAA%3D","updated":"2013-01-07 22:05:29.000000000","message":"can u explain more? other filters have nothing to do with this port, what is the timing issue?","commit_id":"d077fa71c90d6ddd26da8445582f777e39d8b1f1"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def remove_port_filter(self, port):"},{"line_number":69,"context_line":"        LOG.debug(_(\"Removing device (%s) filter\"), port[\u0027device\u0027])"},{"line_number":70,"context_line":"        self._remove_chains()"},{"line_number":71,"context_line":"        if not self.filtered_ports.pop(port[\u0027device\u0027], None):"},{"line_number":72,"context_line":"            LOG.info(_(\u0027Attempted to remove port filter which is not \u0027"},{"line_number":73,"context_line":"                     \u0027filtered %r\u0027), port)"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAM3%2F%2FwAA%3D","line":70,"in_reply_to":"AAAAM3%2F%2FxC0%3D","updated":"2013-01-07 18:55:25.000000000","message":"There are some timing issue, so we need to update iptables here for ensuring.","commit_id":"d077fa71c90d6ddd26da8445582f777e39d8b1f1"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def _remove_chain_by_name_v4v6(self, chain_name):"},{"line_number":112,"context_line":"        self.iptables.ipv4[\u0027filter\u0027].remove_chain(chain_name,"},{"line_number":113,"context_line":"                                                  enable_warn\u003dFalse)"},{"line_number":114,"context_line":"        self.iptables.ipv6[\u0027filter\u0027].remove_chain(chain_name,"},{"line_number":115,"context_line":"                                                  enable_warn\u003dFalse)"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAM3%2F%2FxCo%3D","line":113,"updated":"2013-01-07 01:06:07.000000000","message":"why do we need enable_warn parameter? I think LOG.warn() can deal with it. If the log is enabling warn, LOG will print the message.","commit_id":"d077fa71c90d6ddd26da8445582f777e39d8b1f1"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def _remove_chain_by_name_v4v6(self, chain_name):"},{"line_number":112,"context_line":"        self.iptables.ipv4[\u0027filter\u0027].remove_chain(chain_name,"},{"line_number":113,"context_line":"                                                  enable_warn\u003dFalse)"},{"line_number":114,"context_line":"        self.iptables.ipv6[\u0027filter\u0027].remove_chain(chain_name,"},{"line_number":115,"context_line":"                                                  enable_warn\u003dFalse)"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAM3%2F%2FwDw%3D","line":113,"in_reply_to":"AAAAM3%2F%2FxCo%3D","updated":"2013-01-07 18:55:25.000000000","message":"Here, I wanna ensure the chain is removed. But if we call this function when the chain is not exist, that one is logged as WARN level. This is confusing for operatorers. so I added this call here.  IMO, LOG.warn() can\u0027t deal this.\nBut current way is not quite readble, so I updated the code","commit_id":"d077fa71c90d6ddd26da8445582f777e39d8b1f1"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":271,"context_line":"        # with extra prefix"},{"line_number":272,"context_line":"        # ( see comment in iptables_manager )"},{"line_number":273,"context_line":"        return \u0027%s%s\u0027 % (CHAIN_NAME_PREFIX[direction],"},{"line_number":274,"context_line":"                         port[\u0027device\u0027][3:12])"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def filter_defer_apply_on(self):"},{"line_number":277,"context_line":"        self.iptables.defer_apply_on()"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAM3%2F%2FxCA%3D","line":274,"updated":"2013-01-07 01:06:07.000000000","message":"quantum-linuxbri-o56bbda6f- we have only 27 chars., I think we should use [3:13], or:\n(\u0027%s%s\u0027 % (CHAIN_NAME_PREFIX[direction],\n                 port[\u0027device\u0027]))[:11]\nI prefer to the latter one.","commit_id":"d077fa71c90d6ddd26da8445582f777e39d8b1f1"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":271,"context_line":"        # with extra prefix"},{"line_number":272,"context_line":"        # ( see comment in iptables_manager )"},{"line_number":273,"context_line":"        return \u0027%s%s\u0027 % (CHAIN_NAME_PREFIX[direction],"},{"line_number":274,"context_line":"                         port[\u0027device\u0027][3:12])"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def filter_defer_apply_on(self):"},{"line_number":277,"context_line":"        self.iptables.defer_apply_on()"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAM3%2F%2FwDg%3D","line":274,"in_reply_to":"AAAAM3%2F%2FxCA%3D","updated":"2013-01-07 18:55:25.000000000","message":"First 3 byte is \"tap\" so we don\u0027t need that. so may be 3:13 is good.","commit_id":"d077fa71c90d6ddd26da8445582f777e39d8b1f1"}],"quantum/agent/linux/iptables_manager.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":271,"context_line":"        self._apply()"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def apply(self):"},{"line_number":274,"context_line":"        if self.iptables_apply_deferred:"},{"line_number":275,"context_line":"            return"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"        self._apply()"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5q0%3D","line":274,"updated":"2012-11-16 13:45:01.000000000","message":"Could you explain how apply_deferred works?","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        self._apply()"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def apply(self):"},{"line_number":274,"context_line":"        if self.iptables_apply_deferred:"},{"line_number":275,"context_line":"            return"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"        self._apply()"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5SE%3D","line":274,"in_reply_to":"AAAAMH%2F%2F5q0%3D","updated":"2012-11-16 22:35:48.000000000","message":"I imported this function from nova.\nso if we call defer_apply_on, iptables manager start stops applying filtering rules for iptables. We can apply all changes using defer_apply_off. \nBy using this funciton, we can decrease the number of actual modification of iptables.","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":270,"context_line":"        self.iptables_apply_deferred \u003d False"},{"line_number":271,"context_line":"        self._apply()"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def apply(self):"},{"line_number":274,"context_line":"        if self.iptables_apply_deferred:"},{"line_number":275,"context_line":"            return"},{"line_number":276,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3oE%3D","line":273,"updated":"2012-11-19 14:47:11.000000000","message":"does save also need to be addressed with the deffered? this may be a silly question. sorry","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":270,"context_line":"        self.iptables_apply_deferred \u003d False"},{"line_number":271,"context_line":"        self._apply()"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def apply(self):"},{"line_number":274,"context_line":"        if self.iptables_apply_deferred:"},{"line_number":275,"context_line":"            return"},{"line_number":276,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F2%2BA%3D","line":273,"in_reply_to":"AAAAMH%2F%2F3oE%3D","updated":"2012-11-19 23:05:06.000000000","message":"Sorry I didn\u0027t get your question here. What\u0027s is save operation?","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":267,"context_line":"        self.iptables_apply_deferred \u003d True"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def defer_apply_off(self):"},{"line_number":270,"context_line":"        self.iptables_apply_deferred \u003d False"},{"line_number":271,"context_line":"        self._apply()"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def apply(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzL4%3D","line":270,"updated":"2012-11-22 10:05:49.000000000","message":"maybe move this to line 272 - if the _apply fails do we want to set the flag?","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":267,"context_line":"        self.iptables_apply_deferred \u003d True"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def defer_apply_off(self):"},{"line_number":270,"context_line":"        self.iptables_apply_deferred \u003d False"},{"line_number":271,"context_line":"        self._apply()"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def apply(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy6M%3D","line":270,"in_reply_to":"AAAAMH%2F%2FzL4%3D","updated":"2012-11-22 17:39:20.000000000","message":"It should be False, because if the flag is false, apply method will apply","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":92,"context_line":"        else:"},{"line_number":93,"context_line":"            self.unwrapped_chains.add(name)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def remove_chain(self, name, wrap\u003dTrue, ensure_delete\u003dFalse):"},{"line_number":96,"context_line":"        \"\"\"Remove named chain."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        This removal \"cascades\". All rule in the chain are removed, as are"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5JE%3D","line":95,"updated":"2012-12-24 16:21:43.000000000","message":"Not sure why we have this new flag - just for the log warning? Can you please clarify?","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":92,"context_line":"        else:"},{"line_number":93,"context_line":"            self.unwrapped_chains.add(name)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def remove_chain(self, name, wrap\u003dTrue, ensure_delete\u003dFalse):"},{"line_number":96,"context_line":"        \"\"\"Remove named chain."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        This removal \"cascades\". All rule in the chain are removed, as are"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4ic%3D","line":95,"in_reply_to":"AAAAM3%2F%2F5JE%3D","updated":"2012-12-26 19:15:41.000000000","message":"Yes. This is just log for warning.\nThis flag is needed when caller want to ensure the chain is deleted.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        new_filter[rules_index:rules_index] \u003d [\u0027:%s - [0:0]\u0027 % (name)"},{"line_number":344,"context_line":"                                               for name in unwrapped_chains]"},{"line_number":345,"context_line":"        #Note(nati) This is needed to ensure same result in test"},{"line_number":346,"context_line":"        chains_list \u003d list(chains)"},{"line_number":347,"context_line":"        chains_list.sort()"},{"line_number":348,"context_line":"        new_filter[rules_index:rules_index] \u003d [\u0027:%s-%s - [0:0]\u0027 %"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5I4%3D","line":345,"updated":"2012-12-24 16:21:43.000000000","message":"I do not think that we should change the code to make sure that the tests work. We should change the tests.\nMaybe you can make use of assertItemsEqual this helps when the order is not predictable.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        new_filter[rules_index:rules_index] \u003d [\u0027:%s - [0:0]\u0027 % (name)"},{"line_number":344,"context_line":"                                               for name in unwrapped_chains]"},{"line_number":345,"context_line":"        #Note(nati) This is needed to ensure same result in test"},{"line_number":346,"context_line":"        chains_list \u003d list(chains)"},{"line_number":347,"context_line":"        chains_list.sort()"},{"line_number":348,"context_line":"        new_filter[rules_index:rules_index] \u003d [\u0027:%s-%s - [0:0]\u0027 %"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4ec%3D","line":345,"in_reply_to":"AAAAM3%2F%2F4g0%3D","updated":"2012-12-26 20:50:50.000000000","message":"I could use regex with Mox. so I removed this modifications.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        new_filter[rules_index:rules_index] \u003d [\u0027:%s - [0:0]\u0027 % (name)"},{"line_number":344,"context_line":"                                               for name in unwrapped_chains]"},{"line_number":345,"context_line":"        #Note(nati) This is needed to ensure same result in test"},{"line_number":346,"context_line":"        chains_list \u003d list(chains)"},{"line_number":347,"context_line":"        chains_list.sort()"},{"line_number":348,"context_line":"        new_filter[rules_index:rules_index] \u003d [\u0027:%s-%s - [0:0]\u0027 %"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4g0%3D","line":345,"in_reply_to":"AAAAM3%2F%2F5I4%3D","updated":"2012-12-26 19:15:41.000000000","message":"I agree with you. but we need to use mox and the mox didn\u0027t support such way. hmm\nI find the way.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":107,"context_line":"            chain_set \u003d self.unwrapped_chains"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        if name not in chain_set:"},{"line_number":110,"context_line":"            if not ensure_delete:"},{"line_number":111,"context_line":"                LOG.warn((\u0027Attempted to remove chain %s which does not exist\u0027),"},{"line_number":112,"context_line":"                         name)"},{"line_number":113,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAM3%2F%2FxOM%3D","line":110,"updated":"2013-01-06 18:20:26.000000000","message":"If ensure_delete flag just controls logging, it is better that the parameter name should be changed to some other name (e.g., enable_warn or something)","commit_id":"6a4ad8f054e8f02310a848fd8f7d61c575fb71b2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":107,"context_line":"            chain_set \u003d self.unwrapped_chains"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        if name not in chain_set:"},{"line_number":110,"context_line":"            if not ensure_delete:"},{"line_number":111,"context_line":"                LOG.warn((\u0027Attempted to remove chain %s which does not exist\u0027),"},{"line_number":112,"context_line":"                         name)"},{"line_number":113,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAM3%2F%2FxKk%3D","line":110,"in_reply_to":"AAAAM3%2F%2FxOM%3D","updated":"2013-01-06 20:22:11.000000000","message":"Done","commit_id":"6a4ad8f054e8f02310a848fd8f7d61c575fb71b2"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":107,"context_line":"            chain_set \u003d self.unwrapped_chains"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        if name not in chain_set:"},{"line_number":110,"context_line":"            if enable_warn:"},{"line_number":111,"context_line":"                LOG.warn((\u0027Attempted to remove chain %s which does not exist\u0027),"},{"line_number":112,"context_line":"                         name)"},{"line_number":113,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAM3%2F%2FxCg%3D","line":110,"updated":"2013-01-07 01:06:07.000000000","message":"I think we should remove the enable_warn parameter.","commit_id":"d077fa71c90d6ddd26da8445582f777e39d8b1f1"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":107,"context_line":"            chain_set \u003d self.unwrapped_chains"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        if name not in chain_set:"},{"line_number":110,"context_line":"            if enable_warn:"},{"line_number":111,"context_line":"                LOG.warn((\u0027Attempted to remove chain %s which does not exist\u0027),"},{"line_number":112,"context_line":"                         name)"},{"line_number":113,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAM3%2F%2FwDI%3D","line":110,"in_reply_to":"AAAAM3%2F%2FxCg%3D","updated":"2013-01-07 18:55:25.000000000","message":"i replied in caller code.","commit_id":"d077fa71c90d6ddd26da8445582f777e39d8b1f1"}],"quantum/agent/securitygroups_rpc.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class SecurityGroupServerRpcApiMixin(object):"},{"line_number":29,"context_line":"    def security_group_rules_for_devices(self, context, devices):"},{"line_number":30,"context_line":"        LOG.debug(_(\"get security group rules \""},{"line_number":31,"context_line":"                    \"for devices via rpc %r\") % devices)"},{"line_number":32,"context_line":"        return self.call(context,"},{"line_number":33,"context_line":"                         self.make_msg(\u0027security_group_rules_for_devices\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3n4%3D","line":30,"updated":"2012-11-19 14:47:11.000000000","message":"Consider starting sentence with capital","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class SecurityGroupServerRpcApiMixin(object):"},{"line_number":29,"context_line":"    def security_group_rules_for_devices(self, context, devices):"},{"line_number":30,"context_line":"        LOG.debug(_(\"get security group rules \""},{"line_number":31,"context_line":"                    \"for devices via rpc %r\") % devices)"},{"line_number":32,"context_line":"        return self.call(context,"},{"line_number":33,"context_line":"                         self.make_msg(\u0027security_group_rules_for_devices\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F298%3D","line":30,"in_reply_to":"AAAAMH%2F%2F3n4%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"9c9b5ccfbdcba4c2749d2cf44f124814e3085ade","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    support in agent implementations."},{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def security_groups_rule_updated(self, context, **kwargs):"},{"line_number":44,"context_line":"        \"\"\" call back for security group rule update"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        :param security_groups: list of updated security_groups"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3FE%3D","line":43,"updated":"2012-11-19 20:54:28.000000000","message":"Pass security_groups over kwargs if security_groups is the only thing that\u0027s going to come in the kwargs.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":"    support in agent implementations."},{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def security_groups_rule_updated(self, context, **kwargs):"},{"line_number":44,"context_line":"        \"\"\" call back for security group rule update"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        :param security_groups: list of updated security_groups"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F290%3D","line":43,"in_reply_to":"AAAAMH%2F%2F3FE%3D","updated":"2012-11-19 23:05:06.000000000","message":"It looks using kwargs for RPC callback is a cording style. IMO, this should be kwargs for future compatibilities.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def security_groups_rule_updated(self, context, **kwargs):"},{"line_number":44,"context_line":"        \"\"\" call back for security group rule update"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        :param security_groups: list of updated security_groups"},{"line_number":47,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3nw%3D","line":44,"updated":"2012-11-19 14:47:11.000000000","message":"call back \u003d\u003e one word","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def security_groups_rule_updated(self, context, **kwargs):"},{"line_number":44,"context_line":"        \"\"\" call back for security group rule update"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        :param security_groups: list of updated security_groups"},{"line_number":47,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F29w%3D","line":44,"in_reply_to":"AAAAMH%2F%2F3nw%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"9c9b5ccfbdcba4c2749d2cf44f124814e3085ade","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        :param security_groups: list of updated security_groups"},{"line_number":47,"context_line":"        \"\"\""},{"line_number":48,"context_line":"        LOG.debug(_(\"security group rule updated on remote\"))"},{"line_number":49,"context_line":"        security_groups \u003d kwargs.get(\u0027security_groups\u0027, [])"},{"line_number":50,"context_line":"        self.agent.security_groups_rule_updated(security_groups)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3Eg%3D","line":48,"updated":"2012-11-19 20:54:28.000000000","message":"nit: consider putting the security groups that were updated in the log message","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        :param security_groups: list of updated security_groups"},{"line_number":47,"context_line":"        \"\"\""},{"line_number":48,"context_line":"        LOG.debug(_(\"security group rule updated on remote\"))"},{"line_number":49,"context_line":"        security_groups \u003d kwargs.get(\u0027security_groups\u0027, [])"},{"line_number":50,"context_line":"        self.agent.security_groups_rule_updated(security_groups)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F29c%3D","line":48,"in_reply_to":"AAAAMH%2F%2F3Eg%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"9c9b5ccfbdcba4c2749d2cf44f124814e3085ade","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        security_groups \u003d kwargs.get(\u0027security_groups\u0027, [])"},{"line_number":50,"context_line":"        self.agent.security_groups_rule_updated(security_groups)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def security_groups_member_updated(self, context, **kwargs):"},{"line_number":53,"context_line":"        \"\"\" call back for security group member update"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param security_groups: list of updated security_groups"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3FA%3D","line":52,"updated":"2012-11-19 20:54:28.000000000","message":"Pass security_groups over kwargs if security_groups is the only thing that\u0027s going to come in the kwargs.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":49,"context_line":"        security_groups \u003d kwargs.get(\u0027security_groups\u0027, [])"},{"line_number":50,"context_line":"        self.agent.security_groups_rule_updated(security_groups)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def security_groups_member_updated(self, context, **kwargs):"},{"line_number":53,"context_line":"        \"\"\" call back for security group member update"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param security_groups: list of updated security_groups"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F29Y%3D","line":52,"in_reply_to":"AAAAMH%2F%2F3FA%3D","updated":"2012-11-19 23:05:06.000000000","message":"same above","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"9c9b5ccfbdcba4c2749d2cf44f124814e3085ade","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param security_groups: list of updated security_groups"},{"line_number":56,"context_line":"        \"\"\""},{"line_number":57,"context_line":"        LOG.debug(_(\"security group member updated on remote\"))"},{"line_number":58,"context_line":"        security_groups \u003d kwargs.get(\u0027security_groups\u0027, [])"},{"line_number":59,"context_line":"        self.agent.security_groups_member_updated(security_groups)"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3Ek%3D","line":57,"updated":"2012-11-19 20:54:28.000000000","message":"nit: consider putting the security groups that were updated in the log message","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param security_groups: list of updated security_groups"},{"line_number":56,"context_line":"        \"\"\""},{"line_number":57,"context_line":"        LOG.debug(_(\"security group member updated on remote\"))"},{"line_number":58,"context_line":"        security_groups \u003d kwargs.get(\u0027security_groups\u0027, [])"},{"line_number":59,"context_line":"        self.agent.security_groups_member_updated(security_groups)"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F29U%3D","line":57,"in_reply_to":"AAAAMH%2F%2F3Ek%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self.firewall \u003d IptablesFirewallDriver(ip_manager)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def prepare_devices_filter(self, device_ids):"},{"line_number":76,"context_line":"        LOG.debug(_(\"filter devies %r\") % device_ids)"},{"line_number":77,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("},{"line_number":78,"context_line":"            self.context, device_ids)"},{"line_number":79,"context_line":"        self.firewall.filter_defer_apply_on()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3ng%3D","line":76,"updated":"2012-11-19 14:47:11.000000000","message":"Typo devies \u003d? devices","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self.firewall \u003d IptablesFirewallDriver(ip_manager)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def prepare_devices_filter(self, device_ids):"},{"line_number":76,"context_line":"        LOG.debug(_(\"filter devies %r\") % device_ids)"},{"line_number":77,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("},{"line_number":78,"context_line":"            self.context, device_ids)"},{"line_number":79,"context_line":"        self.firewall.filter_defer_apply_on()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F29I%3D","line":76,"in_reply_to":"AAAAMH%2F%2F3ng%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":75,"context_line":"    def prepare_devices_filter(self, device_ids):"},{"line_number":76,"context_line":"        LOG.debug(_(\"filter devies %r\") % device_ids)"},{"line_number":77,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("},{"line_number":78,"context_line":"            self.context, device_ids)"},{"line_number":79,"context_line":"        self.firewall.filter_defer_apply_on()"},{"line_number":80,"context_line":"        for device in devices.values():"},{"line_number":81,"context_line":"            if device[\u0027device\u0027] in self.devices.keys():"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3ms%3D","line":78,"updated":"2012-11-19 14:47:11.000000000","message":"Do we need to do anything if the devices is [] or None","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":75,"context_line":"    def prepare_devices_filter(self, device_ids):"},{"line_number":76,"context_line":"        LOG.debug(_(\"filter devies %r\") % device_ids)"},{"line_number":77,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("},{"line_number":78,"context_line":"            self.context, device_ids)"},{"line_number":79,"context_line":"        self.firewall.filter_defer_apply_on()"},{"line_number":80,"context_line":"        for device in devices.values():"},{"line_number":81,"context_line":"            if device[\u0027device\u0027] in self.devices.keys():"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F28o%3D","line":78,"in_reply_to":"AAAAMH%2F%2F3ms%3D","updated":"2012-11-19 23:05:06.000000000","message":"I added return here.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":77,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("},{"line_number":78,"context_line":"            self.context, device_ids)"},{"line_number":79,"context_line":"        self.firewall.filter_defer_apply_on()"},{"line_number":80,"context_line":"        for device in devices.values():"},{"line_number":81,"context_line":"            if device[\u0027device\u0027] in self.devices.keys():"},{"line_number":82,"context_line":"                #Note (nati): device is already filterd"},{"line_number":83,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3nc%3D","line":80,"updated":"2012-11-19 14:47:11.000000000","message":"If there is an exception in this loop will the defer flag remain on?","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":77,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("},{"line_number":78,"context_line":"            self.context, device_ids)"},{"line_number":79,"context_line":"        self.firewall.filter_defer_apply_on()"},{"line_number":80,"context_line":"        for device in devices.values():"},{"line_number":81,"context_line":"            if device[\u0027device\u0027] in self.devices.keys():"},{"line_number":82,"context_line":"                #Note (nati): device is already filterd"},{"line_number":83,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F274%3D","line":80,"in_reply_to":"AAAAMH%2F%2F3nc%3D","updated":"2012-11-19 23:05:06.000000000","message":"I added defer_apply context for firewall.py","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":79,"context_line":"        self.firewall.filter_defer_apply_on()"},{"line_number":80,"context_line":"        for device in devices.values():"},{"line_number":81,"context_line":"            if device[\u0027device\u0027] in self.devices.keys():"},{"line_number":82,"context_line":"                #Note (nati): device is already filterd"},{"line_number":83,"context_line":"                continue"},{"line_number":84,"context_line":"            self.devices[device[\u0027device\u0027]] \u003d device"},{"line_number":85,"context_line":"            self.firewall.prepare_port_filter(device)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3nY%3D","line":82,"updated":"2012-11-19 14:47:11.000000000","message":"Typo - filterd \u003d\u003e filtered","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":79,"context_line":"        self.firewall.filter_defer_apply_on()"},{"line_number":80,"context_line":"        for device in devices.values():"},{"line_number":81,"context_line":"            if device[\u0027device\u0027] in self.devices.keys():"},{"line_number":82,"context_line":"                #Note (nati): device is already filterd"},{"line_number":83,"context_line":"                continue"},{"line_number":84,"context_line":"            self.devices[device[\u0027device\u0027]] \u003d device"},{"line_number":85,"context_line":"            self.firewall.prepare_port_filter(device)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F27w%3D","line":82,"in_reply_to":"AAAAMH%2F%2F3nY%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":86,"context_line":"        self.firewall.filter_defer_apply_off()"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def security_groups_rule_updated(self, security_groups):"},{"line_number":89,"context_line":"        LOG.debug(_(\"security group \""},{"line_number":90,"context_line":"                    \"rule updated %r\") % security_groups)"},{"line_number":91,"context_line":"        #check need update or not"},{"line_number":92,"context_line":"        for device in self.devices.values():"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3nQ%3D","line":89,"updated":"2012-11-19 14:47:11.000000000","message":"Consider starting with a capital","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":86,"context_line":"        self.firewall.filter_defer_apply_off()"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def security_groups_rule_updated(self, security_groups):"},{"line_number":89,"context_line":"        LOG.debug(_(\"security group \""},{"line_number":90,"context_line":"                    \"rule updated %r\") % security_groups)"},{"line_number":91,"context_line":"        #check need update or not"},{"line_number":92,"context_line":"        for device in self.devices.values():"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F27s%3D","line":89,"in_reply_to":"AAAAMH%2F%2F3nQ%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":88,"context_line":"    def security_groups_rule_updated(self, security_groups):"},{"line_number":89,"context_line":"        LOG.debug(_(\"security group \""},{"line_number":90,"context_line":"                    \"rule updated %r\") % security_groups)"},{"line_number":91,"context_line":"        #check need update or not"},{"line_number":92,"context_line":"        for device in self.devices.values():"},{"line_number":93,"context_line":"            for rule in device[\u0027security_group_rules\u0027]:"},{"line_number":94,"context_line":"                if rule.get(\u0027security_group_id\u0027) in security_groups:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3mo%3D","line":91,"updated":"2012-11-19 14:47:11.000000000","message":"self.device is set as {}. If this is not set and this function is called with there be an exception?","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":88,"context_line":"    def security_groups_rule_updated(self, security_groups):"},{"line_number":89,"context_line":"        LOG.debug(_(\"security group \""},{"line_number":90,"context_line":"                    \"rule updated %r\") % security_groups)"},{"line_number":91,"context_line":"        #check need update or not"},{"line_number":92,"context_line":"        for device in self.devices.values():"},{"line_number":93,"context_line":"            for rule in device[\u0027security_group_rules\u0027]:"},{"line_number":94,"context_line":"                if rule.get(\u0027security_group_id\u0027) in security_groups:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F27k%3D","line":91,"in_reply_to":"AAAAMH%2F%2F3mo%3D","updated":"2012-11-19 23:05:06.000000000","message":"It should be set in init_firewall. This is by contract, so IMO no need to check exception here.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":96,"context_line":"                    return"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def security_groups_member_updated(self, security_groups):"},{"line_number":99,"context_line":"        LOG.debug(_(\"security group \""},{"line_number":100,"context_line":"                    \"member updated %r\") % security_groups)"},{"line_number":101,"context_line":"        #check need update or not"},{"line_number":102,"context_line":"        for device in self.devices.values():"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3nM%3D","line":99,"updated":"2012-11-19 14:47:11.000000000","message":"Ditto","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":96,"context_line":"                    return"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def security_groups_member_updated(self, security_groups):"},{"line_number":99,"context_line":"        LOG.debug(_(\"security group \""},{"line_number":100,"context_line":"                    \"member updated %r\") % security_groups)"},{"line_number":101,"context_line":"        #check need update or not"},{"line_number":102,"context_line":"        for device in self.devices.values():"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F27Y%3D","line":99,"in_reply_to":"AAAAMH%2F%2F3nM%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":104,"context_line":"            for rule in device[\u0027security_group_rules\u0027]:"},{"line_number":105,"context_line":"                if rule.get(\u0027source_group_id\u0027) in security_groups:"},{"line_number":106,"context_line":"                    self.refresh_firewall()"},{"line_number":107,"context_line":"                    return"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def remove_devices_filter(self, device_ids):"},{"line_number":110,"context_line":"        LOG.debug(_(\"remove device filter for %r\") % device_ids)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3nI%3D","line":107,"updated":"2012-11-19 14:47:11.000000000","message":"Is the intention here to update only one member? Are they unique?","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":104,"context_line":"            for rule in device[\u0027security_group_rules\u0027]:"},{"line_number":105,"context_line":"                if rule.get(\u0027source_group_id\u0027) in security_groups:"},{"line_number":106,"context_line":"                    self.refresh_firewall()"},{"line_number":107,"context_line":"                    return"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def remove_devices_filter(self, device_ids):"},{"line_number":110,"context_line":"        LOG.debug(_(\"remove device filter for %r\") % device_ids)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F27E%3D","line":107,"in_reply_to":"AAAAMH%2F%2F3nI%3D","updated":"2012-11-19 23:05:06.000000000","message":"If one rule is updated, we will update all rule for simplicity.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":107,"context_line":"                    return"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def remove_devices_filter(self, device_ids):"},{"line_number":110,"context_line":"        LOG.debug(_(\"remove device filter for %r\") % device_ids)"},{"line_number":111,"context_line":"        self.firewall.filter_defer_apply_on()"},{"line_number":112,"context_line":"        for device_id in device_ids:"},{"line_number":113,"context_line":"            device \u003d self.devices.get(device_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3nE%3D","line":110,"updated":"2012-11-19 14:47:11.000000000","message":"Captial","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":107,"context_line":"                    return"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def remove_devices_filter(self, device_ids):"},{"line_number":110,"context_line":"        LOG.debug(_(\"remove device filter for %r\") % device_ids)"},{"line_number":111,"context_line":"        self.firewall.filter_defer_apply_on()"},{"line_number":112,"context_line":"        for device_id in device_ids:"},{"line_number":113,"context_line":"            device \u003d self.devices.get(device_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F27A%3D","line":110,"in_reply_to":"AAAAMH%2F%2F3nE%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def remove_devices_filter(self, device_ids):"},{"line_number":110,"context_line":"        LOG.debug(_(\"remove device filter for %r\") % device_ids)"},{"line_number":111,"context_line":"        self.firewall.filter_defer_apply_on()"},{"line_number":112,"context_line":"        for device_id in device_ids:"},{"line_number":113,"context_line":"            device \u003d self.devices.get(device_id)"},{"line_number":114,"context_line":"            if not device:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3nA%3D","line":111,"updated":"2012-11-19 14:47:11.000000000","message":"Same point here with the deferral.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def remove_devices_filter(self, device_ids):"},{"line_number":110,"context_line":"        LOG.debug(_(\"remove device filter for %r\") % device_ids)"},{"line_number":111,"context_line":"        self.firewall.filter_defer_apply_on()"},{"line_number":112,"context_line":"        for device_id in device_ids:"},{"line_number":113,"context_line":"            device \u003d self.devices.get(device_id)"},{"line_number":114,"context_line":"            if not device:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F268%3D","line":111,"in_reply_to":"AAAAMH%2F%2F3nA%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":121,"context_line":"        LOG.debug(_(\"refresh firewall rules\"))"},{"line_number":122,"context_line":"        device_ids \u003d self.devices.keys()"},{"line_number":123,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("},{"line_number":124,"context_line":"            self.context, device_ids)"},{"line_number":125,"context_line":"        self.firewall.filter_defer_apply_on()"},{"line_number":126,"context_line":"        for device in devices.values():"},{"line_number":127,"context_line":"            LOG.debug(_(\"update port filter for %s\") % device)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3m0%3D","line":124,"updated":"2012-11-19 14:47:11.000000000","message":"if devices is [] or None do we need to continue","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":121,"context_line":"        LOG.debug(_(\"refresh firewall rules\"))"},{"line_number":122,"context_line":"        device_ids \u003d self.devices.keys()"},{"line_number":123,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("},{"line_number":124,"context_line":"            self.context, device_ids)"},{"line_number":125,"context_line":"        self.firewall.filter_defer_apply_on()"},{"line_number":126,"context_line":"        for device in devices.values():"},{"line_number":127,"context_line":"            LOG.debug(_(\"update port filter for %s\") % device)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F26s%3D","line":124,"in_reply_to":"AAAAMH%2F%2F3m0%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":122,"context_line":"        device_ids \u003d self.devices.keys()"},{"line_number":123,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("},{"line_number":124,"context_line":"            self.context, device_ids)"},{"line_number":125,"context_line":"        self.firewall.filter_defer_apply_on()"},{"line_number":126,"context_line":"        for device in devices.values():"},{"line_number":127,"context_line":"            LOG.debug(_(\"update port filter for %s\") % device)"},{"line_number":128,"context_line":"            self.firewall.update_port_filter(device)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3m4%3D","line":125,"updated":"2012-11-19 14:47:11.000000000","message":"Same again.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":122,"context_line":"        device_ids \u003d self.devices.keys()"},{"line_number":123,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("},{"line_number":124,"context_line":"            self.context, device_ids)"},{"line_number":125,"context_line":"        self.firewall.filter_defer_apply_on()"},{"line_number":126,"context_line":"        for device in devices.values():"},{"line_number":127,"context_line":"            LOG.debug(_(\"update port filter for %s\") % device)"},{"line_number":128,"context_line":"            self.firewall.update_port_filter(device)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F264%3D","line":125,"in_reply_to":"AAAAMH%2F%2F3m4%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from quantum.agent.linux.iptables_firewall import IptablesFirewallDriver"},{"line_number":20,"context_line":"from quantum.agent.linux import iptables_manager"},{"line_number":21,"context_line":"from quantum.common import topics"},{"line_number":22,"context_line":"from quantum.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzLs%3D","line":19,"updated":"2012-11-22 10:05:49.000000000","message":"Why import just the class? I have yet to understand what the common practice is :)","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from quantum.agent.linux.iptables_firewall import IptablesFirewallDriver"},{"line_number":20,"context_line":"from quantum.agent.linux import iptables_manager"},{"line_number":21,"context_line":"from quantum.common import topics"},{"line_number":22,"context_line":"from quantum.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy5g%3D","line":19,"in_reply_to":"AAAAMH%2F%2FzLs%3D","updated":"2012-11-22 17:39:20.000000000","message":"I follow the style. Thanks","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class SecurityGroupServerRpcApiMixin(object):"},{"line_number":29,"context_line":"    def security_group_rules_for_devices(self, context, devices):"},{"line_number":30,"context_line":"        LOG.debug(_(\"Get security group rules \""},{"line_number":31,"context_line":"                    \"for devices via rpc %r\") % devices)"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5iQ%3D","line":28,"updated":"2012-12-09 15:49:37.000000000","message":"Can we add a comment just like one in other classes of this file?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class SecurityGroupServerRpcApiMixin(object):"},{"line_number":29,"context_line":"    def security_group_rules_for_devices(self, context, devices):"},{"line_number":30,"context_line":"        LOG.debug(_(\"Get security group rules \""},{"line_number":31,"context_line":"                    \"for devices via rpc %r\") % devices)"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4vs%3D","line":28,"in_reply_to":"AAAAMX%2F%2F5iQ%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":58,"context_line":"        security_groups \u003d kwargs.get(\u0027security_groups\u0027, [])"},{"line_number":59,"context_line":"        LOG.debug(_(\"Security group member updated on remote: %s\")"},{"line_number":60,"context_line":"                  % security_groups)"},{"line_number":61,"context_line":"        self.agent.security_groups_member_updated(security_groups)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class SecurityGroupAgentRpcMixin(object):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5iM%3D","line":61,"updated":"2012-12-09 15:49:37.000000000","message":"They have almost the same arguments, why do we use different methods?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":58,"context_line":"        security_groups \u003d kwargs.get(\u0027security_groups\u0027, [])"},{"line_number":59,"context_line":"        LOG.debug(_(\"Security group member updated on remote: %s\")"},{"line_number":60,"context_line":"                  % security_groups)"},{"line_number":61,"context_line":"        self.agent.security_groups_member_updated(security_groups)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class SecurityGroupAgentRpcMixin(object):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4vw%3D","line":61,"in_reply_to":"AAAAMX%2F%2F5iM%3D","updated":"2012-12-10 22:54:29.000000000","message":"Because there are different event.\nAgnet work differently for each event.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":127,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("},{"line_number":128,"context_line":"            self.context, device_ids)"},{"line_number":129,"context_line":"        with self.firewall.defer_apply():"},{"line_number":130,"context_line":"            for device in devices.values():"},{"line_number":131,"context_line":"                LOG.debug(_(\"Update port filter for %s\") % device)"},{"line_number":132,"context_line":"                self.devices[device[\u0027device\u0027]] \u003d device"},{"line_number":133,"context_line":"                self.firewall.update_port_filter(device)"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5lI%3D","line":130,"updated":"2012-12-09 10:13:21.000000000","message":"(just confirmation) is this a key fix? It makes sense.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":127,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("},{"line_number":128,"context_line":"            self.context, device_ids)"},{"line_number":129,"context_line":"        with self.firewall.defer_apply():"},{"line_number":130,"context_line":"            for device in devices.values():"},{"line_number":131,"context_line":"                LOG.debug(_(\"Update port filter for %s\") % device)"},{"line_number":132,"context_line":"                self.devices[device[\u0027device\u0027]] \u003d device"},{"line_number":133,"context_line":"                self.firewall.update_port_filter(device)"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4vk%3D","line":130,"in_reply_to":"AAAAMX%2F%2F5lI%3D","updated":"2012-12-10 22:54:29.000000000","message":"Yes. this is the fix for updating problem","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":20,"context_line":"from quantum.agent.linux import iptables_manager"},{"line_number":21,"context_line":"from quantum.common import topics"},{"line_number":22,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F22A%3D","line":23,"updated":"2012-12-12 11:48:04.000000000","message":"unnecessary new line here","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":20,"context_line":"from quantum.agent.linux import iptables_manager"},{"line_number":21,"context_line":"from quantum.common import topics"},{"line_number":22,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0v0%3D","line":23,"in_reply_to":"AAAAMX%2F%2F22A%3D","updated":"2012-12-13 23:22:28.000000000","message":"Done","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class SecurityGroupServerRpcApiMixin(object):"},{"line_number":29,"context_line":"    \"\"\"A min-in that enable SecurityGroup support in plugin rpc"},{"line_number":30,"context_line":"    \"\"\""},{"line_number":31,"context_line":"    def security_group_rules_for_devices(self, context, devices):"},{"line_number":32,"context_line":"        LOG.debug(_(\"Get security group rules \""}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F218%3D","line":29,"updated":"2012-12-12 11:48:04.000000000","message":"Min-in - MixIn","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class SecurityGroupServerRpcApiMixin(object):"},{"line_number":29,"context_line":"    \"\"\"A min-in that enable SecurityGroup support in plugin rpc"},{"line_number":30,"context_line":"    \"\"\""},{"line_number":31,"context_line":"    def security_group_rules_for_devices(self, context, devices):"},{"line_number":32,"context_line":"        LOG.debug(_(\"Get security group rules \""}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0v8%3D","line":29,"in_reply_to":"AAAAMX%2F%2F218%3D","updated":"2012-12-13 23:22:28.000000000","message":"Done","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.firewall \u003d iptables_firewall.IptablesFirewallDriver(ip_manager)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def prepare_devices_filter(self, device_ids):"},{"line_number":85,"context_line":"        LOG.info(_(\"Filter devices %s\") % device_ids)"},{"line_number":86,"context_line":"        if not device_ids:"},{"line_number":87,"context_line":"            return"},{"line_number":88,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5Js%3D","line":85,"updated":"2012-12-24 16:21:43.000000000","message":"Do this need to be an info?","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.firewall \u003d iptables_firewall.IptablesFirewallDriver(ip_manager)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def prepare_devices_filter(self, device_ids):"},{"line_number":85,"context_line":"        LOG.info(_(\"Filter devices %s\") % device_ids)"},{"line_number":86,"context_line":"        if not device_ids:"},{"line_number":87,"context_line":"            return"},{"line_number":88,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4hs%3D","line":85,"in_reply_to":"AAAAM3%2F%2F5Js%3D","updated":"2012-12-26 19:15:41.000000000","message":"IMO, security configuration change should be logged as info.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":110,"context_line":"                              [])).intersection("},{"line_number":111,"context_line":"                    set(security_groups)):"},{"line_number":112,"context_line":"                    self.refresh_firewall()"},{"line_number":113,"context_line":"                    return"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def security_groups_provider_updated(self):"},{"line_number":116,"context_line":"        LOG.info(_(\"Provider rule updated\"))"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5Io%3D","line":113,"updated":"2012-12-24 16:21:43.000000000","message":"Seems very similar to the code in line 98.\nIs it possible to have these as a method with a parameter \u0027security_groups\u0027 or \u0027\u0027security_group_source_groups\u0027?","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":110,"context_line":"                              [])).intersection("},{"line_number":111,"context_line":"                    set(security_groups)):"},{"line_number":112,"context_line":"                    self.refresh_firewall()"},{"line_number":113,"context_line":"                    return"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def security_groups_provider_updated(self):"},{"line_number":116,"context_line":"        LOG.info(_(\"Provider rule updated\"))"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4hw%3D","line":113,"in_reply_to":"AAAAM3%2F%2F5Io%3D","updated":"2012-12-26 19:15:41.000000000","message":"Done","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":117,"context_line":"        self.refresh_firewall()"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def remove_devices_filter(self, device_ids):"},{"line_number":120,"context_line":"        LOG.info(_(\"Remove device filter for %r\") % device_ids)"},{"line_number":121,"context_line":"        with self.firewall.defer_apply():"},{"line_number":122,"context_line":"            for device_id in device_ids:"},{"line_number":123,"context_line":"                device \u003d self.firewall.ports[device_id]"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5Jo%3D","line":120,"updated":"2012-12-24 16:21:43.000000000","message":"I saw the following:\nRemove device filter for set([])\n2 questions:\n1. Should the defer be called if the set is empty?\n2. Should this be an info or debug message?","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":117,"context_line":"        self.refresh_firewall()"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def remove_devices_filter(self, device_ids):"},{"line_number":120,"context_line":"        LOG.info(_(\"Remove device filter for %r\") % device_ids)"},{"line_number":121,"context_line":"        with self.firewall.defer_apply():"},{"line_number":122,"context_line":"            for device_id in device_ids:"},{"line_number":123,"context_line":"                device \u003d self.firewall.ports[device_id]"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4ho%3D","line":120,"in_reply_to":"AAAAM3%2F%2F5Jo%3D","updated":"2012-12-26 19:15:41.000000000","message":"1. I added null device_id check.\n2. IMO, security configuration change should be logged as info.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":86,"context_line":"    def prepare_devices_filter(self, device_ids):"},{"line_number":87,"context_line":"        if not device_ids:"},{"line_number":88,"context_line":"            return"},{"line_number":89,"context_line":"        LOG.info(_(\"Filter devices %s\") % device_ids)"},{"line_number":90,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("},{"line_number":91,"context_line":"            self.context, list(device_ids))"},{"line_number":92,"context_line":"        with self.firewall.defer_apply():"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAM3%2F%2F26w%3D","line":89,"updated":"2012-12-31 09:42:09.000000000","message":"Maybe consider:\nPreparing filters for devices: %s","commit_id":"6102cfb2de583b96cd0b6e61c6f479177a43fef5"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":86,"context_line":"    def prepare_devices_filter(self, device_ids):"},{"line_number":87,"context_line":"        if not device_ids:"},{"line_number":88,"context_line":"            return"},{"line_number":89,"context_line":"        LOG.info(_(\"Filter devices %s\") % device_ids)"},{"line_number":90,"context_line":"        devices \u003d self.plugin_rpc.security_group_rules_for_devices("},{"line_number":91,"context_line":"            self.context, list(device_ids))"},{"line_number":92,"context_line":"        with self.firewall.defer_apply():"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAM3%2F%2F2xg%3D","line":89,"in_reply_to":"AAAAM3%2F%2F26w%3D","updated":"2012-12-31 21:40:16.000000000","message":"Done","commit_id":"6102cfb2de583b96cd0b6e61c6f479177a43fef5"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":96,"context_line":"    def security_groups_rule_updated(self, security_groups):"},{"line_number":97,"context_line":"        LOG.info(_(\"Security group \""},{"line_number":98,"context_line":"                   \"rule updated %r\") % security_groups)"},{"line_number":99,"context_line":"        self._security_group_udpated("},{"line_number":100,"context_line":"            security_groups,"},{"line_number":101,"context_line":"            \u0027security_groups\u0027)"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2FysI%3D","line":99,"updated":"2013-01-04 22:50:12.000000000","message":"nit: udpated","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":96,"context_line":"    def security_groups_rule_updated(self, security_groups):"},{"line_number":97,"context_line":"        LOG.info(_(\"Security group \""},{"line_number":98,"context_line":"                   \"rule updated %r\") % security_groups)"},{"line_number":99,"context_line":"        self._security_group_udpated("},{"line_number":100,"context_line":"            security_groups,"},{"line_number":101,"context_line":"            \u0027security_groups\u0027)"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx6E%3D","line":99,"in_reply_to":"AAAAM3%2F%2FysI%3D","updated":"2013-01-05 07:42:11.000000000","message":"Done","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":103,"context_line":"    def security_groups_member_updated(self, security_groups):"},{"line_number":104,"context_line":"        LOG.info(_(\"Security group \""},{"line_number":105,"context_line":"                   \"member updated %r\") % security_groups)"},{"line_number":106,"context_line":"        self._security_group_udpated("},{"line_number":107,"context_line":"            security_groups,"},{"line_number":108,"context_line":"            \u0027security_group_source_groups\u0027)"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fyr8%3D","line":106,"updated":"2013-01-04 22:50:12.000000000","message":"nit udpated","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":103,"context_line":"    def security_groups_member_updated(self, security_groups):"},{"line_number":104,"context_line":"        LOG.info(_(\"Security group \""},{"line_number":105,"context_line":"                   \"member updated %r\") % security_groups)"},{"line_number":106,"context_line":"        self._security_group_udpated("},{"line_number":107,"context_line":"            security_groups,"},{"line_number":108,"context_line":"            \u0027security_group_source_groups\u0027)"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx6A%3D","line":106,"in_reply_to":"AAAAM3%2F%2Fyr8%3D","updated":"2013-01-05 07:42:11.000000000","message":"Done","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":107,"context_line":"            security_groups,"},{"line_number":108,"context_line":"            \u0027security_group_source_groups\u0027)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _security_group_udpated(self, security_groups, attribute):"},{"line_number":111,"context_line":"        #check need update or not"},{"line_number":112,"context_line":"        for device in self.firewall.ports.values():"},{"line_number":113,"context_line":"            if set(device.get(attribute,"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2FysM%3D","line":110,"updated":"2013-01-04 22:50:12.000000000","message":"should this be s/udpated/updated? I see you used udpated when calling this function so it does get called.","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":107,"context_line":"            security_groups,"},{"line_number":108,"context_line":"            \u0027security_group_source_groups\u0027)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _security_group_udpated(self, security_groups, attribute):"},{"line_number":111,"context_line":"        #check need update or not"},{"line_number":112,"context_line":"        for device in self.firewall.ports.values():"},{"line_number":113,"context_line":"            if set(device.get(attribute,"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx58%3D","line":110,"in_reply_to":"AAAAM3%2F%2FysM%3D","updated":"2013-01-05 07:42:11.000000000","message":"my bad... I can\u0027t believe why I made this mistake..","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":30,"context_line":"    \"\"\""},{"line_number":31,"context_line":"    def security_group_rules_for_devices(self, context, devices):"},{"line_number":32,"context_line":"        LOG.debug(_(\"Get security group rules \""},{"line_number":33,"context_line":"                    \"for devices via rpc %r\") % devices)"},{"line_number":34,"context_line":"        return self.call(context,"},{"line_number":35,"context_line":"                         self.make_msg(\u0027security_group_rules_for_devices\u0027,"},{"line_number":36,"context_line":"                                       devices\u003ddevices),"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAM3%2F%2FxCs%3D","line":33,"updated":"2013-01-07 01:06:07.000000000","message":"all of LOG.xxx(), we should use \u0027,\u0027 instead of \u0027%\u0027. please check all occurrences in this patch.","commit_id":"d077fa71c90d6ddd26da8445582f777e39d8b1f1"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":30,"context_line":"    \"\"\""},{"line_number":31,"context_line":"    def security_group_rules_for_devices(self, context, devices):"},{"line_number":32,"context_line":"        LOG.debug(_(\"Get security group rules \""},{"line_number":33,"context_line":"                    \"for devices via rpc %r\") % devices)"},{"line_number":34,"context_line":"        return self.call(context,"},{"line_number":35,"context_line":"                         self.make_msg(\u0027security_group_rules_for_devices\u0027,"},{"line_number":36,"context_line":"                                       devices\u003ddevices),"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAM3%2F%2FwAo%3D","line":33,"in_reply_to":"AAAAM3%2F%2FxCs%3D","updated":"2013-01-07 18:55:25.000000000","message":"Done","commit_id":"d077fa71c90d6ddd26da8445582f777e39d8b1f1"}],"quantum/common/utils.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":167,"context_line":"    return mappings"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"def same_ids(a, b):"},{"line_number":171,"context_line":"    if a is None:"},{"line_number":172,"context_line":"        a \u003d []"},{"line_number":173,"context_line":"    if b is None:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2FyEo%3D","line":170,"updated":"2012-11-25 09:53:57.000000000","message":"Is it possible t change the name of the method to be something more meaningful.","commit_id":"5fce24277fd0a176c6baa9a0a7c25d1401c3b39c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":167,"context_line":"    return mappings"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"def same_ids(a, b):"},{"line_number":171,"context_line":"    if a is None:"},{"line_number":172,"context_line":"        a \u003d []"},{"line_number":173,"context_line":"    if b is None:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2FxHc%3D","line":170,"in_reply_to":"AAAAMH%2F%2FyEo%3D","updated":"2012-11-26 19:51:10.000000000","message":"how about contains_same_entries ?","commit_id":"5fce24277fd0a176c6baa9a0a7c25d1401c3b39c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":167,"context_line":"    return mappings"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"def contains_same_entries(a, b):"},{"line_number":171,"context_line":"    if a is None:"},{"line_number":172,"context_line":"        a \u003d []"},{"line_number":173,"context_line":"    if b is None:"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAMH%2F%2FwVI%3D","line":170,"updated":"2012-11-27 18:23:53.000000000","message":"How about \u0027compare_members\u0027 or \u0027compare_elements\u0027 as a method name?\n\nAdding docstring is helpful since this method compares a member of a and b ignoring its order and duplication.","commit_id":"cea168c442e0fc6e1714de2257bfba92cd16b86c"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":152,"context_line":"    return socket.getfqdn()"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def compare_elements(a, b):"},{"line_number":156,"context_line":"    \"\"\" compare elements if a and b have same elements"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    This method didn\u0027t consider ordering"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5iI%3D","line":155,"updated":"2012-12-09 15:49:37.000000000","message":"compare_elements -\u003e compare_two_lists(aList, bList)","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":152,"context_line":"    return socket.getfqdn()"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def compare_elements(a, b):"},{"line_number":156,"context_line":"    \"\"\" compare elements if a and b have same elements"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    This method didn\u0027t consider ordering"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4u8%3D","line":155,"in_reply_to":"AAAAMX%2F%2F5iI%3D","updated":"2012-12-10 22:54:29.000000000","message":"hmmm I changed this method name 3 times....\nI\u0027m not get much merit of new name..","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":155,"context_line":"def compare_elements(a, b):"},{"line_number":156,"context_line":"    \"\"\" compare elements if a and b have same elements"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    This method didn\u0027t consider ordering"},{"line_number":159,"context_line":"    \"\"\""},{"line_number":160,"context_line":"    if a is None:"},{"line_number":161,"context_line":"        a \u003d []"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F214%3D","line":158,"updated":"2012-12-12 11:48:04.000000000","message":"didn\u0027t \u003d\u003e doesn\u0027t","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":155,"context_line":"def compare_elements(a, b):"},{"line_number":156,"context_line":"    \"\"\" compare elements if a and b have same elements"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    This method didn\u0027t consider ordering"},{"line_number":159,"context_line":"    \"\"\""},{"line_number":160,"context_line":"    if a is None:"},{"line_number":161,"context_line":"        a \u003d []"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0vo%3D","line":158,"in_reply_to":"AAAAMX%2F%2F214%3D","updated":"2012-12-13 23:22:28.000000000","message":"Done","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"}],"quantum/db/dhcp_rpc_base.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":84,"context_line":"                        dhcp_enabled_subnet_ids.remove(fixed_ip[\u0027subnet_id\u0027])"},{"line_number":85,"context_line":"                port[\u0027fixed_ips\u0027].extend("},{"line_number":86,"context_line":"                    [dict(subnet_id\u003ds) for s in dhcp_enabled_subnet_ids])"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"                retval \u003d plugin.update_port(context, port[\u0027id\u0027],"},{"line_number":89,"context_line":"                                            dict(port\u003dport))"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAMX%2F%2F85U%3D","side":"PARENT","line":87,"updated":"2012-12-06 00:24:00.000000000","message":"This is not related to this patch.","commit_id":"ca95ae883d307828dc9d6001c5b5f8e61fdac80a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":83,"context_line":"                    if fixed_ip[\u0027subnet_id\u0027] in dhcp_enabled_subnet_ids:"},{"line_number":84,"context_line":"                        dhcp_enabled_subnet_ids.remove(fixed_ip[\u0027subnet_id\u0027])"},{"line_number":85,"context_line":"                port[\u0027fixed_ips\u0027].extend("},{"line_number":86,"context_line":"                    [dict(subnet_id\u003ds) for s in dhcp_enabled_subnet_ids])"},{"line_number":87,"context_line":"                retval \u003d plugin.update_port(context, port[\u0027id\u0027],"},{"line_number":88,"context_line":"                                            dict(port\u003dport))"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F210%3D","line":86,"updated":"2012-12-12 11:48:04.000000000","message":"Do we need the change in this file?","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":83,"context_line":"                    if fixed_ip[\u0027subnet_id\u0027] in dhcp_enabled_subnet_ids:"},{"line_number":84,"context_line":"                        dhcp_enabled_subnet_ids.remove(fixed_ip[\u0027subnet_id\u0027])"},{"line_number":85,"context_line":"                port[\u0027fixed_ips\u0027].extend("},{"line_number":86,"context_line":"                    [dict(subnet_id\u003ds) for s in dhcp_enabled_subnet_ids])"},{"line_number":87,"context_line":"                retval \u003d plugin.update_port(context, port[\u0027id\u0027],"},{"line_number":88,"context_line":"                                            dict(port\u003dport))"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0vc%3D","line":86,"in_reply_to":"AAAAMX%2F%2F210%3D","updated":"2012-12-13 23:22:28.000000000","message":"Done","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"}],"quantum/db/securitygroups_db.py":[{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":471,"context_line":"            msg \u003d \u0027 \u0027.join(str(x) for x in invalid_sg_set)"},{"line_number":472,"context_line":"            raise ext_sg.SecurityGroupNotFound(id\u003dmsg)"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"},{"line_number":475,"context_line":"        # we don\u0027t apply security groups for dhcp, router"},{"line_number":476,"context_line":"        if (port[\u0027port\u0027].get(\u0027device_owner\u0027) and"},{"line_number":477,"context_line":"                port[\u0027port\u0027][\u0027device_owner\u0027].startswith(\u0027network:\u0027)):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5iE%3D","line":474,"updated":"2012-12-09 15:49:37.000000000","message":"Is there any place using this function?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":471,"context_line":"            msg \u003d \u0027 \u0027.join(str(x) for x in invalid_sg_set)"},{"line_number":472,"context_line":"            raise ext_sg.SecurityGroupNotFound(id\u003dmsg)"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"},{"line_number":475,"context_line":"        # we don\u0027t apply security groups for dhcp, router"},{"line_number":476,"context_line":"        if (port[\u0027port\u0027].get(\u0027device_owner\u0027) and"},{"line_number":477,"context_line":"                port[\u0027port\u0027][\u0027device_owner\u0027].startswith(\u0027network:\u0027)):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4uQ%3D","line":474,"in_reply_to":"AAAAMX%2F%2F5iE%3D","updated":"2012-12-10 22:54:29.000000000","message":"I\u0027m using this in Linuxbridge","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2531,"name":"Xu Chen","email":"xchenum@gmail.com","username":"xchenum"},"unresolved":false,"context_lines":[{"line_number":49,"context_line":"                                  primary_key\u003dTrue)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class SecurityGroupRule(model_base.BASEV2, models_v2.HasId,"},{"line_number":53,"context_line":"                        models_v2.HasTenant):"},{"line_number":54,"context_line":"    \"\"\"Represents a v2 quantum security group rule.\"\"\""},{"line_number":55,"context_line":"    external_id \u003d sa.Column(sa.Integer)"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5kM%3D","line":52,"updated":"2012-12-22 20:05:45.000000000","message":"Not sure if we should tie a security group to a subnet... rather than just ports.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":49,"context_line":"                                  primary_key\u003dTrue)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class SecurityGroupRule(model_base.BASEV2, models_v2.HasId,"},{"line_number":53,"context_line":"                        models_v2.HasTenant):"},{"line_number":54,"context_line":"    \"\"\"Represents a v2 quantum security group rule.\"\"\""},{"line_number":55,"context_line":"    external_id \u003d sa.Column(sa.Integer)"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5cI%3D","line":52,"in_reply_to":"AAAAM3%2F%2F5kM%3D","updated":"2012-12-23 06:03:46.000000000","message":"IMO, security group model and subnet model has no direct relationship.\nWe can apply ip-based rule on ports.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":466,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"},{"line_number":467,"context_line":"        # we don\u0027t apply security groups for dhcp, router"},{"line_number":468,"context_line":"        if (port[\u0027port\u0027].get(\u0027device_owner\u0027) and"},{"line_number":469,"context_line":"                port[\u0027port\u0027][\u0027device_owner\u0027].startswith(\u0027network:\u0027)):"},{"line_number":470,"context_line":"            return"},{"line_number":471,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context,"},{"line_number":472,"context_line":"                                                   port[\u0027port\u0027])"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5Ik%3D","line":469,"updated":"2012-12-24 16:21:43.000000000","message":"too much indentation?","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":466,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"},{"line_number":467,"context_line":"        # we don\u0027t apply security groups for dhcp, router"},{"line_number":468,"context_line":"        if (port[\u0027port\u0027].get(\u0027device_owner\u0027) and"},{"line_number":469,"context_line":"                port[\u0027port\u0027][\u0027device_owner\u0027].startswith(\u0027network:\u0027)):"},{"line_number":470,"context_line":"            return"},{"line_number":471,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context,"},{"line_number":472,"context_line":"                                                   port[\u0027port\u0027])"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4hk%3D","line":469,"in_reply_to":"AAAAM3%2F%2F5Ik%3D","updated":"2012-12-26 19:15:41.000000000","message":"this indent is in the ( ), so it looks OK. and pep8 says OK too.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":463,"context_line":"            msg \u003d \u0027 \u0027.join(str(x) for x in invalid_sg_set)"},{"line_number":464,"context_line":"            raise ext_sg.SecurityGroupNotFound(id\u003dmsg)"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"},{"line_number":467,"context_line":"        # we don\u0027t apply security groups for dhcp, router"},{"line_number":468,"context_line":"        if (port[\u0027port\u0027].get(\u0027device_owner\u0027) and"},{"line_number":469,"context_line":"                port[\u0027port\u0027][\u0027device_owner\u0027].startswith(\u0027network:\u0027)):"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAM3%2F%2F26s%3D","line":466,"updated":"2012-12-31 09:42:09.000000000","message":"I wonder if we should have a flag which legs the user indicate if this is enabled or disabled. By default it can be enabled.","commit_id":"6102cfb2de583b96cd0b6e61c6f479177a43fef5"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":463,"context_line":"            msg \u003d \u0027 \u0027.join(str(x) for x in invalid_sg_set)"},{"line_number":464,"context_line":"            raise ext_sg.SecurityGroupNotFound(id\u003dmsg)"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"},{"line_number":467,"context_line":"        # we don\u0027t apply security groups for dhcp, router"},{"line_number":468,"context_line":"        if (port[\u0027port\u0027].get(\u0027device_owner\u0027) and"},{"line_number":469,"context_line":"                port[\u0027port\u0027][\u0027device_owner\u0027].startswith(\u0027network:\u0027)):"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAM3%2F%2F2xc%3D","line":466,"in_reply_to":"AAAAM3%2F%2F26s%3D","updated":"2012-12-31 21:40:16.000000000","message":"I agree, but it looks a change for the security group spec. So I wanna work on that on another patch","commit_id":"6102cfb2de583b96cd0b6e61c6f479177a43fef5"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":452,"context_line":"        p \u003d port[\u0027port\u0027]"},{"line_number":453,"context_line":"        if not attr.is_attr_set(p.get(ext_sg.SECURITYGROUP)):"},{"line_number":454,"context_line":"            return"},{"line_number":455,"context_line":"        if p.get(\u0027device_owner\u0027) and p[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"},{"line_number":456,"context_line":"            raise ext_sg.SecurityGroupInvalidDeviceOwner()"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        valid_groups \u003d self.get_security_groups(context, fields\u003d{\u0027id\u0027: None})"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fydw%3D","line":455,"updated":"2013-01-04 22:50:12.000000000","message":"ditto comment below","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":452,"context_line":"        p \u003d port[\u0027port\u0027]"},{"line_number":453,"context_line":"        if not attr.is_attr_set(p.get(ext_sg.SECURITYGROUP)):"},{"line_number":454,"context_line":"            return"},{"line_number":455,"context_line":"        if p.get(\u0027device_owner\u0027) and p[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"},{"line_number":456,"context_line":"            raise ext_sg.SecurityGroupInvalidDeviceOwner()"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        valid_groups \u003d self.get_security_groups(context, fields\u003d{\u0027id\u0027: None})"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx54%3D","line":455,"in_reply_to":"AAAAM3%2F%2Fydw%3D","updated":"2013-01-05 07:42:11.000000000","message":"ditto replay","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":465,"context_line":""},{"line_number":466,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"},{"line_number":467,"context_line":"        # we don\u0027t apply security groups for dhcp, router"},{"line_number":468,"context_line":"        if (port[\u0027port\u0027].get(\u0027device_owner\u0027) and"},{"line_number":469,"context_line":"                port[\u0027port\u0027][\u0027device_owner\u0027].startswith(\u0027network:\u0027)):"},{"line_number":470,"context_line":"            return"},{"line_number":471,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context,"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fygw%3D","line":468,"updated":"2013-01-04 22:50:12.000000000","message":"If a client passes in --device_owner network:dhcp security groups will not be applied. Since the dhcp agent runs as the quantum admin user I believe you should be checking if context.is_admin. For the router ports something different will need to be done since those are from regular tenants. We\u0027ll need ensure that the port created here was actually from v2.0/routers and not v2.0/ports.","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":465,"context_line":""},{"line_number":466,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"},{"line_number":467,"context_line":"        # we don\u0027t apply security groups for dhcp, router"},{"line_number":468,"context_line":"        if (port[\u0027port\u0027].get(\u0027device_owner\u0027) and"},{"line_number":469,"context_line":"                port[\u0027port\u0027][\u0027device_owner\u0027].startswith(\u0027network:\u0027)):"},{"line_number":470,"context_line":"            return"},{"line_number":471,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context,"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx50%3D","line":468,"in_reply_to":"AAAAM3%2F%2Fygw%3D","updated":"2013-01-05 07:42:11.000000000","message":"I agree, but basically users should not create a port which has \u0027network\u0027 prefixed one. IMO, this changes should be different patch.","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":407,"context_line":"        fields \u003d {\u0027security_group_id\u0027: None}"},{"line_number":408,"context_line":"        security_group_id \u003d self._get_port_security_group_bindings("},{"line_number":409,"context_line":"            context, filters, fields)"},{"line_number":410,"context_line":"        if not security_group_id:"},{"line_number":411,"context_line":"            return port"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        port[ext_sg.SECURITYGROUP] \u003d []"}],"source_content_type":"text/x-python","patch_set":49,"id":"AAAAM3%2F%2FvtI%3D","line":410,"updated":"2013-01-07 21:49:10.000000000","message":"This changes the intended behavior. if a port doesn\u0027t have a security group associated with it, the security_groups field is omitted from the return.","commit_id":"ab3cc24618922689a566ea8fd8b43a5131c3c2a9"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":407,"context_line":"        fields \u003d {\u0027security_group_id\u0027: None}"},{"line_number":408,"context_line":"        security_group_id \u003d self._get_port_security_group_bindings("},{"line_number":409,"context_line":"            context, filters, fields)"},{"line_number":410,"context_line":"        if not security_group_id:"},{"line_number":411,"context_line":"            return port"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        port[ext_sg.SECURITYGROUP] \u003d []"}],"source_content_type":"text/x-python","patch_set":49,"id":"AAAAM3%2F%2FvpU%3D","line":410,"in_reply_to":"AAAAM3%2F%2FvrM%3D","updated":"2013-01-07 22:20:57.000000000","message":"I removed line 410,411","commit_id":"ab3cc24618922689a566ea8fd8b43a5131c3c2a9"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":407,"context_line":"        fields \u003d {\u0027security_group_id\u0027: None}"},{"line_number":408,"context_line":"        security_group_id \u003d self._get_port_security_group_bindings("},{"line_number":409,"context_line":"            context, filters, fields)"},{"line_number":410,"context_line":"        if not security_group_id:"},{"line_number":411,"context_line":"            return port"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        port[ext_sg.SECURITYGROUP] \u003d []"}],"source_content_type":"text/x-python","patch_set":49,"id":"AAAAM3%2F%2FvrM%3D","line":410,"in_reply_to":"AAAAM3%2F%2FvtI%3D","updated":"2013-01-07 22:07:01.000000000","message":"aaron rosen: do we have to have an empty securitygroup in port dict then?","commit_id":"ab3cc24618922689a566ea8fd8b43a5131c3c2a9"}],"quantum/db/securitygroups_rpc_base.py":[{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"change_message_id":"52d11f5af4718fc1af23dbbcbb82d22e621008b2","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import netaddr"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from quantum.agent.linux import iptables_manager"},{"line_number":21,"context_line":"from quantum.agent.linux.iptables_firewall import IptablesFirewallDriver"},{"line_number":22,"context_line":"from quantum.common import topics"},{"line_number":23,"context_line":"import quantum.db.api as db"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F6D4%3D","line":20,"updated":"2012-11-16 05:02:28.000000000","message":"This import should be placed between lines 21 and 22","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import netaddr"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from quantum.agent.linux import iptables_manager"},{"line_number":21,"context_line":"from quantum.agent.linux.iptables_firewall import IptablesFirewallDriver"},{"line_number":22,"context_line":"from quantum.common import topics"},{"line_number":23,"context_line":"import quantum.db.api as db"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F55w%3D","line":20,"in_reply_to":"AAAAMH%2F%2F6D4%3D","updated":"2012-11-16 07:31:27.000000000","message":"Done","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"change_message_id":"52d11f5af4718fc1af23dbbcbb82d22e621008b2","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def security_group_rules_for_devices(self, context, **kwargs):"},{"line_number":38,"context_line":"        \"\"\" return security group rules for each port"},{"line_number":39,"context_line":"            also convert source_group_id rule"},{"line_number":40,"context_line":"            to source_ip_prefix rule"},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":"        devices \u003d kwargs.get(\u0027devices\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F6As%3D","line":39,"updated":"2012-11-16 05:02:28.000000000","message":"blank line above and align to first indent","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def security_group_rules_for_devices(self, context, **kwargs):"},{"line_number":38,"context_line":"        \"\"\" return security group rules for each port"},{"line_number":39,"context_line":"            also convert source_group_id rule"},{"line_number":40,"context_line":"            to source_ip_prefix rule"},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":"        devices \u003d kwargs.get(\u0027devices\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F55o%3D","line":39,"in_reply_to":"AAAAMH%2F%2F6As%3D","updated":"2012-11-16 07:31:27.000000000","message":"Done","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"change_message_id":"52d11f5af4718fc1af23dbbcbb82d22e621008b2","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                           if (r[\u0027direction\u0027] \u003d\u003d \u0027egress\u0027 and"},{"line_number":124,"context_line":"                               r[\u0027ethertype\u0027] \u003d\u003d ethertype)]"},{"line_number":125,"context_line":"            if len(egress_rule) \u003e 0:"},{"line_number":126,"context_line":"                return"},{"line_number":127,"context_line":"            default_egress_rule \u003d {\u0027direction\u0027: \u0027egress\u0027,"},{"line_number":128,"context_line":"                                   \u0027ethertype\u0027: ethertype}"},{"line_number":129,"context_line":"            port[\u0027security_group_rules\u0027].append(default_egress_rule)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F5%2FA%3D","line":126,"updated":"2012-11-16 05:02:28.000000000","message":"This condition is not handled in test_security_groups_rpc.py","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                           if (r[\u0027direction\u0027] \u003d\u003d \u0027egress\u0027 and"},{"line_number":124,"context_line":"                               r[\u0027ethertype\u0027] \u003d\u003d ethertype)]"},{"line_number":125,"context_line":"            if len(egress_rule) \u003e 0:"},{"line_number":126,"context_line":"                return"},{"line_number":127,"context_line":"            default_egress_rule \u003d {\u0027direction\u0027: \u0027egress\u0027,"},{"line_number":128,"context_line":"                                   \u0027ethertype\u0027: ethertype}"},{"line_number":129,"context_line":"            port[\u0027security_group_rules\u0027].append(default_egress_rule)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F53I%3D","line":126,"in_reply_to":"AAAAMH%2F%2F5%2FA%3D","updated":"2012-11-16 07:31:27.000000000","message":"Done","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":39,"context_line":"        \"\"\" return security group rules for each port"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        also convert source_group_id rule"},{"line_number":42,"context_line":"        to source_ip_prefix rule"},{"line_number":43,"context_line":"        \"\"\""},{"line_number":44,"context_line":"        devices \u003d kwargs.get(\u0027devices\u0027)"},{"line_number":45,"context_line":"        ports \u003d {}"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5rI%3D","line":42,"updated":"2012-11-16 13:45:01.000000000","message":"Could you document the api parameters expected?\nkwargs explains nothing about RPC API.\n\nThis applies to all other RPC Mixins.","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        \"\"\" return security group rules for each port"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        also convert source_group_id rule"},{"line_number":42,"context_line":"        to source_ip_prefix rule"},{"line_number":43,"context_line":"        \"\"\""},{"line_number":44,"context_line":"        devices \u003d kwargs.get(\u0027devices\u0027)"},{"line_number":45,"context_line":"        ports \u003d {}"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5RA%3D","line":42,"in_reply_to":"AAAAMH%2F%2F5rI%3D","updated":"2012-11-16 22:35:48.000000000","message":"Done","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":166,"context_line":"                         topic\u003dself.topic)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"class SecurityGroupAgentCallbackMixin(object):"},{"line_number":170,"context_line":"    \"\"\"A mix-in that enable SecurityGroup agent"},{"line_number":171,"context_line":"    support in agent implementations."},{"line_number":172,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5rs%3D","line":169,"updated":"2012-11-16 13:45:01.000000000","message":"***AgentRpcCallbackMixin is a better name.\nFor a api from agent to server (plugin), ServerRSpcApi and ServerRpcCallback are used as class name.\n\nThis class is only related to agent implementaiton, so it should not be placed in db/. It is better to move it under agent/ directory.","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                         topic\u003dself.topic)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"class SecurityGroupAgentCallbackMixin(object):"},{"line_number":170,"context_line":"    \"\"\"A mix-in that enable SecurityGroup agent"},{"line_number":171,"context_line":"    support in agent implementations."},{"line_number":172,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5Nc%3D","line":169,"in_reply_to":"AAAAMH%2F%2F5rs%3D","updated":"2012-11-16 22:35:48.000000000","message":"It make sense. I redesigned mixin class design here.\n\nhttps://docs.google.com/presentation/d/1nXzNXKIfCfotdav5BzkceDiOfDypEkvtTfVXCGdq6rY/edit#slide\u003did.g38c62e30_0_0","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":169,"context_line":"class SecurityGroupAgentCallbackMixin(object):"},{"line_number":170,"context_line":"    \"\"\"A mix-in that enable SecurityGroup agent"},{"line_number":171,"context_line":"    support in agent implementations."},{"line_number":172,"context_line":"    \"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def security_groups_rule_updated(self, context, **kwargs):"},{"line_number":175,"context_line":"        LOG.debug(_(\"security group rule updated on remote\"))"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5rM%3D","line":172,"updated":"2012-11-16 13:45:01.000000000","message":"Could you document the api parameters expected?\nkwargs explains nothing about RPC API.","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":169,"context_line":"class SecurityGroupAgentCallbackMixin(object):"},{"line_number":170,"context_line":"    \"\"\"A mix-in that enable SecurityGroup agent"},{"line_number":171,"context_line":"    support in agent implementations."},{"line_number":172,"context_line":"    \"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def security_groups_rule_updated(self, context, **kwargs):"},{"line_number":175,"context_line":"        LOG.debug(_(\"security group rule updated on remote\"))"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5Q0%3D","line":172,"in_reply_to":"AAAAMH%2F%2F5rM%3D","updated":"2012-11-16 22:35:48.000000000","message":"Done","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":182,"context_line":"        self.agent.security_groups_member_updated(security_groups)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"class SecurityGroupAgentMixin(object):"},{"line_number":186,"context_line":"    \"\"\"A mix-in that enable SecurityGroup agent"},{"line_number":187,"context_line":"    support in agent implementations."},{"line_number":188,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5rY%3D","line":185,"updated":"2012-11-16 13:45:01.000000000","message":"This class is only related to agent implementaiton, so it should not be placed in db/. It is better to move it under agent/ directory.\n\nIn addition, I think this class does not depend on using RPC.\nPerhaps naming this mixin as SecurtiyGroup**Agent**Mixin is affected from LinuxBridgeQuantum**Agent***Rpc.","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        self.agent.security_groups_member_updated(security_groups)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"class SecurityGroupAgentMixin(object):"},{"line_number":186,"context_line":"    \"\"\"A mix-in that enable SecurityGroup agent"},{"line_number":187,"context_line":"    support in agent implementations."},{"line_number":188,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5NU%3D","line":185,"in_reply_to":"AAAAMH%2F%2F5rY%3D","updated":"2012-11-16 22:35:48.000000000","message":"Done","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":252,"context_line":"        self.firewall.filter_defer_apply_off()"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"class SecurityGroupNotifireApiMixin(object):"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    def _get_security_group_topic(self):"},{"line_number":258,"context_line":"        return topics.get_topic_name(self.topic,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5rk%3D","line":255,"updated":"2012-11-16 13:45:01.000000000","message":"***AgentRpcApiMixin may be a better name since it is easy to know a pair of callback and api.\n\nIt just uses RPC to notify event related to security groups (it does not implement notification API).\n\nIt is worth considering whether this class should be moved to agent/ directory since it is a connterpart of AgentRpcCallback.","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        self.firewall.filter_defer_apply_off()"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"class SecurityGroupNotifireApiMixin(object):"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    def _get_security_group_topic(self):"},{"line_number":258,"context_line":"        return topics.get_topic_name(self.topic,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5NY%3D","line":255,"in_reply_to":"AAAAMH%2F%2F5rk%3D","updated":"2012-11-16 22:35:48.000000000","message":"Done","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class SecurityGroupServerRpcMixin(db_base_plugin_v2.QuantumDbPluginV2,"},{"line_number":33,"context_line":"                                  sg_db.SecurityGroupDbMixin,"},{"line_number":34,"context_line":"                                  l3_db.L3_NAT_db_mixin):"},{"line_number":35,"context_line":"    def create_port(self, context, port):"},{"line_number":36,"context_line":"        self._ensure_default_security_group_on_port(context, port)"},{"line_number":37,"context_line":"        self._validate_security_groups_on_port(context, port)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3aw%3D","line":34,"updated":"2012-11-19 19:24:55.000000000","message":"Why does SecurityGroupServerRpcMixin inherit L3_NAT_db_mixin? L3 extention and secgroup extension are indendent each other.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class SecurityGroupServerRpcMixin(db_base_plugin_v2.QuantumDbPluginV2,"},{"line_number":33,"context_line":"                                  sg_db.SecurityGroupDbMixin,"},{"line_number":34,"context_line":"                                  l3_db.L3_NAT_db_mixin):"},{"line_number":35,"context_line":"    def create_port(self, context, port):"},{"line_number":36,"context_line":"        self._ensure_default_security_group_on_port(context, port)"},{"line_number":37,"context_line":"        self._validate_security_groups_on_port(context, port)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F21s%3D","line":34,"in_reply_to":"AAAAMH%2F%2F3Dw%3D","updated":"2012-11-19 23:05:06.000000000","message":"I got it. I move back to the these functions.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"9c9b5ccfbdcba4c2749d2cf44f124814e3085ade","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class SecurityGroupServerRpcMixin(db_base_plugin_v2.QuantumDbPluginV2,"},{"line_number":33,"context_line":"                                  sg_db.SecurityGroupDbMixin,"},{"line_number":34,"context_line":"                                  l3_db.L3_NAT_db_mixin):"},{"line_number":35,"context_line":"    def create_port(self, context, port):"},{"line_number":36,"context_line":"        self._ensure_default_security_group_on_port(context, port)"},{"line_number":37,"context_line":"        self._validate_security_groups_on_port(context, port)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3Dw%3D","line":34,"in_reply_to":"AAAAMH%2F%2F3aw%3D","updated":"2012-11-19 20:54:28.000000000","message":"Also I don\u0027t think this should inherit db_base_plugin_v2.QuantumDbPluginV2 either. This should be done in the mixin that inherts SecurityGroupServerRpcMixin.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":48,"context_line":"        return port"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _check_updated(self, a, b):"},{"line_number":51,"context_line":"        if not a:"},{"line_number":52,"context_line":"            a \u003d []"},{"line_number":53,"context_line":"        if not b:"},{"line_number":54,"context_line":"            b \u003d []"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3mk%3D","line":51,"updated":"2012-11-19 14:47:11.000000000","message":"if a is None?","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":48,"context_line":"        return port"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _check_updated(self, a, b):"},{"line_number":51,"context_line":"        if not a:"},{"line_number":52,"context_line":"            a \u003d []"},{"line_number":53,"context_line":"        if not b:"},{"line_number":54,"context_line":"            b \u003d []"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F25E%3D","line":51,"in_reply_to":"AAAAMH%2F%2F3mk%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"9c9b5ccfbdcba4c2749d2cf44f124814e3085ade","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def update_port(self, context, id, port):"},{"line_number":58,"context_line":"        self._validate_security_groups_on_port(context, port)"},{"line_number":59,"context_line":"        original_port \u003d super(SecurityGroupServerRpcMixin, self).get_port("},{"line_number":60,"context_line":"            context, id)"},{"line_number":61,"context_line":"        self._extend_port_dict_security_group(context, original_port)"},{"line_number":62,"context_line":"        session \u003d context.session"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3IY%3D","line":59,"updated":"2012-11-19 20:54:28.000000000","message":"If you don\u0027t call the super class you can remove line 61.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def update_port(self, context, id, port):"},{"line_number":58,"context_line":"        self._validate_security_groups_on_port(context, port)"},{"line_number":59,"context_line":"        original_port \u003d super(SecurityGroupServerRpcMixin, self).get_port("},{"line_number":60,"context_line":"            context, id)"},{"line_number":61,"context_line":"        self._extend_port_dict_security_group(context, original_port)"},{"line_number":62,"context_line":"        session \u003d context.session"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F240%3D","line":59,"in_reply_to":"AAAAMH%2F%2F3IY%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":74,"context_line":"            self.port_admin_status_updated(context, port)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        if (original_port[\u0027fixed_ips\u0027] !\u003d port[\u0027fixed_ips\u0027] or"},{"line_number":77,"context_line":"            self._check_updated("},{"line_number":78,"context_line":"                original_port.get(ext_sg.SECURITYGROUP),"},{"line_number":79,"context_line":"                port.get(ext_sg.SECURITYGROUP))):"},{"line_number":80,"context_line":"            self.notifier.security_groups_member_updated("}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3Ng%3D","line":77,"updated":"2012-11-19 19:24:55.000000000","message":"In the current condition when secgroup are not changed then a notification is issued? I think \"not self._check_updated\" is a correct logic.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":74,"context_line":"            self.port_admin_status_updated(context, port)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        if (original_port[\u0027fixed_ips\u0027] !\u003d port[\u0027fixed_ips\u0027] or"},{"line_number":77,"context_line":"            self._check_updated("},{"line_number":78,"context_line":"                original_port.get(ext_sg.SECURITYGROUP),"},{"line_number":79,"context_line":"                port.get(ext_sg.SECURITYGROUP))):"},{"line_number":80,"context_line":"            self.notifier.security_groups_member_updated("}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F24Y%3D","line":77,"in_reply_to":"AAAAMH%2F%2F3Ng%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"9c9b5ccfbdcba4c2749d2cf44f124814e3085ade","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":94,"context_line":"            self.disassociate_floatingips(context, id)"},{"line_number":95,"context_line":"            port \u003d self.get_port(context, id)"},{"line_number":96,"context_line":"            self._extend_port_dict_security_group(context, port)"},{"line_number":97,"context_line":"            self._delete_port_security_group_bindings(context, id)"},{"line_number":98,"context_line":"            super(SecurityGroupServerRpcMixin, self).delete_port(context, id)"},{"line_number":99,"context_line":"            self.notifier.security_groups_member_updated("}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3IQ%3D","line":96,"updated":"2012-11-19 20:54:28.000000000","message":"self.get_port on 95 should have already done this for you so you don\u0027t need this line.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":93,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":94,"context_line":"            self.disassociate_floatingips(context, id)"},{"line_number":95,"context_line":"            port \u003d self.get_port(context, id)"},{"line_number":96,"context_line":"            self._extend_port_dict_security_group(context, port)"},{"line_number":97,"context_line":"            self._delete_port_security_group_bindings(context, id)"},{"line_number":98,"context_line":"            super(SecurityGroupServerRpcMixin, self).delete_port(context, id)"},{"line_number":99,"context_line":"            self.notifier.security_groups_member_updated("}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F24Q%3D","line":96,"in_reply_to":"AAAAMH%2F%2F3IQ%3D","updated":"2012-11-19 23:05:06.000000000","message":"Done","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"9c9b5ccfbdcba4c2749d2cf44f124814e3085ade","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    support in plugin implementations."},{"line_number":144,"context_line":"    \"\"\""},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def security_group_rules_for_devices(self, context, **kwargs):"},{"line_number":147,"context_line":"        \"\"\" return security group rules for each port"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        also convert source_group_id rule"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3IA%3D","line":146,"updated":"2012-11-19 20:54:28.000000000","message":"Why not just pass devices directly rather do it through kwargs.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":143,"context_line":"    support in plugin implementations."},{"line_number":144,"context_line":"    \"\"\""},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def security_group_rules_for_devices(self, context, **kwargs):"},{"line_number":147,"context_line":"        \"\"\" return security group rules for each port"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        also convert source_group_id rule"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F238%3D","line":146,"in_reply_to":"AAAAMH%2F%2F3IA%3D","updated":"2012-11-19 23:05:06.000000000","message":"It looks like cording style","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        session \u003d db.get_session()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        ip_port \u003d models_v2.IPAllocation.port_id"},{"line_number":104,"context_line":"        sg_binding_port \u003d sg_db.SecurityGroupPortBinding.port_id"},{"line_number":105,"context_line":"        sg_binding_sgid \u003d sg_db.SecurityGroupPortBinding.security_group_id"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzLM%3D","line":103,"updated":"2012-11-22 10:05:49.000000000","message":"What if the plugin does not have a database, for example NVP? I am not sure that accessing the database directly is a good thing here. It would be better to use the interfaces if possible.","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        session \u003d db.get_session()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        ip_port \u003d models_v2.IPAllocation.port_id"},{"line_number":104,"context_line":"        sg_binding_port \u003d sg_db.SecurityGroupPortBinding.port_id"},{"line_number":105,"context_line":"        sg_binding_sgid \u003d sg_db.SecurityGroupPortBinding.security_group_id"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy5w%3D","line":103,"in_reply_to":"AAAAMH%2F%2FzLM%3D","updated":"2012-11-22 17:39:20.000000000","message":"This module depends on QuatnumDBpluginV2. this is why I put this module in db directory.\nAnd also this module may not cover all plugins. NVP has it own security group plugin.","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":142,"context_line":"                    if base_rule[\u0027ethertype\u0027] !\u003d ethertype:"},{"line_number":143,"context_line":"                        continue"},{"line_number":144,"context_line":"                    if ethertype \u003d\u003d \u0027IPv4\u0027:"},{"line_number":145,"context_line":"                        mask \u003d \"32\""},{"line_number":146,"context_line":"                    elif ethertype \u003d\u003d \u0027IPv6\u0027:"},{"line_number":147,"context_line":"                        mask \u003d \"128\""},{"line_number":148,"context_line":"                    ip_rule[\u0027source_ip_prefix\u0027] \u003d \"%s/%s\" % (ip, mask)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzK4%3D","line":145,"updated":"2012-11-22 10:05:49.000000000","message":"please use a define for this","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":142,"context_line":"                    if base_rule[\u0027ethertype\u0027] !\u003d ethertype:"},{"line_number":143,"context_line":"                        continue"},{"line_number":144,"context_line":"                    if ethertype \u003d\u003d \u0027IPv4\u0027:"},{"line_number":145,"context_line":"                        mask \u003d \"32\""},{"line_number":146,"context_line":"                    elif ethertype \u003d\u003d \u0027IPv6\u0027:"},{"line_number":147,"context_line":"                        mask \u003d \"128\""},{"line_number":148,"context_line":"                    ip_rule[\u0027source_ip_prefix\u0027] \u003d \"%s/%s\" % (ip, mask)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy5Q%3D","line":145,"in_reply_to":"AAAAMH%2F%2FzK4%3D","updated":"2012-11-22 17:39:20.000000000","message":"You are right!","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":144,"context_line":"                    if ethertype \u003d\u003d \u0027IPv4\u0027:"},{"line_number":145,"context_line":"                        mask \u003d \"32\""},{"line_number":146,"context_line":"                    elif ethertype \u003d\u003d \u0027IPv6\u0027:"},{"line_number":147,"context_line":"                        mask \u003d \"128\""},{"line_number":148,"context_line":"                    ip_rule[\u0027source_ip_prefix\u0027] \u003d \"%s/%s\" % (ip, mask)"},{"line_number":149,"context_line":"                    updated_rule.append(ip_rule)"},{"line_number":150,"context_line":"            port[\u0027security_group_rules\u0027] \u003d updated_rule"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzK0%3D","line":147,"updated":"2012-11-22 10:05:49.000000000","message":"ditto\n\nan alternative would be to have a dict that will return the mask per ethertype.","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":144,"context_line":"                    if ethertype \u003d\u003d \u0027IPv4\u0027:"},{"line_number":145,"context_line":"                        mask \u003d \"32\""},{"line_number":146,"context_line":"                    elif ethertype \u003d\u003d \u0027IPv6\u0027:"},{"line_number":147,"context_line":"                        mask \u003d \"128\""},{"line_number":148,"context_line":"                    ip_rule[\u0027source_ip_prefix\u0027] \u003d \"%s/%s\" % (ip, mask)"},{"line_number":149,"context_line":"                    updated_rule.append(ip_rule)"},{"line_number":150,"context_line":"            port[\u0027security_group_rules\u0027] \u003d updated_rule"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy5M%3D","line":147,"in_reply_to":"AAAAMH%2F%2FzK0%3D","updated":"2012-11-22 17:39:20.000000000","message":"Done","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":178,"context_line":"            port[\u0027security_group_rules\u0027].append(rule_dict)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        for port in ports.values():"},{"line_number":181,"context_line":"            self._add_default_egress_rule(port, \u0027IPv4\u0027)"},{"line_number":182,"context_line":"            self._add_default_egress_rule(port, \u0027IPv6\u0027)"},{"line_number":183,"context_line":"        return self._convert_source_group_id_to_ip_prefix(ports)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzKs%3D","line":181,"updated":"2012-11-22 10:05:49.000000000","message":"consider a defines for these.","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":178,"context_line":"            port[\u0027security_group_rules\u0027].append(rule_dict)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        for port in ports.values():"},{"line_number":181,"context_line":"            self._add_default_egress_rule(port, \u0027IPv4\u0027)"},{"line_number":182,"context_line":"            self._add_default_egress_rule(port, \u0027IPv6\u0027)"},{"line_number":183,"context_line":"        return self._convert_source_group_id_to_ip_prefix(ports)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy5E%3D","line":181,"in_reply_to":"AAAAMH%2F%2FzKs%3D","updated":"2012-11-22 17:39:20.000000000","message":"Done","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _select_sgids_for_port(self, port):"},{"line_number":107,"context_line":"        session \u003d db.get_session()"},{"line_number":108,"context_line":"        sg_binding_port \u003d sg_db.SecurityGroupPortBinding.port_id"},{"line_number":109,"context_line":"        query \u003d session.query(sg_db.SecurityGroupPortBinding)"},{"line_number":110,"context_line":"        query \u003d query.filter(sg_binding_port \u003d\u003d port[\u0027id\u0027])"},{"line_number":111,"context_line":"        return [binding[\u0027security_group_id\u0027] for binding in query.all()]"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAMX%2F%2F50s%3D","line":108,"updated":"2012-12-08 16:58:16.000000000","message":"This is a syntax of sqlalchemy and it does not follow an usual python grammer. So I prefer to moving this line into L110 (though it becomes longer than 80 chars). I am not sure what is a usual coding style for such case.\n\nquery \u003d query.filter(\n    sg_db.SecurityGroupPortBinding.port_id \u003d\u003d port[\u0027id\u0027])","commit_id":"0f7dec272c25cb96e85d5afd2b7f9394074ea425"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _select_sgids_for_port(self, port):"},{"line_number":107,"context_line":"        session \u003d db.get_session()"},{"line_number":108,"context_line":"        sg_binding_port \u003d sg_db.SecurityGroupPortBinding.port_id"},{"line_number":109,"context_line":"        query \u003d session.query(sg_db.SecurityGroupPortBinding)"},{"line_number":110,"context_line":"        query \u003d query.filter(sg_binding_port \u003d\u003d port[\u0027id\u0027])"},{"line_number":111,"context_line":"        return [binding[\u0027security_group_id\u0027] for binding in query.all()]"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAMX%2F%2F5rI%3D","line":108,"in_reply_to":"AAAAMX%2F%2F50s%3D","updated":"2012-12-09 07:06:44.000000000","message":"Done","commit_id":"0f7dec272c25cb96e85d5afd2b7f9394074ea425"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":208,"context_line":"                               r[\u0027ethertype\u0027] \u003d\u003d ethertype)]"},{"line_number":209,"context_line":"            if len(egress_rule) \u003e 0:"},{"line_number":210,"context_line":"                return"},{"line_number":211,"context_line":"            for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":212,"context_line":"                version \u003d netaddr.IPAddress(ip).version"},{"line_number":213,"context_line":"                if \"IPv%s\" % version \u003d\u003d ethertype:"},{"line_number":214,"context_line":"                    default_egress_rule \u003d {\u0027direction\u0027: \u0027egress\u0027,"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAMX%2F%2F50Y%3D","line":211,"updated":"2012-12-08 16:58:16.000000000","message":"Theoretically one port can have multiple IP4v addresses, so this logic generates multiple default egress rules for IPv4 in such case.\n\nMy recommendation is that :\n(1) Change ethertype to a list or set which accepts {IPv4, IPv6]\n(2) Generate a list of ip versions for the port\n(3) Generate a default rule for each IP version (if the version is a member of the ethertype list)","commit_id":"0f7dec272c25cb96e85d5afd2b7f9394074ea425"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":208,"context_line":"                               r[\u0027ethertype\u0027] \u003d\u003d ethertype)]"},{"line_number":209,"context_line":"            if len(egress_rule) \u003e 0:"},{"line_number":210,"context_line":"                return"},{"line_number":211,"context_line":"            for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":212,"context_line":"                version \u003d netaddr.IPAddress(ip).version"},{"line_number":213,"context_line":"                if \"IPv%s\" % version \u003d\u003d ethertype:"},{"line_number":214,"context_line":"                    default_egress_rule \u003d {\u0027direction\u0027: \u0027egress\u0027,"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAMX%2F%2F5rc%3D","line":211,"in_reply_to":"AAAAMX%2F%2F50Y%3D","updated":"2012-12-09 07:06:44.000000000","message":"it\u0027s returns in the for loop so only one rule will be created.\n(see L 217)","commit_id":"0f7dec272c25cb96e85d5afd2b7f9394074ea425"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        ports \u003d {}"},{"line_number":83,"context_line":"        for device in devices:"},{"line_number":84,"context_line":"            port \u003d self.get_port_from_device(device)"},{"line_number":85,"context_line":"            if not port:"},{"line_number":86,"context_line":"                continue"},{"line_number":87,"context_line":"            if port[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5h4%3D","line":84,"updated":"2012-12-09 15:49:37.000000000","message":"This function is very bad in performance. It get all of the ports from db each time. \nI think we should devise a new function to fetch the needed port and security groups by one shot.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        ports \u003d {}"},{"line_number":83,"context_line":"        for device in devices:"},{"line_number":84,"context_line":"            port \u003d self.get_port_from_device(device)"},{"line_number":85,"context_line":"            if not port:"},{"line_number":86,"context_line":"                continue"},{"line_number":87,"context_line":"            if port[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4iw%3D","line":84,"in_reply_to":"AAAAMX%2F%2F5h4%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":91,"context_line":"            port_dict[\u0027network_id\u0027] \u003d port[\u0027network_id\u0027]"},{"line_number":92,"context_line":"            port_dict[\u0027mac_address\u0027] \u003d port[\u0027mac_address\u0027]"},{"line_number":93,"context_line":"            port_dict[\u0027device_owner\u0027] \u003d port[\u0027device_owner\u0027]"},{"line_number":94,"context_line":"            port_dict[\u0027security_groups\u0027] \u003d self._select_sgids_for_port(port)"},{"line_number":95,"context_line":"            port_dict[\u0027security_group_rules\u0027] \u003d []"},{"line_number":96,"context_line":"            port_dict[\u0027fixed_ips\u0027] \u003d self._select_fixed_ips_for_port(port)"},{"line_number":97,"context_line":"            ports[port[\u0027id\u0027]] \u003d port_dict"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5h0%3D","line":94,"updated":"2012-12-09 15:49:37.000000000","message":"see previous statement.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":91,"context_line":"            port_dict[\u0027network_id\u0027] \u003d port[\u0027network_id\u0027]"},{"line_number":92,"context_line":"            port_dict[\u0027mac_address\u0027] \u003d port[\u0027mac_address\u0027]"},{"line_number":93,"context_line":"            port_dict[\u0027device_owner\u0027] \u003d port[\u0027device_owner\u0027]"},{"line_number":94,"context_line":"            port_dict[\u0027security_groups\u0027] \u003d self._select_sgids_for_port(port)"},{"line_number":95,"context_line":"            port_dict[\u0027security_group_rules\u0027] \u003d []"},{"line_number":96,"context_line":"            port_dict[\u0027fixed_ips\u0027] \u003d self._select_fixed_ips_for_port(port)"},{"line_number":97,"context_line":"            ports[port[\u0027id\u0027]] \u003d port_dict"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4is%3D","line":94,"in_reply_to":"AAAAMX%2F%2F5h0%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":93,"context_line":"            port_dict[\u0027device_owner\u0027] \u003d port[\u0027device_owner\u0027]"},{"line_number":94,"context_line":"            port_dict[\u0027security_groups\u0027] \u003d self._select_sgids_for_port(port)"},{"line_number":95,"context_line":"            port_dict[\u0027security_group_rules\u0027] \u003d []"},{"line_number":96,"context_line":"            port_dict[\u0027fixed_ips\u0027] \u003d self._select_fixed_ips_for_port(port)"},{"line_number":97,"context_line":"            ports[port[\u0027id\u0027]] \u003d port_dict"},{"line_number":98,"context_line":"        return self._security_group_rules_for_ports(ports)"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5hw%3D","line":96,"updated":"2012-12-09 15:49:37.000000000","message":"we had better get it in previous one function too.","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":93,"context_line":"            port_dict[\u0027device_owner\u0027] \u003d port[\u0027device_owner\u0027]"},{"line_number":94,"context_line":"            port_dict[\u0027security_groups\u0027] \u003d self._select_sgids_for_port(port)"},{"line_number":95,"context_line":"            port_dict[\u0027security_group_rules\u0027] \u003d []"},{"line_number":96,"context_line":"            port_dict[\u0027fixed_ips\u0027] \u003d self._select_fixed_ips_for_port(port)"},{"line_number":97,"context_line":"            ports[port[\u0027id\u0027]] \u003d port_dict"},{"line_number":98,"context_line":"        return self._security_group_rules_for_ports(ports)"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4io%3D","line":96,"in_reply_to":"AAAAMX%2F%2F5hw%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":98,"context_line":"        return self._security_group_rules_for_ports(ports)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def _select_fixed_ips_for_port(self, port):"},{"line_number":101,"context_line":"        session \u003d db.get_session()"},{"line_number":102,"context_line":"        query \u003d session.query(models_v2.IPAllocation)"},{"line_number":103,"context_line":"        query \u003d query.filter(models_v2.IPAllocation.port_id \u003d\u003d port[\u0027id\u0027])"},{"line_number":104,"context_line":"        return [ip.ip_address for ip in query.all()]"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5iA%3D","line":101,"updated":"2012-12-09 15:49:37.000000000","message":"Why not use context to get the db session?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":98,"context_line":"        return self._security_group_rules_for_ports(ports)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def _select_fixed_ips_for_port(self, port):"},{"line_number":101,"context_line":"        session \u003d db.get_session()"},{"line_number":102,"context_line":"        query \u003d session.query(models_v2.IPAllocation)"},{"line_number":103,"context_line":"        query \u003d query.filter(models_v2.IPAllocation.port_id \u003d\u003d port[\u0027id\u0027])"},{"line_number":104,"context_line":"        return [ip.ip_address for ip in query.all()]"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4ik%3D","line":101,"in_reply_to":"AAAAMX%2F%2F5iA%3D","updated":"2012-12-10 22:54:29.000000000","message":"I have removed this function.\nbut I have fixed this file to use context.session","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":104,"context_line":"        return [ip.ip_address for ip in query.all()]"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _select_sgids_for_port(self, port):"},{"line_number":107,"context_line":"        session \u003d db.get_session()"},{"line_number":108,"context_line":"        query \u003d session.query(sg_db.SecurityGroupPortBinding)"},{"line_number":109,"context_line":"        query \u003d query.filter("},{"line_number":110,"context_line":"            sg_db.SecurityGroupPortBinding.port_id \u003d\u003d port[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5h8%3D","line":107,"updated":"2012-12-09 15:49:37.000000000","message":"ditto","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":104,"context_line":"        return [ip.ip_address for ip in query.all()]"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _select_sgids_for_port(self, port):"},{"line_number":107,"context_line":"        session \u003d db.get_session()"},{"line_number":108,"context_line":"        query \u003d session.query(sg_db.SecurityGroupPortBinding)"},{"line_number":109,"context_line":"        query \u003d query.filter("},{"line_number":110,"context_line":"            sg_db.SecurityGroupPortBinding.port_id \u003d\u003d port[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4ig%3D","line":107,"in_reply_to":"AAAAMX%2F%2F5h8%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":22,"context_line":"from quantum.db import securitygroups_db as sg_db"},{"line_number":23,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F21w%3D","line":25,"updated":"2012-12-12 11:48:04.000000000","message":"Unnecesary new line","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":22,"context_line":"from quantum.db import securitygroups_db as sg_db"},{"line_number":23,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0vQ%3D","line":25,"in_reply_to":"AAAAMX%2F%2F21w%3D","updated":"2012-12-13 23:22:28.000000000","message":"Done","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        ports \u003d {}"},{"line_number":82,"context_line":"        for device in devices:"},{"line_number":83,"context_line":"            port \u003d self.get_port_from_device(device)"},{"line_number":84,"context_line":"            if not port:"},{"line_number":85,"context_line":"                continue"},{"line_number":86,"context_line":"            if port[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F21s%3D","line":83,"updated":"2012-12-12 11:48:04.000000000","message":"Is it possible to use port.list with files for the device?","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        ports \u003d {}"},{"line_number":82,"context_line":"        for device in devices:"},{"line_number":83,"context_line":"            port \u003d self.get_port_from_device(device)"},{"line_number":84,"context_line":"            if not port:"},{"line_number":85,"context_line":"                continue"},{"line_number":86,"context_line":"            if port[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0u8%3D","line":83,"in_reply_to":"AAAAMX%2F%2F21s%3D","updated":"2012-12-13 23:22:28.000000000","message":"May I ask more? I didn\u0027t get your intension.","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":192,"context_line":"                    port[\u0027security_group_rules\u0027].append(default_egress_rule)"},{"line_number":193,"context_line":"                    return"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def _add_ingress_dhcp_rule(self, port, ips):"},{"line_number":196,"context_line":"        dhcp_ip \u003d ips.get(port[\u0027network_id\u0027])"},{"line_number":197,"context_line":"        if not dhcp_ip:"},{"line_number":198,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F21Y%3D","line":195,"updated":"2012-12-12 11:48:04.000000000","message":"Questions:-\n1. Could it be better to determine if the v4 flag is from the subnet?\n2. Should we look at the subnet to determine if the dhcp is enabled? Or is this not relevant?\n3. Looking forward if we want to be able to use multiple DHCP agents, for example HA, do we want to hard code the IP\u0027s?","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":192,"context_line":"                    port[\u0027security_group_rules\u0027].append(default_egress_rule)"},{"line_number":193,"context_line":"                    return"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def _add_ingress_dhcp_rule(self, port, ips):"},{"line_number":196,"context_line":"        dhcp_ip \u003d ips.get(port[\u0027network_id\u0027])"},{"line_number":197,"context_line":"        if not dhcp_ip:"},{"line_number":198,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0uo%3D","line":195,"in_reply_to":"AAAAMX%2F%2F21Y%3D","updated":"2012-12-13 23:22:28.000000000","message":"1. it is possible but it costs extra one rpc request.\n2. This implements get all port which is used in dhcp.( L:138 _select_dhcp_ips_for_network_ids) . There are no port will be owned if dhcp is disabled, so this case is no problem\n3. This implements get all port which is used in dhcp.( L:138 _select_dhcp_ips_for_network_ids)  So even if there are multiple dhcp ip, it will be in the provider rule. \nAnyway, we need list of ips to allow dhcp traffic in iptables, and it should be written in the rule.\n\nRelated with 3, i found i should notify if dhcp port is added.\nI\u0027ll add this rpc call also.","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":212,"context_line":"        port[\u0027security_group_rules\u0027].append(dhcp_rule)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def _add_ingress_ra_rule(self, port, ips):"},{"line_number":215,"context_line":"        ra_ip \u003d ips.get(port[\u0027network_id\u0027])"},{"line_number":216,"context_line":"        if not ra_ip:"},{"line_number":217,"context_line":"            return"},{"line_number":218,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F21U%3D","line":215,"updated":"2012-12-12 11:48:04.000000000","message":"Same as above","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":212,"context_line":"        port[\u0027security_group_rules\u0027].append(dhcp_rule)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def _add_ingress_ra_rule(self, port, ips):"},{"line_number":215,"context_line":"        ra_ip \u003d ips.get(port[\u0027network_id\u0027])"},{"line_number":216,"context_line":"        if not ra_ip:"},{"line_number":217,"context_line":"            return"},{"line_number":218,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0uA%3D","line":215,"in_reply_to":"AAAAMX%2F%2F21U%3D","updated":"2012-12-13 23:22:28.000000000","message":"replied","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":85,"context_line":"            if port[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"},{"line_number":86,"context_line":"                continue"},{"line_number":87,"context_line":"            ports[port[\u0027id\u0027]] \u003d port"},{"line_number":88,"context_line":"        return self._security_group_rules_for_ports(context, ports)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def _select_rules_for_ports(self, context, ports):"},{"line_number":91,"context_line":"        if not ports:"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5Ic%3D","line":88,"updated":"2012-12-24 16:21:43.000000000","message":"why call the function if the ports have not been updated? lines 91-92","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0bc18015e3d536f5ee96cde585602c4361768c55","unresolved":false,"context_lines":[{"line_number":234,"context_line":"            self._add_default_egress_rule(port, q_const.IPv4, ips)"},{"line_number":235,"context_line":"            self._add_default_egress_rule(port, q_const.IPv6, ips)"},{"line_number":236,"context_line":"            self._add_ingress_ra_rule(port, ips)"},{"line_number":237,"context_line":"            self._add_ingress_dhcp_rule(port, ips)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    def _security_group_rules_for_ports(self, context, ports):"},{"line_number":240,"context_line":"        rules_in_db \u003d self._select_rules_for_ports(context, ports)"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F450%3D","line":237,"updated":"2012-12-25 09:10:49.000000000","message":"Why we add those default rules in code? Can we add those rules in db as default securitygroups?","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":234,"context_line":"            self._add_default_egress_rule(port, q_const.IPv4, ips)"},{"line_number":235,"context_line":"            self._add_default_egress_rule(port, q_const.IPv6, ips)"},{"line_number":236,"context_line":"            self._add_ingress_ra_rule(port, ips)"},{"line_number":237,"context_line":"            self._add_ingress_dhcp_rule(port, ips)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    def _security_group_rules_for_ports(self, context, ports):"},{"line_number":240,"context_line":"        rules_in_db \u003d self._select_rules_for_ports(context, ports)"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4iU%3D","line":237,"in_reply_to":"AAAAM3%2F%2F450%3D","updated":"2012-12-26 19:15:41.000000000","message":"current db model didn\u0027t support this.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0bc18015e3d536f5ee96cde585602c4361768c55","unresolved":false,"context_lines":[{"line_number":248,"context_line":"                \u0027ethertype\u0027: rule_in_db[\u0027ethertype\u0027],"},{"line_number":249,"context_line":"            }"},{"line_number":250,"context_line":"            for key in (\u0027protocol\u0027, \u0027port_range_min\u0027, \u0027port_range_max\u0027,"},{"line_number":251,"context_line":"                        \u0027source_ip_prefix\u0027, \u0027source_group_id\u0027):"},{"line_number":252,"context_line":"                if rule_in_db.get(key):"},{"line_number":253,"context_line":"                    if key \u003d\u003d \u0027source_ip_prefix\u0027 and direction \u003d\u003d \u0027egress\u0027:"},{"line_number":254,"context_line":"                        rule_dict[\u0027dest_ip_prefix\u0027] \u003d rule_in_db[key]"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F454%3D","line":251,"updated":"2012-12-25 09:10:49.000000000","message":"Except source_ip_prefix, what\u0027s different assgin those attr as line 245-249? How about just assgin those attr as line 245-249?","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":248,"context_line":"                \u0027ethertype\u0027: rule_in_db[\u0027ethertype\u0027],"},{"line_number":249,"context_line":"            }"},{"line_number":250,"context_line":"            for key in (\u0027protocol\u0027, \u0027port_range_min\u0027, \u0027port_range_max\u0027,"},{"line_number":251,"context_line":"                        \u0027source_ip_prefix\u0027, \u0027source_group_id\u0027):"},{"line_number":252,"context_line":"                if rule_in_db.get(key):"},{"line_number":253,"context_line":"                    if key \u003d\u003d \u0027source_ip_prefix\u0027 and direction \u003d\u003d \u0027egress\u0027:"},{"line_number":254,"context_line":"                        rule_dict[\u0027dest_ip_prefix\u0027] \u003d rule_in_db[key]"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4iY%3D","line":251,"in_reply_to":"AAAAM3%2F%2F454%3D","updated":"2012-12-26 19:15:41.000000000","message":"This is because these parameter\u0027s are not mandatory one.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0bc18015e3d536f5ee96cde585602c4361768c55","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        if not ra_ip:"},{"line_number":220,"context_line":"            return"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        if not netaddr.IPAddress(ra_ip).version \u003d\u003d 6:"},{"line_number":223,"context_line":"            return"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        ra_rule \u003d {\u0027direction\u0027: \u0027ingress\u0027,"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAM3%2F%2F4SA%3D","line":222,"updated":"2012-12-27 10:41:55.000000000","message":"Hi, Nachi, When I try this patchset I got exception at here:\nhttp://pastebin.com/w0FNmpLn\n\nIt because ips.get(port[\u0027network_id\u0027]) return a list ip, not just one ip in this version.","commit_id":"6932aef866e0b47ed2149d23adac8439eb4c6b73"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":82,"context_line":"            port \u003d self.get_port_from_device(device)"},{"line_number":83,"context_line":"            if not port:"},{"line_number":84,"context_line":"                continue"},{"line_number":85,"context_line":"            if port[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"},{"line_number":86,"context_line":"                continue"},{"line_number":87,"context_line":"            ports[port[\u0027id\u0027]] \u003d port"},{"line_number":88,"context_line":"        return self._security_group_rules_for_ports(context, ports)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2FygM%3D","line":85,"updated":"2013-01-04 22:50:12.000000000","message":"Ditto comment about assumption about device_owner.","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":82,"context_line":"            port \u003d self.get_port_from_device(device)"},{"line_number":83,"context_line":"            if not port:"},{"line_number":84,"context_line":"                continue"},{"line_number":85,"context_line":"            if port[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"},{"line_number":86,"context_line":"                continue"},{"line_number":87,"context_line":"            ports[port[\u0027id\u0027]] \u003d port"},{"line_number":88,"context_line":"        return self._security_group_rules_for_ports(context, ports)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx5w%3D","line":85,"in_reply_to":"AAAAM3%2F%2FygM%3D","updated":"2013-01-05 07:42:11.000000000","message":"replied","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":183,"context_line":"        return ports"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def _add_default_egress_rule(self, port, ethertype, ips):"},{"line_number":186,"context_line":"            # add default egress rule"},{"line_number":187,"context_line":"            egress_rule \u003d [r for r in port[\u0027security_group_rules\u0027]"},{"line_number":188,"context_line":"                           if (r[\u0027direction\u0027] \u003d\u003d \u0027egress\u0027 and"},{"line_number":189,"context_line":"                               r[\u0027ethertype\u0027] \u003d\u003d ethertype)]"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2FygE%3D","line":186,"updated":"2013-01-04 22:50:12.000000000","message":"nit remove or make better docstring. Comment is the same name as the function.","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":183,"context_line":"        return ports"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def _add_default_egress_rule(self, port, ethertype, ips):"},{"line_number":186,"context_line":"            # add default egress rule"},{"line_number":187,"context_line":"            egress_rule \u003d [r for r in port[\u0027security_group_rules\u0027]"},{"line_number":188,"context_line":"                           if (r[\u0027direction\u0027] \u003d\u003d \u0027egress\u0027 and"},{"line_number":189,"context_line":"                               r[\u0027ethertype\u0027] \u003d\u003d ethertype)]"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx5s%3D","line":186,"in_reply_to":"AAAAM3%2F%2FygE%3D","updated":"2013-01-05 07:42:11.000000000","message":"Done","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"}],"quantum/extensions/securitygroup.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class SecurityGroupInvalidDeviceOwner(qexception.InvalidInput):"},{"line_number":44,"context_line":"    message \u003d _(\"Security Group can\u0027t be applied for ports for dhcp or router\")"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class SecurityGroupInUse(qexception.InUse):"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F21Q%3D","line":44,"updated":"2012-12-12 11:48:04.000000000","message":"Consider: Security Group can\u0027t be applied to dhcp or router ports.","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class SecurityGroupInvalidDeviceOwner(qexception.InvalidInput):"},{"line_number":44,"context_line":"    message \u003d _(\"Security Group can\u0027t be applied for ports for dhcp or router\")"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class SecurityGroupInUse(qexception.InUse):"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0tw%3D","line":44,"in_reply_to":"AAAAMX%2F%2F21Q%3D","updated":"2012-12-13 23:22:28.000000000","message":"Done","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class SecurityGroupInvalidDeviceOwner(qexception.InvalidInput):"},{"line_number":44,"context_line":"    message \u003d _(\"Security Group can\u0027t be applied to dhcp or router ports.\")"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class SecurityGroupInUse(qexception.InUse):"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAM3%2F%2FxOI%3D","line":44,"updated":"2013-01-06 18:20:26.000000000","message":"\u0027network:*\u0027 ports are not limited to dhcp and router ports, so it is better to change the message to \"network ports\" or something.","commit_id":"6a4ad8f054e8f02310a848fd8f7d61c575fb71b2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class SecurityGroupInvalidDeviceOwner(qexception.InvalidInput):"},{"line_number":44,"context_line":"    message \u003d _(\"Security Group can\u0027t be applied to dhcp or router ports.\")"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class SecurityGroupInUse(qexception.InUse):"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAM3%2F%2FxKg%3D","line":44,"in_reply_to":"AAAAM3%2F%2FxOI%3D","updated":"2013-01-06 20:22:11.000000000","message":"Done","commit_id":"6a4ad8f054e8f02310a848fd8f7d61c575fb71b2"}],"quantum/plugins/linuxbridge/agent/linuxbridge_quantum_agent.py":[{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"change_message_id":"52d11f5af4718fc1af23dbbcbb82d22e621008b2","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from quantum.agent.linux import ip_lib"},{"line_number":33,"context_line":"from quantum.agent.linux import utils"},{"line_number":34,"context_line":"from quantum.agent import rpc as agent_rpc"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"from quantum.common import config as logging_config"},{"line_number":37,"context_line":"from quantum.common import constants"},{"line_number":38,"context_line":"from quantum.common import topics"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F5%2Fg%3D","line":35,"updated":"2012-11-16 05:02:28.000000000","message":"This line needs to be deleted","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from quantum.agent.linux import ip_lib"},{"line_number":33,"context_line":"from quantum.agent.linux import utils"},{"line_number":34,"context_line":"from quantum.agent import rpc as agent_rpc"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"from quantum.common import config as logging_config"},{"line_number":37,"context_line":"from quantum.common import constants"},{"line_number":38,"context_line":"from quantum.common import topics"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F55k%3D","line":35,"in_reply_to":"AAAAMH%2F%2F5%2Fg%3D","updated":"2012-11-16 07:31:27.000000000","message":"Done","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":32,"context_line":"from quantum.agent.linux import ip_lib"},{"line_number":33,"context_line":"from quantum.agent.linux import utils"},{"line_number":34,"context_line":"from quantum.agent import rpc as agent_rpc"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"from quantum.common import config as logging_config"},{"line_number":37,"context_line":"from quantum.common import constants"},{"line_number":38,"context_line":"from quantum.common import topics"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5sc%3D","line":35,"updated":"2012-11-16 13:45:01.000000000","message":"Remove this line.","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from quantum.agent.linux import ip_lib"},{"line_number":33,"context_line":"from quantum.agent.linux import utils"},{"line_number":34,"context_line":"from quantum.agent import rpc as agent_rpc"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"from quantum.common import config as logging_config"},{"line_number":37,"context_line":"from quantum.common import constants"},{"line_number":38,"context_line":"from quantum.common import topics"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F44E%3D","line":35,"in_reply_to":"AAAAMH%2F%2F5sc%3D","updated":"2012-11-16 22:35:48.000000000","message":"Done","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":406,"context_line":""},{"line_number":407,"context_line":"    # Set RPC API version to 1.0 by default."},{"line_number":408,"context_line":"    # history"},{"line_number":409,"context_line":"    #   1.1 Support Secuirty Group RPC"},{"line_number":410,"context_line":"    RPC_API_VERSION \u003d \u00271.1\u0027"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def __init__(self, context, agent):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5oM%3D","line":409,"updated":"2012-11-16 14:43:35.000000000","message":"Typo \u003d\u003e secuirty","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":406,"context_line":""},{"line_number":407,"context_line":"    # Set RPC API version to 1.0 by default."},{"line_number":408,"context_line":"    # history"},{"line_number":409,"context_line":"    #   1.1 Support Secuirty Group RPC"},{"line_number":410,"context_line":"    RPC_API_VERSION \u003d \u00271.1\u0027"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def __init__(self, context, agent):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5NI%3D","line":409,"in_reply_to":"AAAAMH%2F%2F5oM%3D","updated":"2012-11-16 22:35:48.000000000","message":"Done","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":543,"context_line":""},{"line_number":544,"context_line":"    def treat_devices_added(self, devices):"},{"line_number":545,"context_line":"        resync \u003d False"},{"line_number":546,"context_line":"        self.prepare_devices_filter(devices)"},{"line_number":547,"context_line":"        for device in devices:"},{"line_number":548,"context_line":"            LOG.info(\"Port %s added\", device)"},{"line_number":549,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4Og%3D","line":546,"updated":"2012-11-18 15:23:54.000000000","message":"What if there are no security groups? Is there a global flag fr this?","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":543,"context_line":""},{"line_number":544,"context_line":"    def treat_devices_added(self, devices):"},{"line_number":545,"context_line":"        resync \u003d False"},{"line_number":546,"context_line":"        self.prepare_devices_filter(devices)"},{"line_number":547,"context_line":"        for device in devices:"},{"line_number":548,"context_line":"            LOG.info(\"Port %s added\", device)"},{"line_number":549,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4Jg%3D","line":546,"in_reply_to":"AAAAMH%2F%2F4Og%3D","updated":"2012-11-18 21:54:20.000000000","message":"We can\u0027t disable security group function here, because server side plugin extension can\u0027t be configurable.","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":622,"context_line":"def main():"},{"line_number":623,"context_line":"    eventlet.monkey_patch()"},{"line_number":624,"context_line":"    cfg.CONF(args\u003dsys.argv, project\u003d\u0027quantum\u0027)"},{"line_number":625,"context_line":"    # (TODO) gary - swap with common logging"},{"line_number":626,"context_line":"    logging_config.setup_logging(cfg.CONF)"},{"line_number":627,"context_line":"    interface_mappings \u003d {}"},{"line_number":628,"context_line":"    for mapping in cfg.CONF.LINUX_BRIDGE.physical_interface_mappings:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4OY%3D","line":625,"updated":"2012-11-18 15:23:54.000000000","message":"If you are touching this file can you please drop this comment. Yong has done the common logging :)","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":622,"context_line":"def main():"},{"line_number":623,"context_line":"    eventlet.monkey_patch()"},{"line_number":624,"context_line":"    cfg.CONF(args\u003dsys.argv, project\u003d\u0027quantum\u0027)"},{"line_number":625,"context_line":"    # (TODO) gary - swap with common logging"},{"line_number":626,"context_line":"    logging_config.setup_logging(cfg.CONF)"},{"line_number":627,"context_line":"    interface_mappings \u003d {}"},{"line_number":628,"context_line":"    for mapping in cfg.CONF.LINUX_BRIDGE.physical_interface_mappings:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4Jc%3D","line":625,"in_reply_to":"AAAAMH%2F%2F4OY%3D","updated":"2012-11-18 21:54:20.000000000","message":"Sure :)","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":571,"context_line":""},{"line_number":572,"context_line":"    def treat_devices_removed(self, devices):"},{"line_number":573,"context_line":"        resync \u003d False"},{"line_number":574,"context_line":"        self.remove_devices_filter(devices)"},{"line_number":575,"context_line":"        for device in devices:"},{"line_number":576,"context_line":"            LOG.info(\"Attachment %s removed\", device)"},{"line_number":577,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3TI%3D","line":574,"updated":"2012-11-19 19:24:55.000000000","message":"Does remove_devices_filter() need to be executed after removing devices? (in treat_devices_added(), we first call prepare_devices_filter and then handling ports.)","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":571,"context_line":""},{"line_number":572,"context_line":"    def treat_devices_removed(self, devices):"},{"line_number":573,"context_line":"        resync \u003d False"},{"line_number":574,"context_line":"        self.remove_devices_filter(devices)"},{"line_number":575,"context_line":"        for device in devices:"},{"line_number":576,"context_line":"            LOG.info(\"Attachment %s removed\", device)"},{"line_number":577,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F23w%3D","line":574,"in_reply_to":"AAAAMH%2F%2F3TI%3D","updated":"2012-11-19 23:05:06.000000000","message":"We should remove chain for the port. In L574 device is already removed, so we should also remove the port.\nI\u0027m not sure I\u0027m answering your question here.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    def treat_devices_added(self, devices):"},{"line_number":524,"context_line":"        resync \u003d False"},{"line_number":525,"context_line":"        self.prepare_devices_filter(devices)"},{"line_number":526,"context_line":"        for device in devices:"},{"line_number":527,"context_line":"            LOG.debug(\"Port %s added\", device)"},{"line_number":528,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2FyEU%3D","line":525,"updated":"2012-11-25 09:53:57.000000000","message":"I am not sure that this is the correct place for this function. The treat_devices_added takes care of all new devices detected on the host. In some cases these devices may not be \"owned\" by the linux bridge. We do not want those devices to be treated by the security groups. \nThis should maybe be done after the loop iteration with only those devices added treated. Does this make sense?","commit_id":"5fce24277fd0a176c6baa9a0a7c25d1401c3b39c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    def treat_devices_added(self, devices):"},{"line_number":524,"context_line":"        resync \u003d False"},{"line_number":525,"context_line":"        self.prepare_devices_filter(devices)"},{"line_number":526,"context_line":"        for device in devices:"},{"line_number":527,"context_line":"            LOG.debug(\"Port %s added\", device)"},{"line_number":528,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2FxHM%3D","line":525,"in_reply_to":"AAAAMH%2F%2FyEU%3D","updated":"2012-11-26 19:51:10.000000000","message":"This method calls get_device_details in server side, so we are using same validation in the 529. \nI suppose it is more efficient to query security groups for multiple devices at once.","commit_id":"5fce24277fd0a176c6baa9a0a7c25d1401c3b39c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":550,"context_line":""},{"line_number":551,"context_line":"    def treat_devices_removed(self, devices):"},{"line_number":552,"context_line":"        resync \u003d False"},{"line_number":553,"context_line":"        self.remove_devices_filter(devices)"},{"line_number":554,"context_line":"        for device in devices:"},{"line_number":555,"context_line":"            LOG.info(\"Attachment %s removed\", device)"},{"line_number":556,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2FyEQ%3D","line":553,"updated":"2012-11-25 09:53:57.000000000","message":"Same point here.","commit_id":"5fce24277fd0a176c6baa9a0a7c25d1401c3b39c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":550,"context_line":""},{"line_number":551,"context_line":"    def treat_devices_removed(self, devices):"},{"line_number":552,"context_line":"        resync \u003d False"},{"line_number":553,"context_line":"        self.remove_devices_filter(devices)"},{"line_number":554,"context_line":"        for device in devices:"},{"line_number":555,"context_line":"            LOG.info(\"Attachment %s removed\", device)"},{"line_number":556,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2FxHI%3D","line":553,"in_reply_to":"AAAAMH%2F%2FyEQ%3D","updated":"2012-11-26 19:51:10.000000000","message":"same explanation","commit_id":"5fce24277fd0a176c6baa9a0a7c25d1401c3b39c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":394,"context_line":"    # Set RPC API version to 1.0 by default."},{"line_number":395,"context_line":"    # history"},{"line_number":396,"context_line":"    #   1.1 Support Security Group RPC"},{"line_number":397,"context_line":"    RPC_API_VERSION \u003d \u00271.1\u0027"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    def __init__(self, context, agent):"},{"line_number":400,"context_line":"        self.context \u003d context"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F21I%3D","line":397,"updated":"2012-12-12 11:48:04.000000000","message":"I am not sure that we need to change this. I think that it is only if there are API updates, that is, in v1.0 dict A was passed and in 1.1 dict B is passed.","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":394,"context_line":"    # Set RPC API version to 1.0 by default."},{"line_number":395,"context_line":"    # history"},{"line_number":396,"context_line":"    #   1.1 Support Security Group RPC"},{"line_number":397,"context_line":"    RPC_API_VERSION \u003d \u00271.1\u0027"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    def __init__(self, context, agent):"},{"line_number":400,"context_line":"        self.context \u003d context"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0ts%3D","line":397,"in_reply_to":"AAAAMX%2F%2F21I%3D","updated":"2012-12-13 23:22:28.000000000","message":"I suppose we should version up also when we add new API.\nbecause version 1.1 client can\u0027t use version 1.0 server.","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":529,"context_line":""},{"line_number":530,"context_line":"    def treat_devices_added(self, devices):"},{"line_number":531,"context_line":"        resync \u003d False"},{"line_number":532,"context_line":"        self.prepare_devices_filter(devices)"},{"line_number":533,"context_line":"        for device in devices:"},{"line_number":534,"context_line":"            LOG.debug(_(\"Port %s added\"), device)"},{"line_number":535,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F21E%3D","line":532,"updated":"2012-12-12 11:48:04.000000000","message":"Not sure if this is the correct place for this. Say for example in the loop below there is an exception. This will mean that firewall rules have been created for a device that was not added to the network.","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":529,"context_line":""},{"line_number":530,"context_line":"    def treat_devices_added(self, devices):"},{"line_number":531,"context_line":"        resync \u003d False"},{"line_number":532,"context_line":"        self.prepare_devices_filter(devices)"},{"line_number":533,"context_line":"        for device in devices:"},{"line_number":534,"context_line":"            LOG.debug(_(\"Port %s added\"), device)"},{"line_number":535,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0s0%3D","line":532,"in_reply_to":"AAAAMX%2F%2F21E%3D","updated":"2012-12-13 23:22:28.000000000","message":"We should add filtering rule before connecting the device to the network.\nthe loop may raise two kind of exception:\n (1) there are no port exist\n   -\u003e in this case prepare_devices_filter will not add filtering rule\n (2) failure for add_interface\n  -\u003e in this case, treat_device_added called again, and firewall rule will be setup again.\nso I this is no problem.","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":559,"context_line":""},{"line_number":560,"context_line":"    def treat_devices_removed(self, devices):"},{"line_number":561,"context_line":"        resync \u003d False"},{"line_number":562,"context_line":"        self.remove_devices_filter(devices)"},{"line_number":563,"context_line":"        for device in devices:"},{"line_number":564,"context_line":"            LOG.info(_(\"Attachment %s removed\"), device)"},{"line_number":565,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F21A%3D","line":562,"updated":"2012-12-12 11:48:04.000000000","message":"Ditto","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":559,"context_line":""},{"line_number":560,"context_line":"    def treat_devices_removed(self, devices):"},{"line_number":561,"context_line":"        resync \u003d False"},{"line_number":562,"context_line":"        self.remove_devices_filter(devices)"},{"line_number":563,"context_line":"        for device in devices:"},{"line_number":564,"context_line":"            LOG.info(_(\"Attachment %s removed\"), device)"},{"line_number":565,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0so%3D","line":562,"in_reply_to":"AAAAMX%2F%2F21A%3D","updated":"2012-12-13 23:22:28.000000000","message":"treat_devies_removed called when the device disappear.\nso we should remote the filter even if following loop raise exceptions.\nso I think here is correct place","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":394,"context_line":"    # Set RPC API version to 1.0 by default."},{"line_number":395,"context_line":"    # history"},{"line_number":396,"context_line":"    #   1.1 Support Security Group RPC"},{"line_number":397,"context_line":"    RPC_API_VERSION \u003d \u00271.1\u0027"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    def __init__(self, context, agent):"},{"line_number":400,"context_line":"        self.context \u003d context"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5II%3D","line":397,"updated":"2012-12-24 16:21:43.000000000","message":"If we do not change the way that the messages are built then we do not need to update the version.\nIf the version is updated then why do we still not have code for 1.0?\nThe purpose of this is the be able to have agents that work with version 1.0 and 1.1.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":394,"context_line":"    # Set RPC API version to 1.0 by default."},{"line_number":395,"context_line":"    # history"},{"line_number":396,"context_line":"    #   1.1 Support Security Group RPC"},{"line_number":397,"context_line":"    RPC_API_VERSION \u003d \u00271.1\u0027"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    def __init__(self, context, agent):"},{"line_number":400,"context_line":"        self.context \u003d context"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4hc%3D","line":397,"in_reply_to":"AAAAM3%2F%2F5II%3D","updated":"2012-12-26 19:15:41.000000000","message":"version 1.1 is backward compatible with version1.0. so It is no need to have 1.0 specific code here.\nFor me, we should update the version if we add the new API.\nBut I\u0027m not sure the policy in the community. Let\u0027s discuss this in the ML","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":529,"context_line":""},{"line_number":530,"context_line":"    def treat_devices_added(self, devices):"},{"line_number":531,"context_line":"        resync \u003d False"},{"line_number":532,"context_line":"        self.prepare_devices_filter(devices)"},{"line_number":533,"context_line":"        for device in devices:"},{"line_number":534,"context_line":"            LOG.debug(_(\"Port %s added\"), device)"},{"line_number":535,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5IA%3D","line":532,"updated":"2012-12-24 16:21:43.000000000","message":"Please consider removing this and do a specific device filter - look at line 549.\nDo we need to do anything specific if the port status is down?","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0bc18015e3d536f5ee96cde585602c4361768c55","unresolved":false,"context_lines":[{"line_number":529,"context_line":""},{"line_number":530,"context_line":"    def treat_devices_added(self, devices):"},{"line_number":531,"context_line":"        resync \u003d False"},{"line_number":532,"context_line":"        self.prepare_devices_filter(devices)"},{"line_number":533,"context_line":"        for device in devices:"},{"line_number":534,"context_line":"            LOG.debug(_(\"Port %s added\"), device)"},{"line_number":535,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F45s%3D","line":532,"updated":"2012-12-25 09:10:49.000000000","message":"in \u0027prepare_devices_filter\u0027 we invoke \u0027security_group_rules_for_devices\u0027. But \u0027security_group_rules_for_devices\u0027 looks like same as what \u0027get_device_details\u0027 doing? How about use \u0027get_device_details\u0027 instead of \u0027security_group_rules_for_devices\u0027?\n\nThen prepare each device filter after line 538?","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":529,"context_line":""},{"line_number":530,"context_line":"    def treat_devices_added(self, devices):"},{"line_number":531,"context_line":"        resync \u003d False"},{"line_number":532,"context_line":"        self.prepare_devices_filter(devices)"},{"line_number":533,"context_line":"        for device in devices:"},{"line_number":534,"context_line":"            LOG.debug(_(\"Port %s added\"), device)"},{"line_number":535,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4hI%3D","line":532,"in_reply_to":"AAAAM3%2F%2F45s%3D","updated":"2012-12-26 19:15:41.000000000","message":"I understand what\u0027 you are saying. security_group_rules_for_devices is doing building rules for each devices and it is a kind of db intensive operation such as building ip list for source_id. If we request these value with same query, we can remove unnecessary query in server side. \nMay I ask why we should remove security group rule if the port is down? If there are no benefit, we should keep the code simple.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":559,"context_line":""},{"line_number":560,"context_line":"    def treat_devices_removed(self, devices):"},{"line_number":561,"context_line":"        resync \u003d False"},{"line_number":562,"context_line":"        self.remove_devices_filter(devices)"},{"line_number":563,"context_line":"        for device in devices:"},{"line_number":564,"context_line":"            LOG.info(_(\"Attachment %s removed\"), device)"},{"line_number":565,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5H8%3D","line":562,"updated":"2012-12-24 16:21:43.000000000","message":"Same as comment in line 532.","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":559,"context_line":""},{"line_number":560,"context_line":"    def treat_devices_removed(self, devices):"},{"line_number":561,"context_line":"        resync \u003d False"},{"line_number":562,"context_line":"        self.remove_devices_filter(devices)"},{"line_number":563,"context_line":"        for device in devices:"},{"line_number":564,"context_line":"            LOG.info(_(\"Attachment %s removed\"), device)"},{"line_number":565,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4g8%3D","line":562,"in_reply_to":"AAAAM3%2F%2F5H8%3D","updated":"2012-12-26 19:15:41.000000000","message":"discussed in above comment","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"}],"quantum/plugins/linuxbridge/db/l2network_db_v2.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":204,"context_line":"                          sg_db.SecurityGroupPortBinding.security_group_id)"},{"line_number":205,"context_line":"    query \u003d query.outerjoin(sg_db.SecurityGroupPortBinding,"},{"line_number":206,"context_line":"                            models_v2.Port.id \u003d\u003d sg_binding_port)"},{"line_number":207,"context_line":"    query \u003d query.filter(models_v2.Port.id.startswith(device))"},{"line_number":208,"context_line":"    port_and_sgs \u003d query.all()"},{"line_number":209,"context_line":"    if not port_and_sgs:"},{"line_number":210,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F1FA%3D","line":207,"updated":"2012-12-13 18:59:05.000000000","message":"This method looks up a port whose id begins with device name and retrieves sgids for the port. I don\u0027t know why we need to use outerjoin. Is there any performance issue? The following logic seems to work to me and it is simple and easy to understand.\n\n1. look up a port for the device\n2. make port_dict (_make_port_dict in db_base_plugin_v2 does very similar things)\n3. look up sgids for the port\n4. add security_groups to the port_dict","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":204,"context_line":"                          sg_db.SecurityGroupPortBinding.security_group_id)"},{"line_number":205,"context_line":"    query \u003d query.outerjoin(sg_db.SecurityGroupPortBinding,"},{"line_number":206,"context_line":"                            models_v2.Port.id \u003d\u003d sg_binding_port)"},{"line_number":207,"context_line":"    query \u003d query.filter(models_v2.Port.id.startswith(device))"},{"line_number":208,"context_line":"    port_and_sgs \u003d query.all()"},{"line_number":209,"context_line":"    if not port_and_sgs:"},{"line_number":210,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0sk%3D","line":207,"in_reply_to":"AAAAMX%2F%2F1FA%3D","updated":"2012-12-13 23:22:28.000000000","message":"I got a concern for performance by Yong, so I choose this way. By this join, we can reduce number of query.","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":209,"context_line":"    if not port_and_sgs:"},{"line_number":210,"context_line":"        return"},{"line_number":211,"context_line":"    port \u003d port_and_sgs[0][0]"},{"line_number":212,"context_line":"    port_dict \u003d {}"},{"line_number":213,"context_line":"    port_dict[\u0027security_groups\u0027] \u003d []"},{"line_number":214,"context_line":"    for port_in_db, sg_id in port_and_sgs:"},{"line_number":215,"context_line":"        if sg_id:"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F20s%3D","line":212,"updated":"2012-12-12 11:48:04.000000000","message":"Consider:\nport_dict \u003d { \u0027id\u0027 : port[\u0027id\u0027],\n                      \u0027admin_state_up\u0027: port[\u0027admin_state_up\u0027]\n....\nAny reason not to use _make_port_dict?","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":209,"context_line":"    if not port_and_sgs:"},{"line_number":210,"context_line":"        return"},{"line_number":211,"context_line":"    port \u003d port_and_sgs[0][0]"},{"line_number":212,"context_line":"    port_dict \u003d {}"},{"line_number":213,"context_line":"    port_dict[\u0027security_groups\u0027] \u003d []"},{"line_number":214,"context_line":"    for port_in_db, sg_id in port_and_sgs:"},{"line_number":215,"context_line":"        if sg_id:"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0sQ%3D","line":212,"in_reply_to":"AAAAMX%2F%2F20s%3D","updated":"2012-12-13 23:22:28.000000000","message":"Done","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"}],"quantum/plugins/linuxbridge/lb_quantum_plugin.py":[{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"change_message_id":"52d11f5af4718fc1af23dbbcbb82d22e621008b2","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from quantum.db import models_v2"},{"line_number":27,"context_line":"from quantum.db import securitygroups_db"},{"line_number":28,"context_line":"from quantum.db import securitygroups_rpc_base as sg_rpc"},{"line_number":29,"context_line":"from quantum.extensions import securitygroup as ext_sg"},{"line_number":30,"context_line":"from quantum.extensions import providernet as provider"},{"line_number":31,"context_line":"from quantum.openstack.common import cfg"},{"line_number":32,"context_line":"from quantum.openstack.common import context"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F6Dw%3D","line":29,"updated":"2012-11-16 05:02:28.000000000","message":"This import should be placed between lines 30 and 31","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from quantum.db import models_v2"},{"line_number":27,"context_line":"from quantum.db import securitygroups_db"},{"line_number":28,"context_line":"from quantum.db import securitygroups_rpc_base as sg_rpc"},{"line_number":29,"context_line":"from quantum.extensions import securitygroup as ext_sg"},{"line_number":30,"context_line":"from quantum.extensions import providernet as provider"},{"line_number":31,"context_line":"from quantum.openstack.common import cfg"},{"line_number":32,"context_line":"from quantum.openstack.common import context"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F55Y%3D","line":29,"in_reply_to":"AAAAMH%2F%2F6Dw%3D","updated":"2012-11-16 07:31:27.000000000","message":"Done","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":414,"context_line":"        return [self._fields(net, fields) for net in nets]"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"    def create_port(self, context, port):"},{"line_number":417,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, port[\u0027port\u0027])"},{"line_number":418,"context_line":"        default_sg \u003d self._ensure_default_security_group(context, tenant_id)"},{"line_number":419,"context_line":"        if not port[\u0027port\u0027].get(ext_sg.SECURITYGROUP):"},{"line_number":420,"context_line":"            port[\u0027port\u0027][ext_sg.SECURITYGROUP] \u003d [default_sg]"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5tU%3D","line":417,"updated":"2012-11-16 13:45:01.000000000","message":"L.417-421 is a common procedure for all core plugins, so we need to consider packing them into a method defined in db/security_groups.py. NVP plugin also does the same.","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":414,"context_line":"        return [self._fields(net, fields) for net in nets]"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"    def create_port(self, context, port):"},{"line_number":417,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, port[\u0027port\u0027])"},{"line_number":418,"context_line":"        default_sg \u003d self._ensure_default_security_group(context, tenant_id)"},{"line_number":419,"context_line":"        if not port[\u0027port\u0027].get(ext_sg.SECURITYGROUP):"},{"line_number":420,"context_line":"            port[\u0027port\u0027][ext_sg.SECURITYGROUP] \u003d [default_sg]"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5IM%3D","line":417,"in_reply_to":"AAAAMH%2F%2F5tU%3D","updated":"2012-11-16 22:35:48.000000000","message":"Done","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":416,"context_line":"    def create_port(self, context, port):"},{"line_number":417,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, port[\u0027port\u0027])"},{"line_number":418,"context_line":"        default_sg \u003d self._ensure_default_security_group(context, tenant_id)"},{"line_number":419,"context_line":"        if not port[\u0027port\u0027].get(ext_sg.SECURITYGROUP):"},{"line_number":420,"context_line":"            port[\u0027port\u0027][ext_sg.SECURITYGROUP] \u003d [default_sg]"},{"line_number":421,"context_line":"        self._validate_security_groups_on_port(context, port)"},{"line_number":422,"context_line":"        session \u003d context.session"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5tY%3D","line":419,"updated":"2012-11-16 13:45:01.000000000","message":"Consider the following:\nsgids \u003d port[\u0027port\u0027].get(ext_sg.SECURITYGROUP) or [default_sg]\n\nI don\u0027t think it need to update port[\u0027port\u0027][ext_sg.SECURITY_GROUP]. It is not referred later.","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":416,"context_line":"    def create_port(self, context, port):"},{"line_number":417,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, port[\u0027port\u0027])"},{"line_number":418,"context_line":"        default_sg \u003d self._ensure_default_security_group(context, tenant_id)"},{"line_number":419,"context_line":"        if not port[\u0027port\u0027].get(ext_sg.SECURITYGROUP):"},{"line_number":420,"context_line":"            port[\u0027port\u0027][ext_sg.SECURITYGROUP] \u003d [default_sg]"},{"line_number":421,"context_line":"        self._validate_security_groups_on_port(context, port)"},{"line_number":422,"context_line":"        session \u003d context.session"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5Kk%3D","line":419,"in_reply_to":"AAAAMH%2F%2F5tY%3D","updated":"2012-11-16 22:35:48.000000000","message":"Done\nport[\u0027port\u0027][ext_sg.SECURITY_GROUP] is used in _validate_security_groups_on_port","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":428,"context_line":"                                                     sgids)"},{"line_number":429,"context_line":"            self._extend_port_dict_security_group(context, port)"},{"line_number":430,"context_line":"        self.notifier.security_groups_member_updated("},{"line_number":431,"context_line":"            context, port.get(ext_sg.SECURITYGROUP))"},{"line_number":432,"context_line":"        return port"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"    def _check_updated(self, a, b):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5r8%3D","line":431,"updated":"2012-11-16 13:45:01.000000000","message":"notifier for security group is not specific to linux bridge plugin. \nIt may not be required for SDN-based plugin but it may be better to implement it as a common class. One idea is to define a sub-mixin class of SecurityGroupMix which supports RPC notification.","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":428,"context_line":"                                                     sgids)"},{"line_number":429,"context_line":"            self._extend_port_dict_security_group(context, port)"},{"line_number":430,"context_line":"        self.notifier.security_groups_member_updated("},{"line_number":431,"context_line":"            context, port.get(ext_sg.SECURITYGROUP))"},{"line_number":432,"context_line":"        return port"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"    def _check_updated(self, a, b):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F430%3D","line":431,"in_reply_to":"AAAAMH%2F%2F5r8%3D","updated":"2012-11-16 22:35:48.000000000","message":"I redesigned the classes\nCoud you check also\nhttps://docs.google.com/presentation/d/1nXzNXKIfCfotdav5BzkceDiOfDypEkvtTfVXCGdq6rY/edit#slide\u003did.g38c62e30_0_0 ?","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":444,"context_line":"        self._extend_port_dict_security_group(context, original_port)"},{"line_number":445,"context_line":"        session \u003d context.session"},{"line_number":446,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":447,"context_line":"            self._validate_security_groups_on_port(context, port)"},{"line_number":448,"context_line":"            # delete the port binding and read it with the new rules"},{"line_number":449,"context_line":"            self._delete_port_security_group_bindings(context, id)"},{"line_number":450,"context_line":"            self._process_port_create_security_group(context, id,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5tI%3D","line":447,"updated":"2012-11-16 13:45:01.000000000","message":"_validate_sg_on_port() is inside the session here but it is outside  a session in create_port(). There is actually no difference but we should do the same thing.","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":444,"context_line":"        self._extend_port_dict_security_group(context, original_port)"},{"line_number":445,"context_line":"        session \u003d context.session"},{"line_number":446,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":447,"context_line":"            self._validate_security_groups_on_port(context, port)"},{"line_number":448,"context_line":"            # delete the port binding and read it with the new rules"},{"line_number":449,"context_line":"            self._delete_port_security_group_bindings(context, id)"},{"line_number":450,"context_line":"            self._process_port_create_security_group(context, id,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5II%3D","line":447,"in_reply_to":"AAAAMH%2F%2F5tI%3D","updated":"2012-11-16 22:35:48.000000000","message":"Done","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":449,"context_line":"            self._delete_port_security_group_bindings(context, id)"},{"line_number":450,"context_line":"            self._process_port_create_security_group(context, id,"},{"line_number":451,"context_line":"                                                     port[\u0027port\u0027].get("},{"line_number":452,"context_line":"                                                     ext_sg.SECURITYGROUP))"},{"line_number":453,"context_line":"            port \u003d super(LinuxBridgePluginV2, self).update_port("},{"line_number":454,"context_line":"                context, id, port)"},{"line_number":455,"context_line":"            self._extend_port_dict_security_group(context, port)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5tM%3D","line":452,"updated":"2012-11-16 13:45:01.000000000","message":"Don\u0027t we need to take care of the case where ext_sg.SECURITY_GROUP is empty? (as create_port() does)","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":449,"context_line":"            self._delete_port_security_group_bindings(context, id)"},{"line_number":450,"context_line":"            self._process_port_create_security_group(context, id,"},{"line_number":451,"context_line":"                                                     port[\u0027port\u0027].get("},{"line_number":452,"context_line":"                                                     ext_sg.SECURITYGROUP))"},{"line_number":453,"context_line":"            port \u003d super(LinuxBridgePluginV2, self).update_port("},{"line_number":454,"context_line":"                context, id, port)"},{"line_number":455,"context_line":"            self._extend_port_dict_security_group(context, port)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5H0%3D","line":452,"in_reply_to":"AAAAMH%2F%2F5tM%3D","updated":"2012-11-16 22:35:48.000000000","message":"Need to be clarify the spec.\nSo we should let user setup empty security group or no?","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":483,"context_line":"            port \u003d self.get_port(context, id)"},{"line_number":484,"context_line":"            self._extend_port_dict_security_group(context, port)"},{"line_number":485,"context_line":"            super(LinuxBridgePluginV2, self).delete_port(context, id)"},{"line_number":486,"context_line":"            self._delete_port_security_group_bindings(context, id)"},{"line_number":487,"context_line":"            self.notifier.security_groups_member_updated("},{"line_number":488,"context_line":"                context, port.get(ext_sg.SECURITYGROUP))"},{"line_number":489,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5s8%3D","line":486,"updated":"2012-11-16 13:45:01.000000000","message":"Since security_group_binding table refers port_id, should we move it before delete_port()?","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":483,"context_line":"            port \u003d self.get_port(context, id)"},{"line_number":484,"context_line":"            self._extend_port_dict_security_group(context, port)"},{"line_number":485,"context_line":"            super(LinuxBridgePluginV2, self).delete_port(context, id)"},{"line_number":486,"context_line":"            self._delete_port_security_group_bindings(context, id)"},{"line_number":487,"context_line":"            self.notifier.security_groups_member_updated("},{"line_number":488,"context_line":"                context, port.get(ext_sg.SECURITYGROUP))"},{"line_number":489,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5Hc%3D","line":486,"in_reply_to":"AAAAMH%2F%2F5s8%3D","updated":"2012-11-16 22:35:48.000000000","message":"Done","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":492,"context_line":"        rule \u003d self.create_security_group_rule_bulk_native(context,"},{"line_number":493,"context_line":"                                                           bulk_rule)[0]"},{"line_number":494,"context_line":"        sgids \u003d [rule[\u0027security_group_id\u0027]]"},{"line_number":495,"context_line":"        self.notifier.security_groups_rule_updated(context, list(sgids))"},{"line_number":496,"context_line":"        return rule"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"    def create_security_group_rule_bulk(self, context,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5s4%3D","line":495,"updated":"2012-11-16 13:45:01.000000000","message":"sgids is already a list.\nI think it is more simple to pass \"[rule[\u0027security_group_id\u0027]]\" directly.","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":492,"context_line":"        rule \u003d self.create_security_group_rule_bulk_native(context,"},{"line_number":493,"context_line":"                                                           bulk_rule)[0]"},{"line_number":494,"context_line":"        sgids \u003d [rule[\u0027security_group_id\u0027]]"},{"line_number":495,"context_line":"        self.notifier.security_groups_rule_updated(context, list(sgids))"},{"line_number":496,"context_line":"        return rule"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"    def create_security_group_rule_bulk(self, context,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F44A%3D","line":495,"in_reply_to":"AAAAMH%2F%2F5s4%3D","updated":"2012-11-16 22:35:48.000000000","message":"Done","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":501,"context_line":"                      self).create_security_group_rule_bulk_native("},{"line_number":502,"context_line":"                          context, security_group_rule)"},{"line_number":503,"context_line":"        sgids \u003d set([r[\u0027security_group_id\u0027]"},{"line_number":504,"context_line":"                     for r in rules])"},{"line_number":505,"context_line":"        self.notifier.security_groups_rule_updated(context, list(sgids))"},{"line_number":506,"context_line":"        return rules"},{"line_number":507,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5s0%3D","line":504,"updated":"2012-11-16 13:45:01.000000000","message":"Make it one line.","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":501,"context_line":"                      self).create_security_group_rule_bulk_native("},{"line_number":502,"context_line":"                          context, security_group_rule)"},{"line_number":503,"context_line":"        sgids \u003d set([r[\u0027security_group_id\u0027]"},{"line_number":504,"context_line":"                     for r in rules])"},{"line_number":505,"context_line":"        self.notifier.security_groups_rule_updated(context, list(sgids))"},{"line_number":506,"context_line":"        return rules"},{"line_number":507,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5HM%3D","line":504,"in_reply_to":"AAAAMH%2F%2F5s0%3D","updated":"2012-11-16 22:35:48.000000000","message":"Done","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":512,"context_line":"        self.notifier.security_groups_rule_updated(context,"},{"line_number":513,"context_line":"                                                   [rule[\u0027security_group_id\u0027]])"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"    def get_port(self, context, id, fields\u003dNone):"},{"line_number":516,"context_line":"        port \u003d super(LinuxBridgePluginV2, self).get_port(context, id)"},{"line_number":517,"context_line":"        self._extend_port_dict_security_group(context, port)"},{"line_number":518,"context_line":"        return self._fields(port, fields)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5sw%3D","line":515,"updated":"2012-11-16 13:45:01.000000000","message":"get_port() and get_ports() should be placed just after delete_port().","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":512,"context_line":"        self.notifier.security_groups_rule_updated(context,"},{"line_number":513,"context_line":"                                                   [rule[\u0027security_group_id\u0027]])"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"    def get_port(self, context, id, fields\u003dNone):"},{"line_number":516,"context_line":"        port \u003d super(LinuxBridgePluginV2, self).get_port(context, id)"},{"line_number":517,"context_line":"        self._extend_port_dict_security_group(context, port)"},{"line_number":518,"context_line":"        return self._fields(port, fields)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMH%2F%2F5HI%3D","line":515,"in_reply_to":"AAAAMH%2F%2F5sw%3D","updated":"2012-11-16 22:35:48.000000000","message":"Done","commit_id":"aafeedb462b5e210f8ce4f3dd5529022834e70a3"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"9c9b5ccfbdcba4c2749d2cf44f124814e3085ade","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    \u0027\u0027\u0027"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    BASE_RPC_API_VERSION \u003d \u00271.1\u0027"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def __init__(self, topic):"},{"line_number":117,"context_line":"        super(AgentNotifierApi, self).__init__("}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F3DA%3D","line":114,"updated":"2012-11-19 20:54:28.000000000","message":"If you change this version do you also have to update it in the dhcp_agent, etc? \n\narosen@awesome:~/Downloads/quantum$ grep -R BASE_RPC_API_VERSION *\nquantum/agent/dhcp_agent.py:    BASE_RPC_API_VERSION \u003d \u00271.0\u0027\nquantum/agent/dhcp_agent.py:            topic\u003dtopic, default_version\u003dself.BASE_RPC_API_VERSION)\nquantum/agent/rpc.py:    BASE_RPC_API_VERSION \u003d \u00271.0\u0027\nquantum/agent/rpc.py:            topic\u003dtopic, default_version\u003dself.BASE_RPC_API_VERSION)\nquantum/plugins/linuxbridge/lb_quantum_plugin.py:    BASE_RPC_API_VERSION \u003d \u00271.1\u0027\nquantum/plugins/linuxbridge/lb_quantum_plugin.py:            topic\u003dtopic, default_version\u003dself.BASE_RPC_API_VERSION)\nquantum/plugins/openvswitch/ovs_quantum_plugin.py:    BASE_RPC_API_VERSION \u003d \u00271.0\u0027\nquantum/plugins/openvswitch/ovs_quantum_plugin.py:            topic\u003dtopic, default_version\u003dself.BASE_RPC_API_VERSION)\nquantum/tests/unit/linuxbridge/test_rpcapi.py:        expected_msg[\u0027version\u0027] \u003d rpcapi.BASE_RPC_API_VERSION\nquantum/tests/unit/openvswitch/test_ovs_rpcapi.py:        expected_msg[\u0027version\u0027] \u003d rpcapi.BASE_RPC_API_VERSION\narosen@awesome:~/Downloads/quantum$ vi quantum/agent/dhcp_agent.py","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    \u0027\u0027\u0027"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    BASE_RPC_API_VERSION \u003d \u00271.1\u0027"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def __init__(self, topic):"},{"line_number":117,"context_line":"        super(AgentNotifierApi, self).__init__("}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F23M%3D","line":114,"in_reply_to":"AAAAMH%2F%2F3DA%3D","updated":"2012-11-19 23:05:06.000000000","message":"I dont\u0027 think so, Because I updated only linuxbridge. ( Another pluings are still using 1.0 RPC api. 1.1 is backward compatible with 1.0, so it is also OK if 1.0 rpc client talk with 1.1 server side.","commit_id":"dc4f15c293142cd6b74ef021101c1553b4e1f54c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":119,"context_line":"    def __init__(self, topic):"},{"line_number":120,"context_line":"        super(AgentNotifierApi, self).__init__("},{"line_number":121,"context_line":"            topic\u003dtopic, default_version\u003dself.BASE_RPC_API_VERSION)"},{"line_number":122,"context_line":"        self.topic \u003d topic"},{"line_number":123,"context_line":"        self.topic_network_delete \u003d topics.get_topic_name(topic,"},{"line_number":124,"context_line":"                                                          topics.NETWORK,"},{"line_number":125,"context_line":"                                                          topics.DELETE)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzKo%3D","line":122,"updated":"2012-11-22 10:05:49.000000000","message":"why do we need the self.tpic. did not see this being used.","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":119,"context_line":"    def __init__(self, topic):"},{"line_number":120,"context_line":"        super(AgentNotifierApi, self).__init__("},{"line_number":121,"context_line":"            topic\u003dtopic, default_version\u003dself.BASE_RPC_API_VERSION)"},{"line_number":122,"context_line":"        self.topic \u003d topic"},{"line_number":123,"context_line":"        self.topic_network_delete \u003d topics.get_topic_name(topic,"},{"line_number":124,"context_line":"                                                          topics.NETWORK,"},{"line_number":125,"context_line":"                                                          topics.DELETE)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy48%3D","line":122,"in_reply_to":"AAAAMH%2F%2FzKo%3D","updated":"2012-11-22 17:39:20.000000000","message":"This is needed for mixin class support","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":415,"context_line":"        self._ensure_default_security_group_on_port(context, port)"},{"line_number":416,"context_line":"        self._validate_security_groups_on_port(context, port)"},{"line_number":417,"context_line":"        sgids \u003d port[\u0027port\u0027][ext_sg.SECURITYGROUP]"},{"line_number":418,"context_line":"        session \u003d context.session"},{"line_number":419,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":420,"context_line":"            port \u003d super(LinuxBridgePluginV2,"},{"line_number":421,"context_line":"                         self).create_port(context, port)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzKk%3D","line":418,"updated":"2012-11-22 10:05:49.000000000","message":"do we need to invoke this code if sgids is None or []","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":415,"context_line":"        self._ensure_default_security_group_on_port(context, port)"},{"line_number":416,"context_line":"        self._validate_security_groups_on_port(context, port)"},{"line_number":417,"context_line":"        sgids \u003d port[\u0027port\u0027][ext_sg.SECURITYGROUP]"},{"line_number":418,"context_line":"        session \u003d context.session"},{"line_number":419,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":420,"context_line":"            port \u003d super(LinuxBridgePluginV2,"},{"line_number":421,"context_line":"                         self).create_port(context, port)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy40%3D","line":418,"in_reply_to":"AAAAMH%2F%2FzKk%3D","updated":"2012-11-22 17:39:20.000000000","message":"The case is handled in _process_port_create_security_group","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":422,"context_line":"            self._process_port_create_security_group("},{"line_number":423,"context_line":"                context, port[\u0027id\u0027], sgids)"},{"line_number":424,"context_line":"            self._extend_port_dict_security_group(context, port)"},{"line_number":425,"context_line":"        self.notifier.security_groups_member_updated("},{"line_number":426,"context_line":"            context, port.get(ext_sg.SECURITYGROUP))"},{"line_number":427,"context_line":"        return port"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzKQ%3D","line":425,"updated":"2012-11-22 10:05:49.000000000","message":"does this need to be called if there are no sec groups?","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":422,"context_line":"            self._process_port_create_security_group("},{"line_number":423,"context_line":"                context, port[\u0027id\u0027], sgids)"},{"line_number":424,"context_line":"            self._extend_port_dict_security_group(context, port)"},{"line_number":425,"context_line":"        self.notifier.security_groups_member_updated("},{"line_number":426,"context_line":"            context, port.get(ext_sg.SECURITYGROUP))"},{"line_number":427,"context_line":"        return port"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy4w%3D","line":425,"in_reply_to":"AAAAMH%2F%2FzKQ%3D","updated":"2012-11-22 17:39:20.000000000","message":"Done","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":426,"context_line":"            context, port.get(ext_sg.SECURITYGROUP))"},{"line_number":427,"context_line":"        return port"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"    def _same_ids(self, a, b):"},{"line_number":430,"context_line":"        if a is None:"},{"line_number":431,"context_line":"            a \u003d []"},{"line_number":432,"context_line":"        if b is None:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzKg%3D","line":429,"updated":"2012-11-22 10:05:49.000000000","message":"looks like a common function that can be used across quantum. consider adding it to utils.","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":426,"context_line":"            context, port.get(ext_sg.SECURITYGROUP))"},{"line_number":427,"context_line":"        return port"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"    def _same_ids(self, a, b):"},{"line_number":430,"context_line":"        if a is None:"},{"line_number":431,"context_line":"            a \u003d []"},{"line_number":432,"context_line":"        if b is None:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy3E%3D","line":429,"in_reply_to":"AAAAMH%2F%2FzKg%3D","updated":"2012-11-22 17:39:20.000000000","message":"Done","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":433,"context_line":"            b \u003d []"},{"line_number":434,"context_line":"        return set(a) \u003d\u003d set(b)"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    def update_port(self, context, id, port):"},{"line_number":437,"context_line":"        self._validate_security_groups_on_port(context, port)"},{"line_number":438,"context_line":"        original_port \u003d self.get_port(context, id)"},{"line_number":439,"context_line":"        session \u003d context.session"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzKc%3D","line":436,"updated":"2012-11-22 10:05:49.000000000","message":"is it relevant to check if there are sec ports defined on the port prior to doing everything?","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":433,"context_line":"            b \u003d []"},{"line_number":434,"context_line":"        return set(a) \u003d\u003d set(b)"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    def update_port(self, context, id, port):"},{"line_number":437,"context_line":"        self._validate_security_groups_on_port(context, port)"},{"line_number":438,"context_line":"        original_port \u003d self.get_port(context, id)"},{"line_number":439,"context_line":"        session \u003d context.session"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy2k%3D","line":436,"in_reply_to":"AAAAMH%2F%2FzKc%3D","updated":"2012-11-22 17:39:20.000000000","message":"Done","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":472,"context_line":"            port \u003d self.get_port(context, id)"},{"line_number":473,"context_line":"            self._delete_port_security_group_bindings(context, id)"},{"line_number":474,"context_line":"            super(LinuxBridgePluginV2, self).delete_port(context, id)"},{"line_number":475,"context_line":"            self.notifier.security_groups_member_updated("},{"line_number":476,"context_line":"                context, port.get(ext_sg.SECURITYGROUP))"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"    def get_port(self, context, id, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzKU%3D","line":475,"updated":"2012-11-22 10:05:49.000000000","message":"should the notify be called if there are no sec groups?","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":472,"context_line":"            port \u003d self.get_port(context, id)"},{"line_number":473,"context_line":"            self._delete_port_security_group_bindings(context, id)"},{"line_number":474,"context_line":"            super(LinuxBridgePluginV2, self).delete_port(context, id)"},{"line_number":475,"context_line":"            self.notifier.security_groups_member_updated("},{"line_number":476,"context_line":"                context, port.get(ext_sg.SECURITYGROUP))"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"    def get_port(self, context, id, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy4I%3D","line":475,"in_reply_to":"AAAAMH%2F%2FzKU%3D","updated":"2012-11-22 17:39:20.000000000","message":"I added check in the rpc method","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":488,"context_line":"            self._extend_port_dict_security_group(context, port)"},{"line_number":489,"context_line":"        return ports"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"    def port_admin_status_updated(self, context, port):"},{"line_number":492,"context_line":"        binding \u003d db.get_network_binding(context.session,"},{"line_number":493,"context_line":"                                         port[\u0027network_id\u0027])"},{"line_number":494,"context_line":"        self.notifier.port_update(self.rpc_context, port,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2FzKM%3D","line":491,"updated":"2012-11-22 10:05:49.000000000","message":"This is a local function can you please prefix it with _","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":488,"context_line":"            self._extend_port_dict_security_group(context, port)"},{"line_number":489,"context_line":"        return ports"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"    def port_admin_status_updated(self, context, port):"},{"line_number":492,"context_line":"        binding \u003d db.get_network_binding(context.session,"},{"line_number":493,"context_line":"                                         port[\u0027network_id\u0027])"},{"line_number":494,"context_line":"        self.notifier.port_update(self.rpc_context, port,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2Fy3M%3D","line":491,"in_reply_to":"AAAAMH%2F%2FzKM%3D","updated":"2012-11-22 17:39:20.000000000","message":"Done","commit_id":"a826cf1de945c60180b1342c785e3405ed2e01e2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":57,"context_line":"        \u0027\u0027\u0027"},{"line_number":58,"context_line":"        return q_rpc.PluginRpcDispatcher([self])"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def get_port_from_device(self, device):"},{"line_number":61,"context_line":"        return db.get_port_from_device(device[self.TAP_PREFIX_LEN:])"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def get_device_details(self, rpc_context, **kwargs):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2FyDs%3D","line":60,"updated":"2012-11-25 09:53:57.000000000","message":"Please define as a static method","commit_id":"5fce24277fd0a176c6baa9a0a7c25d1401c3b39c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":57,"context_line":"        \u0027\u0027\u0027"},{"line_number":58,"context_line":"        return q_rpc.PluginRpcDispatcher([self])"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def get_port_from_device(self, device):"},{"line_number":61,"context_line":"        return db.get_port_from_device(device[self.TAP_PREFIX_LEN:])"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def get_device_details(self, rpc_context, **kwargs):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2FxG4%3D","line":60,"in_reply_to":"AAAAMH%2F%2FyDs%3D","updated":"2012-11-26 19:51:10.000000000","message":"Done","commit_id":"5fce24277fd0a176c6baa9a0a7c25d1401c3b39c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":337,"context_line":"            #set up default security groups"},{"line_number":338,"context_line":"            tenant_id \u003d self._get_tenant_id_for_create("},{"line_number":339,"context_line":"                context, network[\u0027network\u0027])"},{"line_number":340,"context_line":"            self._ensure_default_security_group(context, tenant_id)"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"            if not network_type:"},{"line_number":343,"context_line":"                # tenant network"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2FyDg%3D","line":340,"updated":"2012-11-25 09:53:57.000000000","message":"It was a bit confusing that this is defined as _. Why? Same for _ensure_default_security_group_on_port","commit_id":"5fce24277fd0a176c6baa9a0a7c25d1401c3b39c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":337,"context_line":"            #set up default security groups"},{"line_number":338,"context_line":"            tenant_id \u003d self._get_tenant_id_for_create("},{"line_number":339,"context_line":"                context, network[\u0027network\u0027])"},{"line_number":340,"context_line":"            self._ensure_default_security_group(context, tenant_id)"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"            if not network_type:"},{"line_number":343,"context_line":"                # tenant network"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2FxGs%3D","line":340,"in_reply_to":"AAAAMH%2F%2FyDg%3D","updated":"2012-11-26 19:51:10.000000000","message":"This method is used in the same class, so it is private.\n# Aaron defined this method so may be he can explain more.\n_ensure_default_security_group_on_port follows same style of _ensure_default_security_group","commit_id":"5fce24277fd0a176c6baa9a0a7c25d1401c3b39c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":407,"context_line":"        return [self._fields(net, fields) for net in nets]"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    def create_port(self, context, port):"},{"line_number":410,"context_line":"        self._ensure_default_security_group_on_port(context, port)"},{"line_number":411,"context_line":"        self._validate_security_groups_on_port(context, port)"},{"line_number":412,"context_line":"        sgids \u003d port[\u0027port\u0027][ext_sg.SECURITYGROUP]"},{"line_number":413,"context_line":"        session \u003d context.session"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2FyDk%3D","line":410,"updated":"2012-11-25 09:53:57.000000000","message":"This should be int he same context as the port creation below.","commit_id":"5fce24277fd0a176c6baa9a0a7c25d1401c3b39c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":407,"context_line":"        return [self._fields(net, fields) for net in nets]"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    def create_port(self, context, port):"},{"line_number":410,"context_line":"        self._ensure_default_security_group_on_port(context, port)"},{"line_number":411,"context_line":"        self._validate_security_groups_on_port(context, port)"},{"line_number":412,"context_line":"        sgids \u003d port[\u0027port\u0027][ext_sg.SECURITYGROUP]"},{"line_number":413,"context_line":"        session \u003d context.session"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2FxGc%3D","line":410,"in_reply_to":"AAAAMH%2F%2FyDk%3D","updated":"2012-11-26 19:51:10.000000000","message":"Done","commit_id":"5fce24277fd0a176c6baa9a0a7c25d1401c3b39c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":430,"context_line":"            # delete the port binding and read it with the new rules"},{"line_number":431,"context_line":"            security_groups \u003d port[\u0027port\u0027].get(ext_sg.SECURITYGROUP)"},{"line_number":432,"context_line":"            if security_groups !\u003d attributes.ATTR_NOT_SPECIFIED:"},{"line_number":433,"context_line":"                self._delete_port_security_group_bindings(context, id)"},{"line_number":434,"context_line":"                self._process_port_create_security_group(context, id,"},{"line_number":435,"context_line":"                                                         security_groups)"},{"line_number":436,"context_line":"            port \u003d super(LinuxBridgePluginV2, self).update_port("}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAMH%2F%2FrBI%3D","line":433,"updated":"2012-12-01 15:55:27.000000000","message":"In update_port, the request does not contain \u0027security_groups\u0027 attributes unless security_groups are updated. The current logic clears if there is no security_groups attribute and it is not an expected behavior I believe.","commit_id":"e81618193c5455b552c9fdebff7bc3e33347f84e"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":420,"context_line":"            port[portbindings.VIF_TYPE] \u003d portbindings.VIF_TYPE_BRIDGE"},{"line_number":421,"context_line":"        return port"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"    def get_port(self, context, id, fields\u003dNone):"},{"line_number":424,"context_line":"        port \u003d super(LinuxBridgePluginV2, self).get_port(context, id, fields)"},{"line_number":425,"context_line":"        self._extend_port_dict_security_group(context, port)"},{"line_number":426,"context_line":"        return self._fields("}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAMX%2F%2F500%3D","line":423,"updated":"2012-12-08 16:58:16.000000000","message":"There are more than one _extend_port_*(), so i think the following is easier to understand. As _extend_port_dict_port_biding update the content of \u0027port\u0027, it should work.\n\nself._extend_port_dict_security_group(context, port)\nself._extend_port_dict_security_groups(context, port)\nreturn self._fields(port, fields)","commit_id":"0f7dec272c25cb96e85d5afd2b7f9394074ea425"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":420,"context_line":"            port[portbindings.VIF_TYPE] \u003d portbindings.VIF_TYPE_BRIDGE"},{"line_number":421,"context_line":"        return port"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"    def get_port(self, context, id, fields\u003dNone):"},{"line_number":424,"context_line":"        port \u003d super(LinuxBridgePluginV2, self).get_port(context, id, fields)"},{"line_number":425,"context_line":"        self._extend_port_dict_security_group(context, port)"},{"line_number":426,"context_line":"        return self._fields("}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAMX%2F%2F5rA%3D","line":423,"in_reply_to":"AAAAMX%2F%2F500%3D","updated":"2012-12-09 07:06:44.000000000","message":"Done","commit_id":"0f7dec272c25cb96e85d5afd2b7f9394074ea425"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def get_port_from_device(cls, device):"},{"line_number":65,"context_line":"        port \u003d db.get_port_from_device(device[cls.TAP_PREFIX_LEN:])"},{"line_number":66,"context_line":"        if port:"},{"line_number":67,"context_line":"            port[\u0027device\u0027] \u003d device"},{"line_number":68,"context_line":"        return port"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def get_device_details(self, rpc_context, **kwargs):"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F1E0%3D","line":67,"updated":"2012-12-13 18:59:05.000000000","message":"Is port[\u0027device\u0027] used anywhere? It is not referred to in get_device_details and update_device_down.","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def get_port_from_device(cls, device):"},{"line_number":65,"context_line":"        port \u003d db.get_port_from_device(device[cls.TAP_PREFIX_LEN:])"},{"line_number":66,"context_line":"        if port:"},{"line_number":67,"context_line":"            port[\u0027device\u0027] \u003d device"},{"line_number":68,"context_line":"        return port"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def get_device_details(self, rpc_context, **kwargs):"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0sM%3D","line":67,"in_reply_to":"AAAAMX%2F%2F1E0%3D","updated":"2012-12-13 23:22:28.000000000","message":"this is used in iptables rules.","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    \u0027\u0027\u0027"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    BASE_RPC_API_VERSION \u003d \u00271.1\u0027"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def __init__(self, topic):"},{"line_number":126,"context_line":"        super(AgentNotifierApi, self).__init__("}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F20o%3D","line":123,"updated":"2012-12-12 11:48:04.000000000","message":"I don\u0027t think that we need to update this","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    \u0027\u0027\u0027"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    BASE_RPC_API_VERSION \u003d \u00271.1\u0027"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def __init__(self, topic):"},{"line_number":126,"context_line":"        super(AgentNotifierApi, self).__init__("}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0sI%3D","line":123,"in_reply_to":"AAAAMX%2F%2F20o%3D","updated":"2012-12-13 23:22:28.000000000","message":"replied in the server side code","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        session \u003d context.session"},{"line_number":351,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":352,"context_line":"            #set up default security groups"},{"line_number":353,"context_line":"            tenant_id \u003d self._get_tenant_id_for_create("},{"line_number":354,"context_line":"                context, network[\u0027network\u0027])"},{"line_number":355,"context_line":"            self._ensure_default_security_group(context, tenant_id)"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F20k%3D","line":352,"updated":"2012-12-12 11:48:04.000000000","message":"I think that this should be done at the end of the function - if everything has been done successfully","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        session \u003d context.session"},{"line_number":351,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":352,"context_line":"            #set up default security groups"},{"line_number":353,"context_line":"            tenant_id \u003d self._get_tenant_id_for_create("},{"line_number":354,"context_line":"                context, network[\u0027network\u0027])"},{"line_number":355,"context_line":"            self._ensure_default_security_group(context, tenant_id)"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0sE%3D","line":352,"in_reply_to":"AAAAMX%2F%2F20k%3D","updated":"2012-12-13 23:22:28.000000000","message":"this is in transaction, so it will be rollback, so no problem here.","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":475,"context_line":"                context, id, port)"},{"line_number":476,"context_line":"            self._extend_port_dict_security_group(context, port)"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"        if original_port[\u0027admin_state_up\u0027] !\u003d port[\u0027admin_state_up\u0027]:"},{"line_number":479,"context_line":"            port_updated \u003d True"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        if (original_port[\u0027fixed_ips\u0027] !\u003d port[\u0027fixed_ips\u0027] or"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F20g%3D","line":478,"updated":"2012-12-12 11:48:04.000000000","message":"Question - if the admin state is down - do we build the security group rules on the agent?","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":475,"context_line":"                context, id, port)"},{"line_number":476,"context_line":"            self._extend_port_dict_security_group(context, port)"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"        if original_port[\u0027admin_state_up\u0027] !\u003d port[\u0027admin_state_up\u0027]:"},{"line_number":479,"context_line":"            port_updated \u003d True"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        if (original_port[\u0027fixed_ips\u0027] !\u003d port[\u0027fixed_ips\u0027] or"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAMX%2F%2F0sA%3D","line":478,"in_reply_to":"AAAAMX%2F%2F20g%3D","updated":"2012-12-13 23:22:28.000000000","message":"For simplicity, we should build the rule on agent even if admin_state_down.","commit_id":"ab94715a4110c57ac7f541a4c3022fb09deb7c8b"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0bc18015e3d536f5ee96cde585602c4361768c55","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        return q_rpc.PluginRpcDispatcher([self])"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    @classmethod"},{"line_number":64,"context_line":"    def get_port_from_device(cls, device):"},{"line_number":65,"context_line":"        port \u003d db.get_port_from_device(device[cls.TAP_PREFIX_LEN:])"},{"line_number":66,"context_line":"        if port:"},{"line_number":67,"context_line":"            port[\u0027device\u0027] \u003d device"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F47I%3D","line":64,"updated":"2012-12-25 09:10:49.000000000","message":"Should we named with prefix \u0027_\u0027?","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":61,"context_line":"        return q_rpc.PluginRpcDispatcher([self])"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    @classmethod"},{"line_number":64,"context_line":"    def get_port_from_device(cls, device):"},{"line_number":65,"context_line":"        port \u003d db.get_port_from_device(device[cls.TAP_PREFIX_LEN:])"},{"line_number":66,"context_line":"        if port:"},{"line_number":67,"context_line":"            port[\u0027device\u0027] \u003d device"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4iQ%3D","line":64,"in_reply_to":"AAAAM3%2F%2F47I%3D","updated":"2012-12-26 19:15:41.000000000","message":"This method is called from another class. So IMO _ isn\u0027t needed","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    \u0027\u0027\u0027"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    BASE_RPC_API_VERSION \u003d \u00271.1\u0027"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def __init__(self, topic):"},{"line_number":126,"context_line":"        super(AgentNotifierApi, self).__init__("}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5H4%3D","line":123,"updated":"2012-12-24 16:21:43.000000000","message":"Same as before - why do we need to update the version?","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    \u0027\u0027\u0027"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    BASE_RPC_API_VERSION \u003d \u00271.1\u0027"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def __init__(self, topic):"},{"line_number":126,"context_line":"        super(AgentNotifierApi, self).__init__("}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4g4%3D","line":123,"in_reply_to":"AAAAM3%2F%2F5H4%3D","updated":"2012-12-26 19:15:41.000000000","message":"Let\u0027s discuss in the ML","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":62,"context_line":"        return q_rpc.PluginRpcDispatcher([self])"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @classmethod"},{"line_number":65,"context_line":"    def get_port_from_device(cls, device):"},{"line_number":66,"context_line":"        port \u003d db.get_port_from_device(device[cls.TAP_PREFIX_LEN:])"},{"line_number":67,"context_line":"        if port:"},{"line_number":68,"context_line":"            port[\u0027device\u0027] \u003d device"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAM3%2F%2F26o%3D","line":65,"updated":"2012-12-31 09:42:09.000000000","message":"name of the method is confusing - in actual fact it updates the device on the port","commit_id":"6102cfb2de583b96cd0b6e61c6f479177a43fef5"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":62,"context_line":"        return q_rpc.PluginRpcDispatcher([self])"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @classmethod"},{"line_number":65,"context_line":"    def get_port_from_device(cls, device):"},{"line_number":66,"context_line":"        port \u003d db.get_port_from_device(device[cls.TAP_PREFIX_LEN:])"},{"line_number":67,"context_line":"        if port:"},{"line_number":68,"context_line":"            port[\u0027device\u0027] \u003d device"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAM3%2F%2F2xY%3D","line":65,"in_reply_to":"AAAAM3%2F%2F26o%3D","updated":"2012-12-31 21:40:16.000000000","message":"It\u0027s not updating port information in db. It just adding device id for the port dict in return. \nso I suppose this method name looks OK.","commit_id":"6102cfb2de583b96cd0b6e61c6f479177a43fef5"}],"quantum/tests/unit/linuxbridge/test_lb_security_group.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":65,"context_line":"                direction \u003d \"ingress\""},{"line_number":66,"context_line":"                source_group_id \u003d sg2[\u0027security_group\u0027][\u0027id\u0027]"},{"line_number":67,"context_line":"                protocol \u003d \u0027tcp\u0027"},{"line_number":68,"context_line":"                port_range_min \u003d 22"},{"line_number":69,"context_line":"                port_range_max \u003d 22"},{"line_number":70,"context_line":"                with self.security_group_rule(security_group_id, direction,"},{"line_number":71,"context_line":"                                              protocol, port_range_min,"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F5Hg%3D","line":68,"updated":"2012-12-24 16:21:43.000000000","message":"webserver usually is port 80 :)","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":65,"context_line":"                direction \u003d \"ingress\""},{"line_number":66,"context_line":"                source_group_id \u003d sg2[\u0027security_group\u0027][\u0027id\u0027]"},{"line_number":67,"context_line":"                protocol \u003d \u0027tcp\u0027"},{"line_number":68,"context_line":"                port_range_min \u003d 22"},{"line_number":69,"context_line":"                port_range_max \u003d 22"},{"line_number":70,"context_line":"                with self.security_group_rule(security_group_id, direction,"},{"line_number":71,"context_line":"                                              protocol, port_range_min,"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAM3%2F%2F4iA%3D","line":68,"in_reply_to":"AAAAM3%2F%2F5Hg%3D","updated":"2012-12-26 19:15:41.000000000","message":"Done","commit_id":"f031ef166e9fd0447001c452434f4c58b44f5725"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":"from mock import call"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAM3%2F%2F26k%3D","line":18,"updated":"2012-12-31 09:42:09.000000000","message":"one line to many","commit_id":"6102cfb2de583b96cd0b6e61c6f479177a43fef5"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":"from mock import call"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAAM3%2F%2F2xI%3D","line":18,"in_reply_to":"AAAAM3%2F%2F26k%3D","updated":"2012-12-31 21:40:16.000000000","message":"Done","commit_id":"6102cfb2de583b96cd0b6e61c6f479177a43fef5"}],"quantum/tests/unit/linuxbridge/test_linuxbridge_plugin.py":[{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"change_message_id":"52d11f5af4718fc1af23dbbcbb82d22e621008b2","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from quantum.extensions import securitygroup as ext_sg"},{"line_number":20,"context_line":"from quantum.tests.unit import test_db_plugin as test_plugin"},{"line_number":21,"context_line":"from quantum.tests.unit import test_extension_security_group as test_sg"},{"line_number":22,"context_line":"from quantum.manager import QuantumManager"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"PLUGIN_NAME \u003d (\u0027quantum.plugins.linuxbridge.\u0027"},{"line_number":25,"context_line":"               \u0027lb_quantum_plugin.LinuxBridgePluginV2\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F6Ds%3D","line":22,"updated":"2012-11-16 05:02:28.000000000","message":"This import should be placed between lines 19 and 20","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from quantum.extensions import securitygroup as ext_sg"},{"line_number":20,"context_line":"from quantum.tests.unit import test_db_plugin as test_plugin"},{"line_number":21,"context_line":"from quantum.tests.unit import test_extension_security_group as test_sg"},{"line_number":22,"context_line":"from quantum.manager import QuantumManager"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"PLUGIN_NAME \u003d (\u0027quantum.plugins.linuxbridge.\u0027"},{"line_number":25,"context_line":"               \u0027lb_quantum_plugin.LinuxBridgePluginV2\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F55Q%3D","line":22,"in_reply_to":"AAAAMH%2F%2F6Ds%3D","updated":"2012-11-16 07:31:27.000000000","message":"Done","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":11,"context_line":"# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or"},{"line_number":12,"context_line":"# implied."},{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":"import mock"},{"line_number":16,"context_line":"from mock import call"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4OU%3D","line":14,"updated":"2012-11-18 15:23:54.000000000","message":"New line","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or"},{"line_number":12,"context_line":"# implied."},{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":"import mock"},{"line_number":16,"context_line":"from mock import call"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4JY%3D","line":14,"in_reply_to":"AAAAMH%2F%2F4OU%3D","updated":"2012-11-18 21:54:20.000000000","message":"Done","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"}],"quantum/tests/unit/test_extension_security_group.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":134,"context_line":"            security_group_req.environ[\u0027quantum.context\u0027] \u003d ("},{"line_number":135,"context_line":"                context.Context(\u0027\u0027, kwargs[\u0027tenant_id\u0027]))"},{"line_number":136,"context_line":"        return security_group_req.get_response(self.ext_api)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def _build_security_group_rule(self, security_group_id, direction,"},{"line_number":139,"context_line":"                                   protocol, port_range_min, port_range_max,"},{"line_number":140,"context_line":"                                   source_ip_prefix\u003dNone, source_group_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4OQ%3D","line":137,"updated":"2012-11-18 15:23:54.000000000","message":"Can we have a test for an invalid ethernet type?","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            security_group_req.environ[\u0027quantum.context\u0027] \u003d ("},{"line_number":135,"context_line":"                context.Context(\u0027\u0027, kwargs[\u0027tenant_id\u0027]))"},{"line_number":136,"context_line":"        return security_group_req.get_response(self.ext_api)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def _build_security_group_rule(self, security_group_id, direction,"},{"line_number":139,"context_line":"                                   protocol, port_range_min, port_range_max,"},{"line_number":140,"context_line":"                                   source_ip_prefix\u003dNone, source_group_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F4JU%3D","line":137,"in_reply_to":"AAAAMH%2F%2F4OQ%3D","updated":"2012-11-18 21:54:20.000000000","message":"I agree, however it should got another patch because this patch is not for API change.\nI reported this as another bug, and I\u0027ll add this \nhttps://bugs.launchpad.net/quantum/+bug/1080461","commit_id":"e8b524db3f696e19e5380d78ab523203cac7b29a"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":580,"context_line":"                    req \u003d self.new_update_request(\u0027ports\u0027, data,"},{"line_number":581,"context_line":"                                                  port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":582,"context_line":"                    res \u003d self.deserialize(\u0027json\u0027, req.get_response(self.api))"},{"line_number":583,"context_line":"                    self.assertEquals(res[\u0027port\u0027][ext_sg.SECURITYGROUP][0],"},{"line_number":584,"context_line":"                                      sg[\u0027security_group\u0027][\u0027id\u0027])"},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"                    # Test update port without security group"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fyek%3D","line":583,"updated":"2013-01-04 22:50:12.000000000","message":"nit: Change back to assertEqual as assertEquals is a deprecated alias (http://docs.python.org/2/library/unittest.html#unittest.TestCase.assertEqual)","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":580,"context_line":"                    req \u003d self.new_update_request(\u0027ports\u0027, data,"},{"line_number":581,"context_line":"                                                  port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":582,"context_line":"                    res \u003d self.deserialize(\u0027json\u0027, req.get_response(self.api))"},{"line_number":583,"context_line":"                    self.assertEquals(res[\u0027port\u0027][ext_sg.SECURITYGROUP][0],"},{"line_number":584,"context_line":"                                      sg[\u0027security_group\u0027][\u0027id\u0027])"},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"                    # Test update port without security group"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx5o%3D","line":583,"in_reply_to":"AAAAM3%2F%2Fyek%3D","updated":"2013-01-05 07:42:11.000000000","message":"Done","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":590,"context_line":"                    req \u003d self.new_update_request(\u0027ports\u0027, data,"},{"line_number":591,"context_line":"                                                  port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":592,"context_line":"                    res \u003d self.deserialize(\u0027json\u0027, req.get_response(self.api))"},{"line_number":593,"context_line":"                    self.assertEquals(res[\u0027port\u0027][ext_sg.SECURITYGROUP][0],"},{"line_number":594,"context_line":"                                      sg[\u0027security_group\u0027][\u0027id\u0027])"},{"line_number":595,"context_line":""},{"line_number":596,"context_line":"                    self._delete(\u0027ports\u0027, port[\u0027port\u0027][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2FyeU%3D","line":593,"updated":"2013-01-04 22:50:12.000000000","message":"s/assertEquals/assertEqual","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":590,"context_line":"                    req \u003d self.new_update_request(\u0027ports\u0027, data,"},{"line_number":591,"context_line":"                                                  port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":592,"context_line":"                    res \u003d self.deserialize(\u0027json\u0027, req.get_response(self.api))"},{"line_number":593,"context_line":"                    self.assertEquals(res[\u0027port\u0027][ext_sg.SECURITYGROUP][0],"},{"line_number":594,"context_line":"                                      sg[\u0027security_group\u0027][\u0027id\u0027])"},{"line_number":595,"context_line":""},{"line_number":596,"context_line":"                    self._delete(\u0027ports\u0027, port[\u0027port\u0027][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx5k%3D","line":593,"in_reply_to":"AAAAM3%2F%2FyeU%3D","updated":"2013-01-05 07:42:11.000000000","message":"Done","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"unresolved":false,"context_lines":[{"line_number":625,"context_line":"                    req \u003d self.new_update_request(\u0027ports\u0027, data,"},{"line_number":626,"context_line":"                                                  port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":627,"context_line":"                    res \u003d self.deserialize(\u0027json\u0027, req.get_response(self.api))"},{"line_number":628,"context_line":"                    self.assertEquals(res[\u0027port\u0027].get(ext_sg.SECURITYGROUP),"},{"line_number":629,"context_line":"                                      None)"},{"line_number":630,"context_line":"                    self._delete(\u0027ports\u0027, port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":631,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2FyeA%3D","line":628,"updated":"2013-01-04 22:50:12.000000000","message":"s/assertEquals/assertEqual","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":625,"context_line":"                    req \u003d self.new_update_request(\u0027ports\u0027, data,"},{"line_number":626,"context_line":"                                                  port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":627,"context_line":"                    res \u003d self.deserialize(\u0027json\u0027, req.get_response(self.api))"},{"line_number":628,"context_line":"                    self.assertEquals(res[\u0027port\u0027].get(ext_sg.SECURITYGROUP),"},{"line_number":629,"context_line":"                                      None)"},{"line_number":630,"context_line":"                    self._delete(\u0027ports\u0027, port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":631,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAM3%2F%2Fx5g%3D","line":628,"in_reply_to":"AAAAM3%2F%2FyeA%3D","updated":"2013-01-05 07:42:11.000000000","message":"Done","commit_id":"a795929617e0f2b04b7fd3131c4891e0f88f578b"}],"quantum/tests/unit/test_iptables_firewall.py":[{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":140,"context_line":"                    [ethertype, direction, \u0027icmp\u0027, None, None, prefix]]"},{"line_number":141,"context_line":"        return self._convert_security_group_rule(list_rule)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def test_prepare_port_filter_with_sg_ipv4(self):"},{"line_number":144,"context_line":"        port \u003d self._fake_port()"},{"line_number":145,"context_line":"        sg \u003d self._fake_security_group_rules(\u0027IPv4\u0027, \u0027egress\u0027)"},{"line_number":146,"context_line":"        sg \u003d sg + self._fake_security_group_rules(\u0027IPv4\u0027, \u0027ingress\u0027)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAMX%2F%2F6T4%3D","line":143,"updated":"2012-12-07 17:15:30.000000000","message":"This should be broken down into more discrete tests, so that it possible to understand what is being tested.","commit_id":"502465a837fd70801486f75f151db62dfbf1b9f2"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        self.v4filter_inst.assert_has_calls(calls)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def test_prepare_port_filter_with_sg_ipv6(self):"},{"line_number":233,"context_line":"        port \u003d self._fake_port()"},{"line_number":234,"context_line":"        sg \u003d self._fake_security_group_rules(\u0027IPv6\u0027, \u0027egress\u0027)"},{"line_number":235,"context_line":"        sg \u003d sg + self._fake_security_group_rules(\u0027IPv6\u0027, \u0027ingress\u0027)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAMX%2F%2F6T0%3D","line":232,"updated":"2012-12-07 17:15:30.000000000","message":"This should be broken down into more discrete tests, so that it possible to understand what is being tested.","commit_id":"502465a837fd70801486f75f151db62dfbf1b9f2"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.firewall \u003d IptablesFirewallDriver(self.iptables_inst)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def tearDown(self):"},{"line_number":50,"context_line":"        self.iptables_cls_p.stop()"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def _fake_port(self):"},{"line_number":53,"context_line":"        return {\u0027device\u0027: \u0027fake_dev\u0027,"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F5kA%3D","line":50,"updated":"2012-12-09 15:49:37.000000000","message":"why not stop self.utils_exec_p?","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.firewall \u003d IptablesFirewallDriver(self.iptables_inst)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def tearDown(self):"},{"line_number":50,"context_line":"        self.iptables_cls_p.stop()"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def _fake_port(self):"},{"line_number":53,"context_line":"        return {\u0027device\u0027: \u0027fake_dev\u0027,"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAMX%2F%2F4uM%3D","line":50,"in_reply_to":"AAAAMX%2F%2F5kA%3D","updated":"2012-12-10 22:54:29.000000000","message":"Done","commit_id":"f163caa0c5e2d93cab7e8d8a870e1c776f44e4ec"}],"quantum/tests/unit/test_security_groups_rpc.py":[{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"change_message_id":"52d11f5af4718fc1af23dbbcbb82d22e621008b2","unresolved":false,"context_lines":[{"line_number":21,"context_line":"import unittest2 as unittest"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from quantum.agent import rpc as agent_rpc"},{"line_number":24,"context_line":"from quantum.tests.unit import test_extension_security_group as test_sg"},{"line_number":25,"context_line":"from quantum.db import securitygroups_rpc_base as sg_rpc"},{"line_number":26,"context_line":"from quantum.openstack.common.rpc import proxy"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F6Dc%3D","line":24,"updated":"2012-11-16 05:02:28.000000000","message":"This import should be placed between lines 26 and 27","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"e69b4f3668c8b2af248401ca4d849b9d8672ffa6","unresolved":false,"context_lines":[{"line_number":21,"context_line":"import unittest2 as unittest"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from quantum.agent import rpc as agent_rpc"},{"line_number":24,"context_line":"from quantum.tests.unit import test_extension_security_group as test_sg"},{"line_number":25,"context_line":"from quantum.db import securitygroups_rpc_base as sg_rpc"},{"line_number":26,"context_line":"from quantum.openstack.common.rpc import proxy"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMH%2F%2F53M%3D","line":24,"in_reply_to":"AAAAMH%2F%2F6Dc%3D","updated":"2012-11-16 07:31:27.000000000","message":"Done","commit_id":"f9c7335b83bd2d29bd9aa73c5118ef678a8656ca"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":"from contextlib import nested"},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":"from mock import call"},{"line_number":21,"context_line":"import unittest2 as unittest"},{"line_number":22,"context_line":"from quantum.agent import firewall as firewall_base"},{"line_number":23,"context_line":"from quantum.agent import rpc as agent_rpc"},{"line_number":24,"context_line":"from quantum.agent import securitygroups_rpc as sg_rpc"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAMX%2F%2F9LI%3D","line":21,"updated":"2012-12-05 02:48:18.000000000","message":"There should be a blank line below","commit_id":"556774a94990438da8c20a2a5f25eafd568d019f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":194,"context_line":"                self._delete(\u0027ports\u0027, port_id1)"},{"line_number":195,"context_line":"                self._delete(\u0027ports\u0027, port_id2)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def test_security_group_rules_for_devices_ipv6_igress(self):"},{"line_number":198,"context_line":"        fake_prefix \u003d test_fw.FAKE_PREFIX[\u0027IPv6\u0027]"},{"line_number":199,"context_line":"        with self.network() as n:"},{"line_number":200,"context_line":"            with nested(self.subnet(n,"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAMX%2F%2F5z4%3D","line":197,"updated":"2012-12-08 16:58:16.000000000","message":"igress -\u003e ingress","commit_id":"0f7dec272c25cb96e85d5afd2b7f9394074ea425"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":194,"context_line":"                self._delete(\u0027ports\u0027, port_id1)"},{"line_number":195,"context_line":"                self._delete(\u0027ports\u0027, port_id2)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def test_security_group_rules_for_devices_ipv6_igress(self):"},{"line_number":198,"context_line":"        fake_prefix \u003d test_fw.FAKE_PREFIX[\u0027IPv6\u0027]"},{"line_number":199,"context_line":"        with self.network() as n:"},{"line_number":200,"context_line":"            with nested(self.subnet(n,"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAMX%2F%2F5q8%3D","line":197,"in_reply_to":"AAAAMX%2F%2F5z4%3D","updated":"2012-12-09 07:06:44.000000000","message":"Done","commit_id":"0f7dec272c25cb96e85d5afd2b7f9394074ea425"}]}
