)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e4cb68d3ca030264211c99b1fadbfcf5d8395a76","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2017-06-12 18:02:18 +0300"},{"line_number":4,"context_line":"Commit:     Eyal Leshem \u003ceyal.leshem@toganetworks.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-06-13 11:52:28 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"add \u0027pxe boot\u0027 feature to dhcp_app"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The plan is to support pxe-boot by addind support for the dhcp-option \"Parmater Request List (55)\"."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"If the dhcp-client packet(dhcp-discover/dhcp-offer) packet contain option  55 -the DHCP app should response with all requested parmeters (if configured on the lport)."},{"line_number":12,"context_line":"(see: https://specs.openstack.org/openstack/neutron-specs/specs/api/extra_dhcp_options__extra-dhcp-opt_.html)"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This commit only change dhcp-options from list to dictonary that map between TAG to value  -"},{"line_number":15,"context_line":"for enable usable search when answering to the dchp \"Parmater Request List\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: Id03fae3908fcd43c03ff18641694a2a218f4ea11"},{"line_number":18,"context_line":"Closes-bug: #1585170"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"7f231b9d_3341d13a","line":18,"range":{"start_line":6,"start_character":0,"end_line":18,"end_character":20},"updated":"2017-06-13 13:10:04.000000000","message":"The commit message doesn\u0027t match what this commit does. Please revise.\n\nIt also doesn\u0027t close the bug. Please replace Closes-bug with Related-Bug.\n\nSorry I didn\u0027t notice this earlier.","commit_id":"48d704b0e1c3ce40c2ae7b72a5d10804dcff0ee0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"bbe46bc081ce6a6dc96a7eeb6961db43d7844765","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Omer Anson \u003comer.anson@toganetworks.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-06-14 17:09:59 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"add \u0027pxe boot\u0027 feature to dhcp_app"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This commit only change dhcp-options from list to dictonary that map between TAG to value  -"},{"line_number":10,"context_line":"for enable usable search when answering to the dchp \"Parmater Request List\""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7f231b9d_5ce42a3c","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":34},"updated":"2017-06-14 20:00:35.000000000","message":"One last thing - The title has to be changed too. Something like \u0027Change dhcp-options from list to dictionary\u0027","commit_id":"9469810a22719b3b2e4148a65a811b62b47bb489"}],"dragonflow/controller/dhcp_app.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5285b82486203baaecc6842afe3634d27769169f","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        gateway_address \u003d self._get_port_gateway_address(subnet)"},{"line_number":240,"context_line":"        domain_name_bin \u003d struct.pack(\u0027!256s\u0027, self.domain_name)"},{"line_number":241,"context_line":"        bootfile_name \u003d self._get_bootfile_name(lport)"},{"line_number":242,"context_line":"        if not bootfile_name:"},{"line_number":243,"context_line":"            bootfile_name \u003d dhcp_packet.boot_file"},{"line_number":244,"context_line":"        server_name \u003d self._get_server_name(lport)"},{"line_number":245,"context_line":"        option_list \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_99317b0e","line":242,"updated":"2016-05-25 12:49:51.000000000","message":"This condition will never happen. bootfile_name will always be a 128-byte long string.","commit_id":"987cf23729a54bce5e0b15aa04e2383fcbd91681"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"bc6afa4e89f95336e8fa9efefb219abe05d9248a","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        gateway_address \u003d self._get_port_gateway_address(subnet)"},{"line_number":240,"context_line":"        domain_name_bin \u003d struct.pack(\u0027!256s\u0027, self.domain_name)"},{"line_number":241,"context_line":"        bootfile_name \u003d self._get_bootfile_name(lport)"},{"line_number":242,"context_line":"        if not bootfile_name:"},{"line_number":243,"context_line":"            bootfile_name \u003d dhcp_packet.boot_file"},{"line_number":244,"context_line":"        server_name \u003d self._get_server_name(lport)"},{"line_number":245,"context_line":"        option_list \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_838ef32b","line":242,"in_reply_to":"bab6814e_99317b0e","updated":"2016-05-26 10:54:05.000000000","message":"yes, you\u0027re right.\nI\u0027ll make _get_bootfile_name just return the string value of bootfile_name","commit_id":"987cf23729a54bce5e0b15aa04e2383fcbd91681"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5285b82486203baaecc6842afe3634d27769169f","unresolved":false,"context_lines":[{"line_number":309,"context_line":"    def _get_extra_dhcp_opts_value(self, lport, expected_name):"},{"line_number":310,"context_line":"        extra_opts \u003d lport.get_extra_dhcp_opts()"},{"line_number":311,"context_line":"        value \u003d \u0027\u0027"},{"line_number":312,"context_line":"        for opt in extra_opts:"},{"line_number":313,"context_line":"            if expected_name \u003d\u003d opt[\u0027opt_name\u0027]:"},{"line_number":314,"context_line":"                value \u003d opt[\u0027opt_value\u0027]"},{"line_number":315,"context_line":"            return value"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    def _get_bootfile_name(self, lport):"},{"line_number":318,"context_line":"        bootfile \u003d self._get_extra_dhcp_opts_value(lport, \u0027bootfile-name\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_392b2f96","line":315,"range":{"start_line":312,"start_character":0,"end_line":315,"end_character":24},"updated":"2016-05-25 12:49:51.000000000","message":"This loop iterates exactly once. Is that the intention?","commit_id":"987cf23729a54bce5e0b15aa04e2383fcbd91681"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"bc6afa4e89f95336e8fa9efefb219abe05d9248a","unresolved":false,"context_lines":[{"line_number":309,"context_line":"    def _get_extra_dhcp_opts_value(self, lport, expected_name):"},{"line_number":310,"context_line":"        extra_opts \u003d lport.get_extra_dhcp_opts()"},{"line_number":311,"context_line":"        value \u003d \u0027\u0027"},{"line_number":312,"context_line":"        for opt in extra_opts:"},{"line_number":313,"context_line":"            if expected_name \u003d\u003d opt[\u0027opt_name\u0027]:"},{"line_number":314,"context_line":"                value \u003d opt[\u0027opt_value\u0027]"},{"line_number":315,"context_line":"            return value"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    def _get_bootfile_name(self, lport):"},{"line_number":318,"context_line":"        bootfile \u003d self._get_extra_dhcp_opts_value(lport, \u0027bootfile-name\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_a3b7b7d6","line":315,"range":{"start_line":312,"start_character":0,"end_line":315,"end_character":24},"in_reply_to":"bab6814e_392b2f96","updated":"2016-05-26 10:54:05.000000000","message":"soory, I made a typo, \u0027return value\u0027 should be outside of for loop","commit_id":"987cf23729a54bce5e0b15aa04e2383fcbd91681"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"ea30d62bd089a17713d617fb004467fb8bb5ecc0","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        return struct.pack(\u0027!128s\u0027, bootfile)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def _get_server_name(self, lport):"},{"line_number":322,"context_line":"        server \u003d self._get_extra_dhcp_opts_value(lport, \u0027server-name\u0027)"},{"line_number":323,"context_line":"        return struct.pack(\u0027!64s\u0027, server)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def _get_port_netmask(self, subnet):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_3b713945","line":322,"updated":"2016-05-26 07:52:33.000000000","message":"dnsmasq uses \"tftp-server\" for option 66.\ni guess we should follow.","commit_id":"987cf23729a54bce5e0b15aa04e2383fcbd91681"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"4a97f274f7777a0531df102445c03c8850a8d794","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        return struct.pack(\u0027!128s\u0027, bootfile)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def _get_server_name(self, lport):"},{"line_number":322,"context_line":"        server \u003d self._get_extra_dhcp_opts_value(lport, \u0027server-name\u0027)"},{"line_number":323,"context_line":"        return struct.pack(\u0027!64s\u0027, server)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def _get_port_netmask(self, subnet):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_1e7ed818","line":322,"in_reply_to":"bab6814e_3b713945","updated":"2016-05-26 11:06:43.000000000","message":"yes, I noticed that:\ndnsmasq use option 66 to transfer server name, use 67 to transfer bootfile when \"NO_OVERRIDE\" is not set.\nbut when \"NO_OVERRIDE\" is set, it use sname and file instead.","commit_id":"987cf23729a54bce5e0b15aa04e2383fcbd91681"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"8d17421e5ed2742d10cce8f07324657eb8b8af55","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        bootfile_name \u003d self._get_bootfile_name(lport)"},{"line_number":197,"context_line":"        if not bootfile_name:"},{"line_number":198,"context_line":"            bootfile_name \u003d dhcp_packet.boot_file"},{"line_number":199,"context_line":"        server_name \u003d self._get_server_name(lport)"},{"line_number":200,"context_line":"        option_list \u003d ["},{"line_number":201,"context_line":"            dhcp.option(dhcp.DHCP_MESSAGE_TYPE_OPT, b\u0027\\x05\u0027, 1),"},{"line_number":202,"context_line":"            dhcp.option(dhcp.DHCP_SUBNET_MASK_OPT, netmask_bin, 4),"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a629dbe_afb56432","line":199,"range":{"start_line":199,"start_character":8,"end_line":199,"end_character":19},"updated":"2016-11-14 07:26:18.000000000","message":"According to the comment on Patch Set 2, shouldn\u0027t this be set only if bootfile_name was set? (in an \u0027else\u0027 clause)","commit_id":"cfa22acef5abbca6318467390c16123fe8edd2a1"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"8d17421e5ed2742d10cce8f07324657eb8b8af55","unresolved":false,"context_lines":[{"line_number":255,"context_line":"        bootfile_name \u003d self._get_bootfile_name(lport)"},{"line_number":256,"context_line":"        if not bootfile_name:"},{"line_number":257,"context_line":"            bootfile_name \u003d dhcp_packet.boot_file"},{"line_number":258,"context_line":"        server_name \u003d self._get_server_name(lport)"},{"line_number":259,"context_line":"        option_list \u003d ["},{"line_number":260,"context_line":"            dhcp.option(dhcp.DHCP_MESSAGE_TYPE_OPT, b\u0027\\x02\u0027, 1),"},{"line_number":261,"context_line":"            dhcp.option(dhcp.DHCP_SUBNET_MASK_OPT, netmask_bin, 4),"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a629dbe_cf80d84c","line":258,"range":{"start_line":258,"start_character":8,"end_line":258,"end_character":19},"updated":"2016-11-14 07:26:18.000000000","message":"Same as above","commit_id":"cfa22acef5abbca6318467390c16123fe8edd2a1"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"c182a81e84dbdeb9181c2619bc272e405c575e5b","unresolved":false,"context_lines":[{"line_number":356,"context_line":"    def _get_port_gateway_address(self, subnet):"},{"line_number":357,"context_line":"        return netaddr.IPAddress(subnet.get_gateway_ip())"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"    def _get_extra_dhcp_opts_value(self, lport, expected_name):"},{"line_number":360,"context_line":"        extra_opts \u003d lport.get_extra_dhcp_opts()"},{"line_number":361,"context_line":"        value \u003d \u0027\u0027"},{"line_number":362,"context_line":"        for opt in extra_opts:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a629dbe_c1ac1f8f","line":359,"range":{"start_line":359,"start_character":48,"end_line":359,"end_character":61},"updated":"2016-11-14 13:41:11.000000000","message":"nit: maybe better with just \"opt_name\"","commit_id":"cfa22acef5abbca6318467390c16123fe8edd2a1"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"8d17421e5ed2742d10cce8f07324657eb8b8af55","unresolved":false,"context_lines":[{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def _get_server_name(self, lport):"},{"line_number":373,"context_line":"        server \u003d self._get_extra_dhcp_opts_value(lport, \u0027server-name\u0027)"},{"line_number":374,"context_line":"        return struct.pack(\u0027!64s\u0027, server)"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    def _get_port_netmask(self, subnet):"},{"line_number":377,"context_line":"        return netaddr.IPNetwork(subnet.get_cidr()).netmask"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a629dbe_2f5b1430","line":374,"range":{"start_line":374,"start_character":22,"end_line":374,"end_character":26},"updated":"2016-11-14 07:26:18.000000000","message":"I believe this is redundant; According to Ryu documentation, the sname should be null terminated string and not a packed string","commit_id":"cfa22acef5abbca6318467390c16123fe8edd2a1"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"c182a81e84dbdeb9181c2619bc272e405c575e5b","unresolved":false,"context_lines":[{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def _get_server_name(self, lport):"},{"line_number":373,"context_line":"        server \u003d self._get_extra_dhcp_opts_value(lport, \u0027server-name\u0027)"},{"line_number":374,"context_line":"        return struct.pack(\u0027!64s\u0027, server)"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    def _get_port_netmask(self, subnet):"},{"line_number":377,"context_line":"        return netaddr.IPNetwork(subnet.get_cidr()).netmask"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a629dbe_e1d763eb","line":374,"range":{"start_line":374,"start_character":22,"end_line":374,"end_character":26},"in_reply_to":"9a629dbe_2f5b1430","updated":"2016-11-14 13:41:11.000000000","message":"If this is true, then maybe we should consider removing these small methods and just use _get_extra_dhcp_opts_value","commit_id":"cfa22acef5abbca6318467390c16123fe8edd2a1"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"0ee397d60c10cf3a77f5945a7308c4227d8725fd","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        # options 66 and 67 is used for tftp server name and bootfile name"},{"line_number":202,"context_line":"        # respectively."},{"line_number":203,"context_line":"        pxe_options \u003d []"},{"line_number":204,"context_line":"        if self._is_pxe_opt_required(dhcp_packet):"},{"line_number":205,"context_line":"            bootfile_name \u003d self._get_extra_dhcp_opts_value(lport,"},{"line_number":206,"context_line":"                                                            \u0027bootfile-name\u0027)"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"            server_name \u003d self._get_extra_dhcp_opts_value(lport, \u0027next-server\u0027)"},{"line_number":209,"context_line":"            tftp_server \u003d self._get_extra_dhcp_opts_value(lport, \u0027tftp-server\u0027)"},{"line_number":210,"context_line":"            # Just to be on the safer side information has been provided at"},{"line_number":211,"context_line":"            # both the places."},{"line_number":212,"context_line":"            pxe_options.append(dhcp.options(dhcp.DHCP_TFTP_SERVER_NAME,"},{"line_number":213,"context_line":"                                            tftp_server,"},{"line_number":214,"context_line":"                                            len(tftp_server)))"},{"line_number":215,"context_line":"            pxe_options.append(dhcp.options(dhcp.DHCP_BOOT_FILE_NAME,"},{"line_number":216,"context_line":"                                            bootfile_name,"},{"line_number":217,"context_line":"                                            len(bootfile_name)))"},{"line_number":218,"context_line":"        else:"},{"line_number":219,"context_line":"            bootfile_name \u003d dhcp_packet.boot_file"},{"line_number":220,"context_line":"            server_name \u003d \u0027\u0027"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        option_list \u003d ["},{"line_number":223,"context_line":"            dhcp.option(dhcp.DHCP_MESSAGE_TYPE_OPT, b\u0027\\x05\u0027, 1),"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_4975c361","line":220,"range":{"start_line":204,"start_character":8,"end_line":220,"end_character":28},"updated":"2016-11-20 06:29:20.000000000","message":"This is very similar functionality to the one at _create_dhcp_offer, consider using a function.","commit_id":"f8c746c5e1f9ed3a27bfa8beb0ed18e00ebd86bb"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"90d92c4d8604a2d47179cfafe6a6823812969d59","unresolved":false,"context_lines":[{"line_number":367,"context_line":"    def _is_pxe_opt_required(self, dhcp_packet):"},{"line_number":368,"context_line":"        if dhcp_packet.boot_file:"},{"line_number":369,"context_line":"            return True"},{"line_number":370,"context_line":"        for opt in dhcp_packet.options.option_list:"},{"line_number":371,"context_line":"            if opt.tag \u003d\u003d dhcp.DHCP_BOOT_FILE_NAME:"},{"line_number":372,"context_line":"                return True"},{"line_number":373,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_e710735b","line":370,"range":{"start_line":370,"start_character":19,"end_line":370,"end_character":50},"updated":"2016-11-20 14:36:35.000000000","message":"Is it None possible?","commit_id":"f8c746c5e1f9ed3a27bfa8beb0ed18e00ebd86bb"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"90d92c4d8604a2d47179cfafe6a6823812969d59","unresolved":false,"context_lines":[{"line_number":396,"context_line":""},{"line_number":397,"context_line":"    def _get_extra_dhcp_opts_value(self, lport, opt_name):"},{"line_number":398,"context_line":"        extra_opts \u003d lport.get_extra_dhcp_opts()"},{"line_number":399,"context_line":"        value \u003d \u0027\u0027"},{"line_number":400,"context_line":"        for opt in extra_opts:"},{"line_number":401,"context_line":"            if opt_name \u003d\u003d opt[\u0027opt_name\u0027]:"},{"line_number":402,"context_line":"                value \u003d opt[\u0027opt_value\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_87297f9d","line":399,"range":{"start_line":399,"start_character":8,"end_line":399,"end_character":18},"updated":"2016-11-20 14:36:35.000000000","message":"indeed you can delete this line.","commit_id":"f8c746c5e1f9ed3a27bfa8beb0ed18e00ebd86bb"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"d8d63ee35fdd159386285637f07428272dfd90de","unresolved":false,"context_lines":[{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        routes_bin \u003d b\u0027\u0027"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        opt \u003d lport.extra_dhcp_options[dhcp.DHCP_CLASSLESS_ROUTE_OPT]"},{"line_number":222,"context_line":"        if opt:"},{"line_number":223,"context_line":"            dest_cidr, _c, via \u003d opt.partition(\u0027,\u0027)"},{"line_number":224,"context_line":"            host_routes.append("},{"line_number":225,"context_line":"                host_route.HostRoute(destination\u003ddest_cidr,"},{"line_number":226,"context_line":"                                     nexthop\u003dvia))"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        for route in host_routes:"},{"line_number":229,"context_line":"            dest \u003d route.destination.network"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f231b9d_a8aeaa2b","line":226,"range":{"start_line":221,"start_character":0,"end_line":226,"end_character":50},"updated":"2017-06-12 18:57:38.000000000","message":"I think you need to either use get (opt \u003d lport.extra_dhcp_options.get(dhcp.DHCP_CLASSLESS_ROUTE_OPT)) or surround with a try/catch (and then you probably won\u0027t need the \u0027if opt:\u0027 test.)","commit_id":"f99f79a8be49ce90ab4d6a14d90490a5345273b7"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"d8d63ee35fdd159386285637f07428272dfd90de","unresolved":false,"context_lines":[{"line_number":231,"context_line":"            routes_bin +\u003d struct.pack(\u0027B\u0027, mask)"},{"line_number":232,"context_line":"            \"\"\""},{"line_number":233,"context_line":"            for compact encoding"},{"line_number":234,"context_line":"            Width of subnet mask      NumNber of significant octets"},{"line_number":235,"context_line":"                            0               0"},{"line_number":236,"context_line":"                         1- 8               1"},{"line_number":237,"context_line":"                         9-16               2"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f231b9d_a8734ae7","line":234,"range":{"start_line":234,"start_character":41,"end_line":234,"end_character":42},"updated":"2017-06-12 18:57:38.000000000","message":"Typo?","commit_id":"f99f79a8be49ce90ab4d6a14d90490a5345273b7"}],"dragonflow/db/api_nb.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"c182a81e84dbdeb9181c2619bc272e405c575e5b","unresolved":false,"context_lines":[{"line_number":971,"context_line":"        return self.lport.get(\u0027remote_vtep\u0027, False)"},{"line_number":972,"context_line":""},{"line_number":973,"context_line":"    def get_extra_dhcp_opts(self):"},{"line_number":974,"context_line":"        return self.lport[\u0027extra_dhcp_opts\u0027]"},{"line_number":975,"context_line":""},{"line_number":976,"context_line":"    def __str__(self):"},{"line_number":977,"context_line":"        lport_with_exteral_dict \u003d dict(self.lport)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a629dbe_a1e3ab04","line":974,"range":{"start_line":974,"start_character":0,"end_line":974,"end_character":44},"updated":"2016-11-14 13:41:11.000000000","message":"Try to use \n\nreturn self.lport.get(\u0027extra_dhcp_opts\u0027, [])\n\nto avoid cause keyerror.","commit_id":"cfa22acef5abbca6318467390c16123fe8edd2a1"}],"dragonflow/db/field_types.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"53f7807755233f271f543e9dc26f9261a33eb236","unresolved":false,"context_lines":[{"line_number":235,"context_line":""},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"class IntStringDictField(fields.BaseField):"},{"line_number":238,"context_line":"    \u0027\u0027\u0027A field that stores a string -\u003e string dictionary\u0027\u0027\u0027"},{"line_number":239,"context_line":"    types \u003d (dict,)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    def validate(self, value):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7f231b9d_0d142943","line":238,"range":{"start_line":238,"start_character":27,"end_line":238,"end_character":45},"updated":"2017-06-15 11:09:56.000000000","message":"It should be a int -\u003e string dictionary, right?","commit_id":"3073690029a48656288d1f57aec430406a404ad1"}],"dragonflow/neutron/plugin.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"c182a81e84dbdeb9181c2619bc272e405c575e5b","unresolved":false,"context_lines":[{"line_number":743,"context_line":"            binding_profile\u003dport.get(\u0027binding:profile\u0027, None),"},{"line_number":744,"context_line":"            binding_vnic_type\u003dport.get(\u0027binding:vnic_type\u0027, None),"},{"line_number":745,"context_line":"            allowed_address_pairs\u003dport[addr_pair.ADDRESS_PAIRS],"},{"line_number":746,"context_line":"            extra_dhcp_opts\u003dport.get(\u0027extra_dhcp_opts\u0027, []))"},{"line_number":747,"context_line":""},{"line_number":748,"context_line":"        return port"},{"line_number":749,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a629dbe_612a732e","line":746,"updated":"2016-11-14 13:41:11.000000000","message":"We are switching to ml2 mech driver now, I think it is better to also make change at dragonflow/neutron/ml2/mech_driver.py","commit_id":"cfa22acef5abbca6318467390c16123fe8edd2a1"}],"dragonflow/tests/fullstack/test_neutron_api.py":[{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"3595b77860a0d36090499800a1c0098622745b74","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    def test_create_port_with_extra_dhcp_opts(self):"},{"line_number":134,"context_line":"        network \u003d self.store(objects.NetworkTestObj(self.neutron, self.nb_api))"},{"line_number":135,"context_line":"        network_id \u003d network.create()"},{"line_number":136,"context_line":"        self.assertTrue(network.exists())"},{"line_number":137,"context_line":"        port \u003d self.store(objects.PortTestObj(self.neutron,"},{"line_number":138,"context_line":"                          self.nb_api, network_id))"},{"line_number":139,"context_line":"        port_data \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_316baa21","line":136,"range":{"start_line":136,"start_character":13,"end_line":136,"end_character":23},"updated":"2016-06-15 07:37:13.000000000","message":"You need create a subnet with dhcp enabled, which is similar to the real use case.","commit_id":"987cf23729a54bce5e0b15aa04e2383fcbd91681"},{"author":{"_account_id":18186,"name":"Denis Makogon","username":"denismakogon","inactive":true},"change_message_id":"7f5e383ab91422dc0a12362f50396607cd12961b","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    def test_create_port_with_extra_dhcp_opts(self):"},{"line_number":134,"context_line":"        network \u003d self.store(objects.NetworkTestObj(self.neutron, self.nb_api))"},{"line_number":135,"context_line":"        network_id \u003d network.create()"},{"line_number":136,"context_line":"        self.assertTrue(network.exists())"},{"line_number":137,"context_line":"        port \u003d self.store(objects.PortTestObj(self.neutron,"},{"line_number":138,"context_line":"                          self.nb_api, network_id))"},{"line_number":139,"context_line":"        port_data \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_ee6f74fa","line":136,"range":{"start_line":136,"start_character":13,"end_line":136,"end_character":23},"in_reply_to":"7aa08908_316baa21","updated":"2016-06-15 11:05:04.000000000","message":"Agreed","commit_id":"987cf23729a54bce5e0b15aa04e2383fcbd91681"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"66663eb15ac2c0d64a9df232291562a3a052522b","unresolved":false,"context_lines":[{"line_number":295,"context_line":"        subnet \u003d lswitch.get_subnets()"},{"line_number":296,"context_line":"        port_id \u003d port.create(port_data)"},{"line_number":297,"context_line":"        lport \u003d self.nb_api.get_logical_port(port_id)"},{"line_number":298,"context_line":"        self.assertEqual("},{"line_number":299,"context_line":"            0, cmp(port_data[\u0027extra_dhcp_opts\u0027], lport.get_extra_dhcp_opts())"},{"line_number":300,"context_line":"        )"},{"line_number":301,"context_line":"        self.assertEqual("},{"line_number":302,"context_line":"            0, cmp(subnet_data[\u0027host_routes\u0027], subnet[0].get_host_routes())"},{"line_number":303,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_a9ebb7da","line":300,"range":{"start_line":298,"start_character":8,"end_line":300,"end_character":9},"updated":"2016-11-20 06:43:07.000000000","message":"The fullstack test fails here.\nAs you compare the entire options list, I suspect it has to do with the order of the options (though I may be wrong).\nThis should be debugged on some environment...","commit_id":"f8c746c5e1f9ed3a27bfa8beb0ed18e00ebd86bb"}],"dragonflow/tests/unit/test_app_base.py":[{"author":{"_account_id":23235,"name":"Lihi Wishnitzer","email":"lihiwish@gmail.com","username":"lihiwish"},"change_message_id":"ecb7f38a83a12d00268ad686b322e5f1f028b349","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        device_owner\u003ddevice_owner,"},{"line_number":186,"context_line":"        device_id\u003ddevice_id,"},{"line_number":187,"context_line":"        # binding_vnic_type\u003dbinding_vnic_type,"},{"line_number":188,"context_line":"        extra_dhcp_options\u003d{} if not extra_dhcp_opts else extra_dhcp_opts,"},{"line_number":189,"context_line":"    )"},{"line_number":190,"context_line":"    fake_port.is_local \u003d is_local"},{"line_number":191,"context_line":"    fake_port.segmentation_id \u003d segmentation_id"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f231b9d_968d3333","line":188,"range":{"start_line":188,"start_character":27,"end_line":188,"end_character":58},"updated":"2017-06-13 13:39:03.000000000","message":"Why changing this instead of setting {} as a default value for extra_dhcp_options in the LogicalPort?","commit_id":"48d704b0e1c3ce40c2ae7b72a5d10804dcff0ee0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"d29b58e435bee9bbe110799b238f5a57b604df45","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        device_owner\u003ddevice_owner,"},{"line_number":186,"context_line":"        device_id\u003ddevice_id,"},{"line_number":187,"context_line":"        # binding_vnic_type\u003dbinding_vnic_type,"},{"line_number":188,"context_line":"        extra_dhcp_options\u003d{} if not extra_dhcp_opts else extra_dhcp_opts,"},{"line_number":189,"context_line":"    )"},{"line_number":190,"context_line":"    fake_port.is_local \u003d is_local"},{"line_number":191,"context_line":"    fake_port.segmentation_id \u003d segmentation_id"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f231b9d_fc7c1684","line":188,"range":{"start_line":188,"start_character":27,"end_line":188,"end_character":58},"in_reply_to":"7f231b9d_968d3333","updated":"2017-06-14 19:58:42.000000000","message":"-1.\n\nSetting mutable objects as default values is Bad. Default values are constructed during function definition, not call. So the value is reused. If it\u0027s a mutable value, changes made in one call affect subsequent calls.\n\nSuppose the following scenario:\n\nlport \u003d create_fake_lport(...) # Now lport.extra_dhcp_options is {} from the default value\n\nlport.extra_dhcp_options[TAG] \u003d VALUE\n\nlport2 \u003d create_fake_lport(...) # Still taking default value for extra_dhcp_options. Only now, it\u0027s {TAG: VALUE}\n\nI think keeping the default as None and testing against it is the best option.","commit_id":"48d704b0e1c3ce40c2ae7b72a5d10804dcff0ee0"}],"dragonflow/tests/unit/test_mech_driver.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"53f7807755233f271f543e9dc26f9261a33eb236","unresolved":false,"context_lines":[{"line_number":486,"context_line":"                                 \u0027tag\u0027: 121}]"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"                for edo in expected_edo:"},{"line_number":489,"context_line":"                    self.assertItemsEqual(edo[\u0027value\u0027],"},{"line_number":490,"context_line":"                                          lport.extra_dhcp_options[edo[\u0027tag\u0027]])"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"                self.nb_api.update.reset_mock()"}],"source_content_type":"text/x-python","patch_set":12,"id":"7f231b9d_2df5a5ed","line":489,"range":{"start_line":489,"start_character":25,"end_line":489,"end_character":41},"updated":"2017-06-15 11:09:56.000000000","message":"assertEuqal should be fine here.","commit_id":"3073690029a48656288d1f57aec430406a404ad1"}]}
