)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"07f752643b63aac3700997d37deda0a712974563","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Assaf Muller \u003camuller@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-08-06 23:34:26 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implement ip_lib.device_configured_with"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add functional test for new function as well as device_exists."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"baada198_8700cd6a","line":7,"range":{"start_line":7,"start_character":17,"end_line":7,"end_character":39},"updated":"2014-08-06 21:19:34.000000000","message":"please update the commit message with the new name.","commit_id":"0f60ef06c2e731d8b3d83ef1828f91f0acd839d1"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d7d5b997f0881ff8c7bb92b451b1ae2d02469eaf","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Assaf Muller \u003camuller@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-08-10 16:28:49 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implement ip_lib.device_exists_with_ip_mac"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add functional test for new function as well as device_exists."},{"line_number":10,"context_line":"device_exists_with_ip_mac in a new l3 agent functional test."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"baada198_8f83ed53","line":7,"updated":"2014-08-12 03:58:03.000000000","message":"Can you explain why you need to implement this? It\u0027s not used here and I don\u0027t see a patch depending on it? If it is obvious to to everyone following the work on the blueprint, then please ignore me.","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"1d10996c9bb93bed02f0b7acbe90086be15d156b","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Assaf Muller \u003camuller@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-08-10 16:28:49 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implement ip_lib.device_exists_with_ip_mac"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add functional test for new function as well as device_exists."},{"line_number":10,"context_line":"device_exists_with_ip_mac in a new l3 agent functional test."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"baada198_f2928c56","line":7,"in_reply_to":"baada198_8f83ed53","updated":"2014-08-12 04:39:09.000000000","message":"it\u0027s used by https://review.openstack.org/#/c/109860/","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"7d4dd3ef2fdcd9db60eae971e5ece542cd224505","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Assaf Muller \u003camuller@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-08-10 16:28:49 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implement ip_lib.device_exists_with_ip_mac"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add functional test for new function as well as device_exists."},{"line_number":10,"context_line":"device_exists_with_ip_mac in a new l3 agent functional test."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"baada198_4dde2b11","line":7,"in_reply_to":"baada198_f2928c56","updated":"2014-08-12 14:09:07.000000000","message":"Thanks, I don\u0027t know why I didn\u0027t see that before.","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"b39ab4b3bad273fed926d09181907132157914d1","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Implement ip_lib.device_exists_with_ip_mac"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add functional tests for ip_lib.device_exists,"},{"line_number":10,"context_line":"ip_lib.device_exists_with_ip_mac."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements: blueprint l3-high-availability"},{"line_number":13,"context_line":"Change-Id: I1495bcf1f1a88e2eb78df79cccb64121ccf435fb"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"baada198_294d2f72","line":10,"updated":"2014-08-13 14:35:33.000000000","message":"Not really descriptive enough. You only say that you add functional tests.","commit_id":"2ae093d7b7903a3eda94cb844f5eb2299df97297"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"22ceef7dcca7736008d284e7088fd9e504616195","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Implement ip_lib.device_exists_with_ip_mac"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add functional tests for ip_lib.device_exists,"},{"line_number":10,"context_line":"ip_lib.device_exists_with_ip_mac."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements: blueprint l3-high-availability"},{"line_number":13,"context_line":"Change-Id: I1495bcf1f1a88e2eb78df79cccb64121ccf435fb"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"baada198_2cfffd01","line":10,"in_reply_to":"baada198_294d2f72","updated":"2014-08-13 14:50:31.000000000","message":"Fair enough.","commit_id":"2ae093d7b7903a3eda94cb844f5eb2299df97297"}],"neutron/agent/linux/ip_lib.py":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"66b2cecb56bbf938b2dbec1bab333d61bf6b6530","unresolved":false,"context_lines":[{"line_number":553,"context_line":""},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"def device_configured_with(device_name, ip, mac, root_helper\u003dNone,"},{"line_number":556,"context_line":"                           namespace\u003dNone):"},{"line_number":557,"context_line":"    try:"},{"line_number":558,"context_line":"        device \u003d IPDevice(device_name, root_helper, namespace)"},{"line_number":559,"context_line":"        if mac !\u003d device.link.address:"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_d7045a7f","line":556,"updated":"2014-08-06 00:28:25.000000000","message":"can you add docstring?\nwhat this function does is not entirely clear from the function name.","commit_id":"4c9cba5bb57872e4f07e0767f54e982a9eff54ff"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"ebc82728192c46f3d5a5c85ae5248a1452aa0691","unresolved":false,"context_lines":[{"line_number":553,"context_line":""},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"def device_configured_with(device_name, ip, mac, root_helper\u003dNone,"},{"line_number":556,"context_line":"                           namespace\u003dNone):"},{"line_number":557,"context_line":"    try:"},{"line_number":558,"context_line":"        device \u003d IPDevice(device_name, root_helper, namespace)"},{"line_number":559,"context_line":"        if mac !\u003d device.link.address:"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_29a28fad","line":556,"in_reply_to":"baada198_d7045a7f","updated":"2014-08-06 10:59:59.000000000","message":"Certainly!","commit_id":"4c9cba5bb57872e4f07e0767f54e982a9eff54ff"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"0a6cbc72bfa8ba4bc0a633febcdf3afd4505ede5","unresolved":false,"context_lines":[{"line_number":545,"context_line":""},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"def device_exists(device_name, root_helper\u003dNone, namespace\u003dNone):"},{"line_number":548,"context_line":"    \"\"\"Does a networking device exist in the given namespace?"},{"line_number":549,"context_line":"    \"\"\""},{"line_number":550,"context_line":"    try:"},{"line_number":551,"context_line":"        address \u003d IPDevice(device_name, root_helper, namespace).link.address"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_3b0e4d3e","line":548,"updated":"2014-08-06 13:55:25.000000000","message":"Returns if the device exists.","commit_id":"39eb9ae80051bbcd0dad4f285093ef63f0130e0a"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"f57337f429244981200fc1168814b6efa94d53fb","unresolved":false,"context_lines":[{"line_number":545,"context_line":""},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"def device_exists(device_name, root_helper\u003dNone, namespace\u003dNone):"},{"line_number":548,"context_line":"    \"\"\"Does a networking device exist in the given namespace?"},{"line_number":549,"context_line":"    \"\"\""},{"line_number":550,"context_line":"    try:"},{"line_number":551,"context_line":"        address \u003d IPDevice(device_name, root_helper, namespace).link.address"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_5a268dcc","line":548,"in_reply_to":"baada198_3b0e4d3e","updated":"2014-08-06 20:40:59.000000000","message":"Done","commit_id":"39eb9ae80051bbcd0dad4f285093ef63f0130e0a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"0a6cbc72bfa8ba4bc0a633febcdf3afd4505ede5","unresolved":false,"context_lines":[{"line_number":554,"context_line":"    return bool(address)"},{"line_number":555,"context_line":""},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"def device_configured_with(device_name, ip, mac, root_helper\u003dNone,"},{"line_number":558,"context_line":"                           namespace\u003dNone):"},{"line_number":559,"context_line":"    \"\"\"Does a networking device exist in the given namespace, configured"},{"line_number":560,"context_line":"    with the given IP and MAC addresses?"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_ad186477","line":557,"updated":"2014-08-06 13:55:25.000000000","message":"this method name is very odd. it actually does not reflect what the method does.\nmaybe consider: device_exists_in_ns or something along those lines or configured_device_exists...","commit_id":"39eb9ae80051bbcd0dad4f285093ef63f0130e0a"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"f57337f429244981200fc1168814b6efa94d53fb","unresolved":false,"context_lines":[{"line_number":554,"context_line":"    return bool(address)"},{"line_number":555,"context_line":""},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"def device_configured_with(device_name, ip, mac, root_helper\u003dNone,"},{"line_number":558,"context_line":"                           namespace\u003dNone):"},{"line_number":559,"context_line":"    \"\"\"Does a networking device exist in the given namespace, configured"},{"line_number":560,"context_line":"    with the given IP and MAC addresses?"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_7528c236","line":557,"in_reply_to":"baada198_ad186477","updated":"2014-08-06 20:40:59.000000000","message":"Done","commit_id":"39eb9ae80051bbcd0dad4f285093ef63f0130e0a"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"8fd0c4bcd7eae85f86e0cbdc892bc3f49842124f","unresolved":false,"context_lines":[{"line_number":545,"context_line":""},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"def device_exists(device_name, root_helper\u003dNone, namespace\u003dNone):"},{"line_number":548,"context_line":"    \"\"\"Returns if the device exists in the namespace.\"\"\""},{"line_number":549,"context_line":"    try:"},{"line_number":550,"context_line":"        address \u003d IPDevice(device_name, root_helper, namespace).link.address"},{"line_number":551,"context_line":"    except RuntimeError:"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_be23d6a8","line":548,"updated":"2014-08-08 14:42:26.000000000","message":"just a nit: \"Returns True if...\"","commit_id":"5897deef4d3f9287c724a17dd67ae34e61352a93"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"2229e5747f01a6e90ad4ab5406c332ddac439d44","unresolved":false,"context_lines":[{"line_number":545,"context_line":""},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"def device_exists(device_name, root_helper\u003dNone, namespace\u003dNone):"},{"line_number":548,"context_line":"    \"\"\"Returns if the device exists in the namespace.\"\"\""},{"line_number":549,"context_line":"    try:"},{"line_number":550,"context_line":"        address \u003d IPDevice(device_name, root_helper, namespace).link.address"},{"line_number":551,"context_line":"    except RuntimeError:"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_7a55aaf7","line":548,"in_reply_to":"baada198_be23d6a8","updated":"2014-08-10 13:27:21.000000000","message":"Done","commit_id":"5897deef4d3f9287c724a17dd67ae34e61352a93"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"8fd0c4bcd7eae85f86e0cbdc892bc3f49842124f","unresolved":false,"context_lines":[{"line_number":555,"context_line":""},{"line_number":556,"context_line":"def device_exists_with_ip_mac(device_name, ip, mac, root_helper\u003dNone,"},{"line_number":557,"context_line":"                              namespace\u003dNone):"},{"line_number":558,"context_line":"    \"\"\"Returns if the device exists in the namespace, with the given IP and"},{"line_number":559,"context_line":"    MAC addresses."},{"line_number":560,"context_line":"    \"\"\""},{"line_number":561,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_7e169e4b","line":558,"updated":"2014-08-08 14:42:26.000000000","message":"just a nit: \"Returns True if...\"","commit_id":"5897deef4d3f9287c724a17dd67ae34e61352a93"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"2229e5747f01a6e90ad4ab5406c332ddac439d44","unresolved":false,"context_lines":[{"line_number":555,"context_line":""},{"line_number":556,"context_line":"def device_exists_with_ip_mac(device_name, ip, mac, root_helper\u003dNone,"},{"line_number":557,"context_line":"                              namespace\u003dNone):"},{"line_number":558,"context_line":"    \"\"\"Returns if the device exists in the namespace, with the given IP and"},{"line_number":559,"context_line":"    MAC addresses."},{"line_number":560,"context_line":"    \"\"\""},{"line_number":561,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_9a3d1ebf","line":558,"in_reply_to":"baada198_7e169e4b","updated":"2014-08-10 13:27:21.000000000","message":"Done","commit_id":"5897deef4d3f9287c724a17dd67ae34e61352a93"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d7d5b997f0881ff8c7bb92b451b1ae2d02469eaf","unresolved":false,"context_lines":[{"line_number":556,"context_line":"def device_exists_with_ip_mac(device_name, ip, mac, root_helper\u003dNone,"},{"line_number":557,"context_line":"                              namespace\u003dNone):"},{"line_number":558,"context_line":"    \"\"\"Returns True if the device exists in the namespace, with the given IP"},{"line_number":559,"context_line":"    and MAC addresses."},{"line_number":560,"context_line":"    \"\"\""},{"line_number":561,"context_line":"    try:"},{"line_number":562,"context_line":"        device \u003d IPDevice(device_name, root_helper, namespace)"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_4c4d6392","line":559,"updated":"2014-08-12 03:58:03.000000000","message":"Nit: \"Returns True if the device with the given IP and MAC addresses exists in the namespace.\"","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"8023c1b24f91adccea14bb26d6d6bc8a873a4fcd","unresolved":false,"context_lines":[{"line_number":556,"context_line":"def device_exists_with_ip_mac(device_name, ip, mac, root_helper\u003dNone,"},{"line_number":557,"context_line":"                              namespace\u003dNone):"},{"line_number":558,"context_line":"    \"\"\"Returns True if the device exists in the namespace, with the given IP"},{"line_number":559,"context_line":"    and MAC addresses."},{"line_number":560,"context_line":"    \"\"\""},{"line_number":561,"context_line":"    try:"},{"line_number":562,"context_line":"        device \u003d IPDevice(device_name, root_helper, namespace)"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_ee2b4730","line":559,"in_reply_to":"baada198_4c4d6392","updated":"2014-08-13 11:10:19.000000000","message":"Done","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"b39ab4b3bad273fed926d09181907132157914d1","unresolved":false,"context_lines":[{"line_number":555,"context_line":""},{"line_number":556,"context_line":"def device_exists_with_ip_mac(device_name, ip, mac, root_helper\u003dNone,"},{"line_number":557,"context_line":"                              namespace\u003dNone):"},{"line_number":558,"context_line":"    \"\"\"Returns True if the device with the given IP and MAC addresses"},{"line_number":559,"context_line":"    exists in the namespace."},{"line_number":560,"context_line":"    \"\"\""},{"line_number":561,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_e942573a","line":558,"updated":"2014-08-13 14:35:33.000000000","message":"MAC addresses?","commit_id":"2ae093d7b7903a3eda94cb844f5eb2299df97297"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"272622c6b9655fa99c55b0c8459e3b825db6a1f0","unresolved":false,"context_lines":[{"line_number":555,"context_line":""},{"line_number":556,"context_line":"def device_exists_with_ip_mac(device_name, ip, mac, root_helper\u003dNone,"},{"line_number":557,"context_line":"                              namespace\u003dNone):"},{"line_number":558,"context_line":"    \"\"\"Returns True if the device with the given IP and MAC addresses"},{"line_number":559,"context_line":"    exists in the namespace."},{"line_number":560,"context_line":"    \"\"\""},{"line_number":561,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_ecb5051a","line":558,"in_reply_to":"baada198_2931af0a","updated":"2014-08-13 14:59:35.000000000","message":"Aah, I get it now. :D\n\nAny other phrasings I can image still have IP and MAC addresses togheter.","commit_id":"2ae093d7b7903a3eda94cb844f5eb2299df97297"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"22ceef7dcca7736008d284e7088fd9e504616195","unresolved":false,"context_lines":[{"line_number":555,"context_line":""},{"line_number":556,"context_line":"def device_exists_with_ip_mac(device_name, ip, mac, root_helper\u003dNone,"},{"line_number":557,"context_line":"                              namespace\u003dNone):"},{"line_number":558,"context_line":"    \"\"\"Returns True if the device with the given IP and MAC addresses"},{"line_number":559,"context_line":"    exists in the namespace."},{"line_number":560,"context_line":"    \"\"\""},{"line_number":561,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_2931af0a","line":558,"in_reply_to":"baada198_e942573a","updated":"2014-08-13 14:50:31.000000000","message":"addresses is in plural, referring to both IP and MAC. If you have a clearer phrasing go ahead :)","commit_id":"2ae093d7b7903a3eda94cb844f5eb2299df97297"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"b39ab4b3bad273fed926d09181907132157914d1","unresolved":false,"context_lines":[{"line_number":562,"context_line":"        device \u003d IPDevice(device_name, root_helper, namespace)"},{"line_number":563,"context_line":"        if mac !\u003d device.link.address:"},{"line_number":564,"context_line":"            return False"},{"line_number":565,"context_line":"        if ip not in (ip[\u0027cidr\u0027] for ip in device.addr.list()):"},{"line_number":566,"context_line":"            return False"},{"line_number":567,"context_line":"    except RuntimeError:"},{"line_number":568,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_a95f7f0f","line":565,"updated":"2014-08-13 14:35:33.000000000","message":"I have a question: CIDR has the format x.x.x.x/y. I assume ip is just in the format x.x.x.x, meaning this will always be True. Corect?","commit_id":"2ae093d7b7903a3eda94cb844f5eb2299df97297"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"22ceef7dcca7736008d284e7088fd9e504616195","unresolved":false,"context_lines":[{"line_number":562,"context_line":"        device \u003d IPDevice(device_name, root_helper, namespace)"},{"line_number":563,"context_line":"        if mac !\u003d device.link.address:"},{"line_number":564,"context_line":"            return False"},{"line_number":565,"context_line":"        if ip not in (ip[\u0027cidr\u0027] for ip in device.addr.list()):"},{"line_number":566,"context_line":"            return False"},{"line_number":567,"context_line":"    except RuntimeError:"},{"line_number":568,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_e9fdf70a","line":565,"in_reply_to":"baada198_a95f7f0f","updated":"2014-08-13 14:50:31.000000000","message":"The ip parameter is actually also an ip_cidr, I\u0027ll rename the variable.","commit_id":"2ae093d7b7903a3eda94cb844f5eb2299df97297"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"272622c6b9655fa99c55b0c8459e3b825db6a1f0","unresolved":false,"context_lines":[{"line_number":562,"context_line":"        device \u003d IPDevice(device_name, root_helper, namespace)"},{"line_number":563,"context_line":"        if mac !\u003d device.link.address:"},{"line_number":564,"context_line":"            return False"},{"line_number":565,"context_line":"        if ip not in (ip[\u0027cidr\u0027] for ip in device.addr.list()):"},{"line_number":566,"context_line":"            return False"},{"line_number":567,"context_line":"    except RuntimeError:"},{"line_number":568,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_cc14c1ec","line":565,"in_reply_to":"baada198_e9fdf70a","updated":"2014-08-13 14:59:35.000000000","message":"Ok, it will be less confusing then. :D","commit_id":"2ae093d7b7903a3eda94cb844f5eb2299df97297"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"995c5c9d9a83646d3d8320380fe83b19920b6233","unresolved":false,"context_lines":[{"line_number":545,"context_line":""},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"def device_exists(device_name, root_helper\u003dNone, namespace\u003dNone):"},{"line_number":548,"context_line":"    \"\"\"Returns True if the device exists in the namespace.\"\"\""},{"line_number":549,"context_line":"    try:"},{"line_number":550,"context_line":"        address \u003d IPDevice(device_name, root_helper, namespace).link.address"},{"line_number":551,"context_line":"    except RuntimeError:"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_7ad7e350","line":548,"updated":"2014-08-13 15:37:30.000000000","message":"Nit: according pep 257 it should be \"Return True\"","commit_id":"e3e0fd47d51f64da2f996a7ff4e1c9961c0022c9"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"2c2955456b969f4d8a0d4fe1cfe463c95e954130","unresolved":false,"context_lines":[{"line_number":545,"context_line":""},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"def device_exists(device_name, root_helper\u003dNone, namespace\u003dNone):"},{"line_number":548,"context_line":"    \"\"\"Returns True if the device exists in the namespace.\"\"\""},{"line_number":549,"context_line":"    try:"},{"line_number":550,"context_line":"        address \u003d IPDevice(device_name, root_helper, namespace).link.address"},{"line_number":551,"context_line":"    except RuntimeError:"}],"source_content_type":"text/x-python","patch_set":9,"id":"7ac7a964_a94b05af","line":548,"in_reply_to":"baada198_7ad7e350","updated":"2014-08-25 08:34:32.000000000","message":"Done","commit_id":"e3e0fd47d51f64da2f996a7ff4e1c9961c0022c9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"995c5c9d9a83646d3d8320380fe83b19920b6233","unresolved":false,"context_lines":[{"line_number":555,"context_line":""},{"line_number":556,"context_line":"def device_exists_with_ip_mac(device_name, ip_cidr, mac, root_helper\u003dNone,"},{"line_number":557,"context_line":"                              namespace\u003dNone):"},{"line_number":558,"context_line":"    \"\"\"Returns True if the device with the given IP and MAC addresses"},{"line_number":559,"context_line":"    exists in the namespace."},{"line_number":560,"context_line":"    \"\"\""},{"line_number":561,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_dade2f6a","line":558,"updated":"2014-08-13 15:37:30.000000000","message":"Ditto","commit_id":"e3e0fd47d51f64da2f996a7ff4e1c9961c0022c9"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"2c2955456b969f4d8a0d4fe1cfe463c95e954130","unresolved":false,"context_lines":[{"line_number":555,"context_line":""},{"line_number":556,"context_line":"def device_exists_with_ip_mac(device_name, ip_cidr, mac, root_helper\u003dNone,"},{"line_number":557,"context_line":"                              namespace\u003dNone):"},{"line_number":558,"context_line":"    \"\"\"Returns True if the device with the given IP and MAC addresses"},{"line_number":559,"context_line":"    exists in the namespace."},{"line_number":560,"context_line":"    \"\"\""},{"line_number":561,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"7ac7a964_c9c76111","line":558,"in_reply_to":"baada198_dade2f6a","updated":"2014-08-25 08:34:32.000000000","message":"Done","commit_id":"e3e0fd47d51f64da2f996a7ff4e1c9961c0022c9"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"9e7490fb876928ebcd2b3d62a2f712ee4e39cecd","unresolved":false,"context_lines":[{"line_number":557,"context_line":"    return bool(address)"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":""},{"line_number":560,"context_line":"def device_exists_with_ip_mac(device_name, ip_cidr, mac, namespace\u003dNone,"},{"line_number":561,"context_line":"                              root_helper\u003dNone):"},{"line_number":562,"context_line":"    \"\"\"Return True if the device with the given IP and MAC addresses"},{"line_number":563,"context_line":"    exists in the namespace."}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_d32ab52b","line":560,"updated":"2014-08-25 17:21:19.000000000","message":"Why do we need a new method?  Why not add ip_cidr and mac as optional parameters for device_exists?","commit_id":"c5277abccaa9ec4580495867e55d56fba428eb85"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"db46353712d85eb39e4c4192264e9785cc170517","unresolved":false,"context_lines":[{"line_number":557,"context_line":"    return bool(address)"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":""},{"line_number":560,"context_line":"def device_exists_with_ip_mac(device_name, ip_cidr, mac, namespace\u003dNone,"},{"line_number":561,"context_line":"                              root_helper\u003dNone):"},{"line_number":562,"context_line":"    \"\"\"Return True if the device with the given IP and MAC addresses"},{"line_number":563,"context_line":"    exists in the namespace."}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_739481e8","line":560,"in_reply_to":"1abeadc6_d32ab52b","updated":"2014-08-25 17:32:54.000000000","message":"Check out:\n\nhttps://review.openstack.org/#/c/109860/6/neutron/agent/linux/ip_lib.py\n\nI debated this internally: Ultimately Carl, Akihiro, Kyle and Maru voted to split this out to a separate function. I think that on one hand, a method that does something very differently depending on optional parameters can be problematic. On the other, there\u0027s a bit of code duplication. Personally I think that in this case splitting it out to a 2nd function is preferable.","commit_id":"c5277abccaa9ec4580495867e55d56fba428eb85"}],"neutron/tests/functional/agent/linux/base.py":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"7b0685b1a374ef8feb422fa94e5b2dde29d50bea","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        :param *args *kwargs: These will be passed to the create function."},{"line_number":49,"context_line":"        \"\"\""},{"line_number":50,"context_line":"        while True:"},{"line_number":51,"context_line":"            name \u003d self.get_rand_name(max_length\u003dn_const.DEVICE_NAME_MAX_LEN,"},{"line_number":52,"context_line":"                                      prefix\u003dname_prefix)"},{"line_number":53,"context_line":"            try:"},{"line_number":54,"context_line":"                return creation_func(name, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_c91bd3c9","line":51,"updated":"2014-08-06 11:12:45.000000000","message":"why don\u0027t you leave max_length as default?","commit_id":"39eb9ae80051bbcd0dad4f285093ef63f0130e0a"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"f57337f429244981200fc1168814b6efa94d53fb","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        :param *args *kwargs: These will be passed to the create function."},{"line_number":49,"context_line":"        \"\"\""},{"line_number":50,"context_line":"        while True:"},{"line_number":51,"context_line":"            name \u003d self.get_rand_name(max_length\u003dn_const.DEVICE_NAME_MAX_LEN,"},{"line_number":52,"context_line":"                                      prefix\u003dname_prefix)"},{"line_number":53,"context_line":"            try:"},{"line_number":54,"context_line":"                return creation_func(name, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_faabe11c","line":51,"in_reply_to":"baada198_c91bd3c9","updated":"2014-08-06 20:40:59.000000000","message":"Oops, you\u0027re right.","commit_id":"39eb9ae80051bbcd0dad4f285093ef63f0130e0a"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"0a6cbc72bfa8ba4bc0a633febcdf3afd4505ede5","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        :param *args *kwargs: These will be passed to the create function."},{"line_number":49,"context_line":"        \"\"\""},{"line_number":50,"context_line":"        while True:"},{"line_number":51,"context_line":"            name \u003d self.get_rand_name(max_length\u003dn_const.DEVICE_NAME_MAX_LEN,"},{"line_number":52,"context_line":"                                      prefix\u003dname_prefix)"},{"line_number":53,"context_line":"            try:"},{"line_number":54,"context_line":"                return creation_func(name, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_db50f12e","line":51,"in_reply_to":"baada198_c91bd3c9","updated":"2014-08-06 13:55:25.000000000","message":"agree","commit_id":"39eb9ae80051bbcd0dad4f285093ef63f0130e0a"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"31aa48d3ed2ea9053095f7fddbdb9f9adeb814a5","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                self.skipTest(skip_msg)"},{"line_number":34,"context_line":"            raise"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def get_rand_name(self, max_length\u003dn_const.DEVICE_NAME_MAX_LEN,"},{"line_number":37,"context_line":"                      prefix\u003d\u0027test\u0027):"},{"line_number":38,"context_line":"        name \u003d prefix + str(random.randint(1, 0x7fffffff))"},{"line_number":39,"context_line":"        return name[:max_length]"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_78f6645f","line":36,"updated":"2014-08-12 01:29:12.000000000","message":"I\u0027m not sure why the result of this function needs to be limited in size to the max device name length.  Either the name of the function should change to get_rand_dev_name or the length parameter should be optional with a None default and truncation only carried out if a value is provided.","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d7d5b997f0881ff8c7bb92b451b1ae2d02469eaf","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                self.skipTest(skip_msg)"},{"line_number":34,"context_line":"            raise"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def get_rand_name(self, max_length\u003dn_const.DEVICE_NAME_MAX_LEN,"},{"line_number":37,"context_line":"                      prefix\u003d\u0027test\u0027):"},{"line_number":38,"context_line":"        name \u003d prefix + str(random.randint(1, 0x7fffffff))"},{"line_number":39,"context_line":"        return name[:max_length]"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_2c002f02","line":36,"in_reply_to":"baada198_78f6645f","updated":"2014-08-12 03:58:03.000000000","message":"+1","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"8023c1b24f91adccea14bb26d6d6bc8a873a4fcd","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                self.skipTest(skip_msg)"},{"line_number":34,"context_line":"            raise"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def get_rand_name(self, max_length\u003dn_const.DEVICE_NAME_MAX_LEN,"},{"line_number":37,"context_line":"                      prefix\u003d\u0027test\u0027):"},{"line_number":38,"context_line":"        name \u003d prefix + str(random.randint(1, 0x7fffffff))"},{"line_number":39,"context_line":"        return name[:max_length]"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_0e7ddb1e","line":36,"in_reply_to":"baada198_78f6645f","updated":"2014-08-13 11:10:19.000000000","message":"Done","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"6dc5ec4412c1c9a9a94ea26703abeb824edbc5a4","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                self.skipTest(skip_msg)"},{"line_number":34,"context_line":"            raise"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def get_rand_name(self, max_length\u003dn_const.DEVICE_NAME_MAX_LEN,"},{"line_number":37,"context_line":"                      prefix\u003d\u0027test\u0027):"},{"line_number":38,"context_line":"        name \u003d prefix + str(random.randint(1, 0x7fffffff))"},{"line_number":39,"context_line":"        return name[:max_length]"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_1587c35c","line":36,"in_reply_to":"baada198_78f6645f","updated":"2014-08-12 21:59:11.000000000","message":"I think I\u0027ve talked myself in to agreeing with Maru here.  I think None would be a better default meaning don\u0027t truncate.","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"93f35db3c069bb21fba3e6b53349fc616eb38247","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def get_rand_name(self, max_length\u003dNone, prefix\u003d\u0027test\u0027):"},{"line_number":37,"context_line":"        name \u003d prefix + str(random.randint(1, 0x7fffffff))"},{"line_number":38,"context_line":"        return name[:max_length] if max_length else name"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def create_resource(self, name_prefix, creation_func, *args, **kwargs):"},{"line_number":41,"context_line":"        \"\"\"Create a new resource that does not already exist."}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_a2ff8c33","line":38,"updated":"2014-08-14 23:19:14.000000000","message":"nit:  I guess passing 0 as max_length probably doesn\u0027t make much sense.  It would return the full name instead of an empty string.  Seriously, though. Don\u0027t fix this.  ;)","commit_id":"65a3902a2da55e42a01c69bba143621b37865540"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"69f269486892b20ba2c3f56967eefa28c3a45754","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def get_rand_name(self, max_length\u003dNone, prefix\u003d\u0027test\u0027):"},{"line_number":37,"context_line":"        name \u003d prefix + str(random.randint(1, 0x7fffffff))"},{"line_number":38,"context_line":"        return name[:max_length] if max_length else name"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def create_resource(self, name_prefix, creation_func, *args, **kwargs):"},{"line_number":41,"context_line":"        \"\"\"Create a new resource that does not already exist."}],"source_content_type":"text/x-python","patch_set":10,"id":"1abeadc6_353683b5","line":38,"in_reply_to":"7ac7a964_a2ff8c33","updated":"2014-08-25 08:34:42.000000000","message":"I\u0027ll change it to check for None explicitly.","commit_id":"65a3902a2da55e42a01c69bba143621b37865540"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"086fd79a68ea9896bd451b90559c5961df94e09f","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        :param creation_func: A function taking the name of the resource"},{"line_number":45,"context_line":"               to be created as it\u0027s first argument.  An error is assumed"},{"line_number":46,"context_line":"               to indicate a name collision."},{"line_number":47,"context_line":"        :param max_length: Maximal length of the randomly generated name."},{"line_number":48,"context_line":"        :param *args *kwargs: These will be passed to the create function."},{"line_number":49,"context_line":"        \"\"\""},{"line_number":50,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_fe7e7ce3","line":47,"updated":"2014-08-15 02:33:04.000000000","message":"What is your intent in including this parameter doc?  The signature doesn\u0027t specify it and it isn\u0027t used in the method body.","commit_id":"65a3902a2da55e42a01c69bba143621b37865540"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"69f269486892b20ba2c3f56967eefa28c3a45754","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        :param creation_func: A function taking the name of the resource"},{"line_number":45,"context_line":"               to be created as it\u0027s first argument.  An error is assumed"},{"line_number":46,"context_line":"               to indicate a name collision."},{"line_number":47,"context_line":"        :param max_length: Maximal length of the randomly generated name."},{"line_number":48,"context_line":"        :param *args *kwargs: These will be passed to the create function."},{"line_number":49,"context_line":"        \"\"\""},{"line_number":50,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_e16df833","line":47,"in_reply_to":"7ac7a964_fe7e7ce3","updated":"2014-08-25 08:34:42.000000000","message":"Gah, I added it then forgot to remove it.","commit_id":"65a3902a2da55e42a01c69bba143621b37865540"}],"neutron/tests/functional/agent/linux/test_ip_lib.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"0a6cbc72bfa8ba4bc0a633febcdf3afd4505ede5","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"# @author: Assaf Muller, Red Hat."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo.config import cfg"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_5b45c16d","line":16,"updated":"2014-08-06 13:55:25.000000000","message":"you do not need to leave your name here - this is all recorded in gerrit","commit_id":"39eb9ae80051bbcd0dad4f285093ef63f0130e0a"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"31aa48d3ed2ea9053095f7fddbdb9f9adeb814a5","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"# @author: Assaf Muller, Red Hat."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo.config import cfg"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_536181d2","line":16,"updated":"2014-08-12 01:29:12.000000000","message":"I would second an earlier comment that authorship attribution is not really something we do anymore.","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"8023c1b24f91adccea14bb26d6d6bc8a873a4fcd","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"# @author: Assaf Muller, Red Hat."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo.config import cfg"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_2efe1f6b","line":16,"in_reply_to":"baada198_536181d2","updated":"2014-08-13 11:10:19.000000000","message":"Done","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"31aa48d3ed2ea9053095f7fddbdb9f9adeb814a5","unresolved":false,"context_lines":[{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class IpLibTestFramework(base.BaseOVSLinuxTestCase):"},{"line_number":31,"context_line":"    def setUp(self):"},{"line_number":32,"context_line":"        super(IpLibTestFramework, self).setUp()"},{"line_number":33,"context_line":"        self.check_sudo_enabled()"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_18b4887f","line":30,"updated":"2014-08-12 01:29:12.000000000","message":"Why does this test extend from a base class that indicates an OVS specialization?","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"8023c1b24f91adccea14bb26d6d6bc8a873a4fcd","unresolved":false,"context_lines":[{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class IpLibTestFramework(base.BaseOVSLinuxTestCase):"},{"line_number":31,"context_line":"    def setUp(self):"},{"line_number":32,"context_line":"        super(IpLibTestFramework, self).setUp()"},{"line_number":33,"context_line":"        self.check_sudo_enabled()"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_ce5a0385","line":30,"in_reply_to":"baada198_18b4887f","updated":"2014-08-13 11:10:19.000000000","message":"Copy/paste mistake, it should inherit from BaseLinuxTestCase, which BaseOVSLinuxTestCase inherits from.","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"31aa48d3ed2ea9053095f7fddbdb9f9adeb814a5","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        tap_device.link.set_address(mac)"},{"line_number":59,"context_line":"        self.driver.init_l3(name, [ip_cidr], namespace\u003dnamespace)"},{"line_number":60,"context_line":"        tap_device.link.set_up()"},{"line_number":61,"context_line":"        self.addCleanup(ip.netns.delete, namespace)"},{"line_number":62,"context_line":"        return tap_device, ip_cidr, mac, namespace"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_3875cccb","line":61,"updated":"2014-08-12 01:29:12.000000000","message":"I\u0027m showing my ignorance/laziness here, but does successful namespace deletion depend on having the devices within it removed first?","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"6dc5ec4412c1c9a9a94ea26703abeb824edbc5a4","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        tap_device.link.set_address(mac)"},{"line_number":59,"context_line":"        self.driver.init_l3(name, [ip_cidr], namespace\u003dnamespace)"},{"line_number":60,"context_line":"        tap_device.link.set_up()"},{"line_number":61,"context_line":"        self.addCleanup(ip.netns.delete, namespace)"},{"line_number":62,"context_line":"        return tap_device, ip_cidr, mac, namespace"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_5504dbc4","line":61,"in_reply_to":"baada198_3875cccb","updated":"2014-08-12 21:59:11.000000000","message":"That is a good question.  I think it may depend on the OS.  In my experience, it isn\u0027t really required.  However, the l3 agent code does take care to remove devices other than \"lo\" inside namespaces before deletion.  I believe there were reports of problems like this.","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"8023c1b24f91adccea14bb26d6d6bc8a873a4fcd","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        tap_device.link.set_address(mac)"},{"line_number":59,"context_line":"        self.driver.init_l3(name, [ip_cidr], namespace\u003dnamespace)"},{"line_number":60,"context_line":"        tap_device.link.set_up()"},{"line_number":61,"context_line":"        self.addCleanup(ip.netns.delete, namespace)"},{"line_number":62,"context_line":"        return tap_device, ip_cidr, mac, namespace"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_4ecb534b","line":61,"in_reply_to":"baada198_5504dbc4","updated":"2014-08-13 11:10:19.000000000","message":"I tested this manually on my F19 and F20 VMs before I posted the code. If it\u0027s OS dependent then I\u0027ll cleanup the device as well.","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"31aa48d3ed2ea9053095f7fddbdb9f9adeb814a5","unresolved":false,"context_lines":[{"line_number":65,"context_line":"class IpLibTestCase(IpLibTestFramework):"},{"line_number":66,"context_line":"    def test_device_exists(self):"},{"line_number":67,"context_line":"        device_name \u003d self.get_rand_name()"},{"line_number":68,"context_line":"        namespace \u003d self.get_rand_name()"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        self.assertFalse("},{"line_number":71,"context_line":"            ip_lib.device_exists(device_name, self.root_helper, namespace))"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_533341f6","line":68,"updated":"2014-08-12 01:29:12.000000000","message":"This is an example where the length default of get_rand_name() doesn\u0027t seem to make much sense.","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"31aa48d3ed2ea9053095f7fddbdb9f9adeb814a5","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def test_device_exists_with_ip_mac(self):"},{"line_number":85,"context_line":"        device, ip_cidr, mac_address, namespace \u003d self.manage_device()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        self.assertTrue("},{"line_number":88,"context_line":"            ip_lib.device_exists_with_ip_mac("},{"line_number":89,"context_line":"                device.name,"},{"line_number":90,"context_line":"                ip_cidr,"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_f3037509","line":87,"updated":"2014-08-12 01:29:12.000000000","message":"(Suggestion only) Consider adding a helper method that sets common parameters to overridable defaults.","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"8023c1b24f91adccea14bb26d6d6bc8a873a4fcd","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def test_device_exists_with_ip_mac(self):"},{"line_number":85,"context_line":"        device, ip_cidr, mac_address, namespace \u003d self.manage_device()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        self.assertTrue("},{"line_number":88,"context_line":"            ip_lib.device_exists_with_ip_mac("},{"line_number":89,"context_line":"                device.name,"},{"line_number":90,"context_line":"                ip_cidr,"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_a9b5c91a","line":87,"in_reply_to":"baada198_f3037509","updated":"2014-08-13 11:10:19.000000000","message":"I get what you mean, but I think how the code is organized now is a bit long/verbose, but dead simple. I\u0027d rather keep it that way without lengthening the call chain.","commit_id":"6b125a5ae3fed284e843e62c1bb9ac5d695609ec"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"b39ab4b3bad273fed926d09181907132157914d1","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                self.root_helper,"},{"line_number":125,"context_line":"                \u0027wrong_namespace\u0027))"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        device.link.delete()"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_89455b18","line":127,"updated":"2014-08-13 14:35:33.000000000","message":"this is already done by cleanUp. (L63)","commit_id":"2ae093d7b7903a3eda94cb844f5eb2299df97297"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"22ceef7dcca7736008d284e7088fd9e504616195","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                self.root_helper,"},{"line_number":125,"context_line":"                \u0027wrong_namespace\u0027))"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        device.link.delete()"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_0c2159a1","line":127,"in_reply_to":"baada198_89455b18","updated":"2014-08-13 14:50:31.000000000","message":"It\u0027s better to be explicit about this to spot failures more easily.","commit_id":"2ae093d7b7903a3eda94cb844f5eb2299df97297"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"995c5c9d9a83646d3d8320380fe83b19920b6233","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        except RuntimeError:"},{"line_number":51,"context_line":"            LOG.debug(\u0027Could not delete %s, was it already deleted?\u0027, device)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def manage_device(self, name\u003dNone, ip_cidr\u003dNone, mac\u003dNone, namespace\u003dNone):"},{"line_number":54,"context_line":"        name \u003d name or self.get_rand_name()"},{"line_number":55,"context_line":"        ip_cidr \u003d ip_cidr or \u0027240.0.0.1/24\u0027"},{"line_number":56,"context_line":"        mac \u003d mac or \u0027cc:dd:ee:ff:ab:cd\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_9abbd70f","line":53,"updated":"2014-08-13 15:37:30.000000000","message":"I\u0027d suggest to have all parameters mandatory (maybe name could have default) and return only tap_device. It\u0027s weird that 3 out of 4 parameters if given to method are returned without any change.","commit_id":"e3e0fd47d51f64da2f996a7ff4e1c9961c0022c9"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"2c2955456b969f4d8a0d4fe1cfe463c95e954130","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        except RuntimeError:"},{"line_number":51,"context_line":"            LOG.debug(\u0027Could not delete %s, was it already deleted?\u0027, device)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def manage_device(self, name\u003dNone, ip_cidr\u003dNone, mac\u003dNone, namespace\u003dNone):"},{"line_number":54,"context_line":"        name \u003d name or self.get_rand_name()"},{"line_number":55,"context_line":"        ip_cidr \u003d ip_cidr or \u0027240.0.0.1/24\u0027"},{"line_number":56,"context_line":"        mac \u003d mac or \u0027cc:dd:ee:ff:ab:cd\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"7ac7a964_49543154","line":53,"in_reply_to":"baada198_9abbd70f","updated":"2014-08-25 08:34:32.000000000","message":"You\u0027re right, it is. I\u0027ll change it around a bit.","commit_id":"e3e0fd47d51f64da2f996a7ff4e1c9961c0022c9"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"93f35db3c069bb21fba3e6b53349fc616eb38247","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self._configure()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _configure(self):"},{"line_number":39,"context_line":"        self.conf \u003d cfg.CONF"},{"line_number":40,"context_line":"        config.setup_logging(self.conf)"},{"line_number":41,"context_line":"        config.register_root_helper(self.conf)"},{"line_number":42,"context_line":"        self.conf.set_override(\u0027root_helper\u0027, self.root_helper, group\u003d\u0027AGENT\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_ef796cfd","line":39,"updated":"2014-08-14 23:19:14.000000000","message":"nit:  Why do this?  It appears to only be used locally to this method.  I\u0027m not sure it adds value, why not just use cfg.CONF inline?","commit_id":"65a3902a2da55e42a01c69bba143621b37865540"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"69f269486892b20ba2c3f56967eefa28c3a45754","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self._configure()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _configure(self):"},{"line_number":39,"context_line":"        self.conf \u003d cfg.CONF"},{"line_number":40,"context_line":"        config.setup_logging(self.conf)"},{"line_number":41,"context_line":"        config.register_root_helper(self.conf)"},{"line_number":42,"context_line":"        self.conf.set_override(\u0027root_helper\u0027, self.root_helper, group\u003d\u0027AGENT\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1abeadc6_15ffc7ab","line":39,"in_reply_to":"7ac7a964_ef796cfd","updated":"2014-08-25 08:34:42.000000000","message":"Done","commit_id":"65a3902a2da55e42a01c69bba143621b37865540"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"93f35db3c069bb21fba3e6b53349fc616eb38247","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        dev_attr \u003d self.generate_device_details()"},{"line_number":99,"context_line":"        device \u003d self.manage_device(dev_attr)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        self.assertTrue("},{"line_number":102,"context_line":"            ip_lib.device_exists_with_ip_mac("},{"line_number":103,"context_line":"                device.name,"},{"line_number":104,"context_line":"                dev_attr.ip_cidr,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_f2ff93ff","line":101,"updated":"2014-08-14 23:19:14.000000000","message":"I see the discussion on PS6.  I\u0027m okay with what you\u0027ve got here.  I think I might\u0027ve preferred a helper to set defaults in this case because it takes a minute to look through the code below and discover the pattern.  A bit of extra structure might make the pattern sort of self-documenting.","commit_id":"65a3902a2da55e42a01c69bba143621b37865540"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"69f269486892b20ba2c3f56967eefa28c3a45754","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        dev_attr \u003d self.generate_device_details()"},{"line_number":99,"context_line":"        device \u003d self.manage_device(dev_attr)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        self.assertTrue("},{"line_number":102,"context_line":"            ip_lib.device_exists_with_ip_mac("},{"line_number":103,"context_line":"                device.name,"},{"line_number":104,"context_line":"                dev_attr.ip_cidr,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1abeadc6_70780990","line":101,"in_reply_to":"7ac7a964_3e7394ea","updated":"2014-08-25 08:34:42.000000000","message":"Done","commit_id":"65a3902a2da55e42a01c69bba143621b37865540"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"086fd79a68ea9896bd451b90559c5961df94e09f","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        dev_attr \u003d self.generate_device_details()"},{"line_number":99,"context_line":"        device \u003d self.manage_device(dev_attr)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        self.assertTrue("},{"line_number":102,"context_line":"            ip_lib.device_exists_with_ip_mac("},{"line_number":103,"context_line":"                device.name,"},{"line_number":104,"context_line":"                dev_attr.ip_cidr,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_3e7394ea","line":101,"in_reply_to":"7ac7a964_f2ff93ff","updated":"2014-08-15 02:33:04.000000000","message":"+1","commit_id":"65a3902a2da55e42a01c69bba143621b37865540"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"69f269486892b20ba2c3f56967eefa28c3a45754","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        dev_attr \u003d self.generate_device_details()"},{"line_number":99,"context_line":"        device \u003d self.manage_device(dev_attr)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        self.assertTrue("},{"line_number":102,"context_line":"            ip_lib.device_exists_with_ip_mac("},{"line_number":103,"context_line":"                device.name,"},{"line_number":104,"context_line":"                dev_attr.ip_cidr,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1abeadc6_50730db4","line":101,"in_reply_to":"7ac7a964_f2ff93ff","updated":"2014-08-25 08:34:42.000000000","message":"Done","commit_id":"65a3902a2da55e42a01c69bba143621b37865540"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"93f35db3c069bb21fba3e6b53349fc616eb38247","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                dev_attr.namespace))"},{"line_number":122,"context_line":"        self.assertFalse("},{"line_number":123,"context_line":"            ip_lib.device_exists_with_ip_mac("},{"line_number":124,"context_line":"                device.name, dev_attr.ip_cidr,"},{"line_number":125,"context_line":"                \u0027aa:aa:aa:aa:aa:aa\u0027,"},{"line_number":126,"context_line":"                self.root_helper,"},{"line_number":127,"context_line":"                dev_attr.namespace))"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_4f18a081","line":124,"updated":"2014-08-14 23:19:14.000000000","message":"nit: newline here to separate these two options to follow the pattern of the rest of this code.","commit_id":"65a3902a2da55e42a01c69bba143621b37865540"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"69f269486892b20ba2c3f56967eefa28c3a45754","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                dev_attr.namespace))"},{"line_number":122,"context_line":"        self.assertFalse("},{"line_number":123,"context_line":"            ip_lib.device_exists_with_ip_mac("},{"line_number":124,"context_line":"                device.name, dev_attr.ip_cidr,"},{"line_number":125,"context_line":"                \u0027aa:aa:aa:aa:aa:aa\u0027,"},{"line_number":126,"context_line":"                self.root_helper,"},{"line_number":127,"context_line":"                dev_attr.namespace))"}],"source_content_type":"text/x-python","patch_set":10,"id":"1abeadc6_b5e5330c","line":124,"in_reply_to":"7ac7a964_4f18a081","updated":"2014-08-25 08:34:42.000000000","message":"Done","commit_id":"65a3902a2da55e42a01c69bba143621b37865540"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"4278ef94ee80fe9b679a76d2cfbc57cd9bf51af9","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            ip_lib.device_exists_with_ip_mac("},{"line_number":114,"context_line":"                *attr, root_helper\u003dself.root_helper))"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        attr \u003d self.generate_device_details(ip_cidr\u003d\u002710.0.0.1/8\u0027)"},{"line_number":117,"context_line":"        self.assertFalse("},{"line_number":118,"context_line":"            ip_lib.device_exists_with_ip_mac("},{"line_number":119,"context_line":"                *attr, root_helper\u003dself.root_helper))"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_c5711ce2","line":116,"updated":"2014-08-25 11:32:52.000000000","message":"(Suggestion only) In keeping with the detail generation on lines 111 and 126 (\u0027wrong_*\u0027), consider using a self-documenting named constant for the wrong ip address to further convey your intent, e.g.\n\n wrong_ip_cdir \u003d \u002710.0.0.1/18\u0027\n attr \u003d self.generate_device_details(ip_cidr\u003dwrong_ip_cidr)\n\nThe same advice could be applied to line 121.","commit_id":"19e9ac5f2c667537292c90ed6efa4a6d9c8c94da"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"cacab50af3fb20d2aade2372a12519b269513255","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            ip_lib.device_exists_with_ip_mac("},{"line_number":114,"context_line":"                *attr, root_helper\u003dself.root_helper))"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        attr \u003d self.generate_device_details(ip_cidr\u003d\u002710.0.0.1/8\u0027)"},{"line_number":117,"context_line":"        self.assertFalse("},{"line_number":118,"context_line":"            ip_lib.device_exists_with_ip_mac("},{"line_number":119,"context_line":"                *attr, root_helper\u003dself.root_helper))"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_f3adf1eb","line":116,"in_reply_to":"1abeadc6_c5711ce2","updated":"2014-08-25 17:17:13.000000000","message":"Done","commit_id":"19e9ac5f2c667537292c90ed6efa4a6d9c8c94da"}]}
