)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":8,"context_line":"VPNaaS DataModel/Plugin"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"This is work in progress towards the first"},{"line_number":11,"context_line":"iteration."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"It is meant to provide the basic"},{"line_number":14,"context_line":"API and DataModel for the VPN Advanced"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"AAAAPn%2F%2Ff%2BM%3D","line":11,"updated":"2013-06-29 05:55:16.000000000","message":"Probably not work in progress any more?","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":15,"context_line":"Service Plugin"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"NOTE: For now the unit tests are not included."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"The basic idea for providing these API\u0027s"},{"line_number":20,"context_line":"and DataModel is to get it reviewed and also"},{"line_number":21,"context_line":"for the team members to work on other parts"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"AAAAPn%2F%2Ff%2BI%3D","line":18,"updated":"2013-06-29 05:55:16.000000000","message":"Seems like they are now.","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2013-07-03 12:23:40 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"blueprint VPNaaS-Python-API"},{"line_number":8,"context_line":"VPNaaS DataModel/Plugin"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"It provides the basic"},{"line_number":11,"context_line":"API and DataModel for the VPN Advanced"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"AAAAPn%2F%2FTII%3D","line":8,"updated":"2013-07-04 15:46:46.000000000","message":"Please follow common commit message convention: blank line after the first summary line","commit_id":"c8b53c5962d49bf108b81d1e54f1ad9c1742a585"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"601f787b7dbe783dc43451c0fb2145cbcca85b44","unresolved":false,"context_lines":[{"line_number":25,"context_line":"Removed port-id from vpnservice"},{"line_number":26,"context_line":"Fixed bugs based on initial review"},{"line_number":27,"context_line":"Fixed pep8 warnings on test_vpnaas_plugin.py file"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: I059d4db05118a4eecd388b8e8db0d714a8f9cb8f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"AAAAP3%2F%2F1Hk%3D","line":28,"updated":"2013-07-10 20:32:40.000000000","message":"These history ins\u0027t needed here :) (I mean L14-L28)","commit_id":"8b885a3e7486803964f1bad62acc5f58154486d4"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":12,"context_line":"DataModel for the \"VPN As A"},{"line_number":13,"context_line":"Service\" feature that includes:"},{"line_number":14,"context_line":"* VPNService"},{"line_number":15,"context_line":"* VPNConnection"},{"line_number":16,"context_line":"* IKEPolicy"},{"line_number":17,"context_line":"* IPsecPolicy"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":44,"id":"AAAAQn%2F%2Fw0A%3D","line":15,"updated":"2013-07-23 17:37:24.000000000","message":"IPSecSiteConnection","commit_id":"7df2f86598fcf1a68a6b833393025858de38b7b5"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":12,"context_line":"DataModel for the \"VPN As A"},{"line_number":13,"context_line":"Service\" feature that includes:"},{"line_number":14,"context_line":"* VPNService"},{"line_number":15,"context_line":"* VPNConnection"},{"line_number":16,"context_line":"* IKEPolicy"},{"line_number":17,"context_line":"* IPsecPolicy"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":44,"id":"AAAAQn%2F%2Fv%2BQ%3D","line":15,"in_reply_to":"AAAAQn%2F%2Fw0A%3D","updated":"2013-07-23 22:26:47.000000000","message":"Done","commit_id":"7df2f86598fcf1a68a6b833393025858de38b7b5"}],"neutron/api/v2/attributes.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":300,"context_line":"    if len(set(data)) !\u003d len(data):"},{"line_number":301,"context_line":"        msg \u003d _(\"Duplicate items in the list: \u0027%s\u0027\") % \u0027, \u0027.join(data)"},{"line_number":302,"context_line":"        LOG.debug(msg)"},{"line_number":303,"context_line":"        return msg"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2Fugs%3D","line":303,"updated":"2013-07-12 11:24:37.000000000","message":"perhaps do this check before iterating over data.\nDo you also need to verify the cidrs in the list do not overlap among each other?","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":300,"context_line":"    if len(set(data)) !\u003d len(data):"},{"line_number":301,"context_line":"        msg \u003d _(\"Duplicate items in the list: \u0027%s\u0027\") % \u0027, \u0027.join(data)"},{"line_number":302,"context_line":"        LOG.debug(msg)"},{"line_number":303,"context_line":"        return msg"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnUA%3D","line":303,"in_reply_to":"AAAAP3%2F%2Fugs%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        return _validate_uuid(data)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"def _validate_cidr_list(data, valid_values\u003dNone):"},{"line_number":289,"context_line":"    if not isinstance(data, list):"},{"line_number":290,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"},{"line_number":291,"context_line":"        LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqrc%3D","line":288,"updated":"2013-07-14 21:56:10.000000000","message":"* _validate_subnet_list looks better to me since it calls validate_subnet internally. The similar methods names are better if the logics are similar.\n\n* And it is better to move it to after validate_subnet or to after validate_uuid_list. At least the current place is not appropriate since it is between validate_uuid and validate_uuid_list.\n\n* Could you add unit tests for this method to test_attributes.py?","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        return _validate_uuid(data)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"def _validate_cidr_list(data, valid_values\u003dNone):"},{"line_number":289,"context_line":"    if not isinstance(data, list):"},{"line_number":290,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"},{"line_number":291,"context_line":"        LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fnmk%3D","line":288,"in_reply_to":"AAAAP3%2F%2Fqrc%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"51ad882290a4884dac86d1b4463bb0cfc302bb1a","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        if (cidr !\u003d data):"},{"line_number":252,"context_line":"            msg \u003d _(\"\u0027%(data)s\u0027 isn\u0027t a recognized IP subnet cidr,\""},{"line_number":253,"context_line":"                    \" \u0027%(cidr)s\u0027 is recommended\") % {\"data\": data,"},{"line_number":254,"context_line":"                                                     \"cidr\": cidr}"},{"line_number":255,"context_line":"        else:"},{"line_number":256,"context_line":"            return"},{"line_number":257,"context_line":"    except Exception:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAP3%2F%2FolE%3D","line":254,"updated":"2013-07-15 17:53:38.000000000","message":"Not really needed. could just flow through.","commit_id":"b76ba0455f3d9553daf93614a20e3f44af4878a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        if (cidr !\u003d data):"},{"line_number":252,"context_line":"            msg \u003d _(\"\u0027%(data)s\u0027 isn\u0027t a recognized IP subnet cidr,\""},{"line_number":253,"context_line":"                    \" \u0027%(cidr)s\u0027 is recommended\") % {\"data\": data,"},{"line_number":254,"context_line":"                                                     \"cidr\": cidr}"},{"line_number":255,"context_line":"        else:"},{"line_number":256,"context_line":"            return"},{"line_number":257,"context_line":"    except Exception:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAP3%2F%2Fnk8%3D","line":254,"in_reply_to":"AAAAP3%2F%2FolE%3D","updated":"2013-07-15 19:36:14.000000000","message":"I agree. but outside scope of this patch","commit_id":"b76ba0455f3d9553daf93614a20e3f44af4878a3"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"51ad882290a4884dac86d1b4463bb0cfc302bb1a","unresolved":false,"context_lines":[{"line_number":294,"context_line":"    for item in data:"},{"line_number":295,"context_line":"        msg \u003d _validate_subnet(item)"},{"line_number":296,"context_line":"        if msg:"},{"line_number":297,"context_line":"            LOG.debug(msg)"},{"line_number":298,"context_line":"            return msg"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    if len(set(data)) !\u003d len(data):"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAP3%2F%2Fokg%3D","line":297,"updated":"2013-07-15 17:53:38.000000000","message":"Remove - already logged in _validate_subnet()","commit_id":"b76ba0455f3d9553daf93614a20e3f44af4878a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":294,"context_line":"    for item in data:"},{"line_number":295,"context_line":"        msg \u003d _validate_subnet(item)"},{"line_number":296,"context_line":"        if msg:"},{"line_number":297,"context_line":"            LOG.debug(msg)"},{"line_number":298,"context_line":"            return msg"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    if len(set(data)) !\u003d len(data):"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAP3%2F%2Fnks%3D","line":297,"in_reply_to":"AAAAP3%2F%2Fokg%3D","updated":"2013-07-15 19:36:14.000000000","message":"Done","commit_id":"b76ba0455f3d9553daf93614a20e3f44af4878a3"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"cc8f68f51bbb02e9b59b0a786521e947a61b633a","unresolved":false,"context_lines":[{"line_number":299,"context_line":"    for item in data:"},{"line_number":300,"context_line":"        msg \u003d _validate_subnet(item)"},{"line_number":301,"context_line":"        if msg:"},{"line_number":302,"context_line":"            return msg"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAP3%2F%2FmY8%3D","line":302,"updated":"2013-07-16 01:05:11.000000000","message":"This is probably just code copied over from somewhere else, but what\u0027s the point of the if statement?","commit_id":"b6f85d856486fa4d6d4043a0db66c52e638d6d4f"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":299,"context_line":"    for item in data:"},{"line_number":300,"context_line":"        msg \u003d _validate_subnet(item)"},{"line_number":301,"context_line":"        if msg:"},{"line_number":302,"context_line":"            return msg"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAQn%2F%2F74I%3D","line":302,"in_reply_to":"AAAAP3%2F%2Fji0%3D","updated":"2013-07-18 20:51:18.000000000","message":"ok, never mind them.\nI did not look at the code with enough attention","commit_id":"b6f85d856486fa4d6d4043a0db66c52e638d6d4f"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":299,"context_line":"    for item in data:"},{"line_number":300,"context_line":"        msg \u003d _validate_subnet(item)"},{"line_number":301,"context_line":"        if msg:"},{"line_number":302,"context_line":"            return msg"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAP3%2F%2Fji0%3D","line":302,"in_reply_to":"AAAAP3%2F%2FjvY%3D","updated":"2013-07-16 16:20:57.000000000","message":"because it is in the for loop.\n# I\u0027m not sure I understand your point though..","commit_id":"b6f85d856486fa4d6d4043a0db66c52e638d6d4f"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"4d297c81729a71342faf6d5d82a80f073541e951","unresolved":false,"context_lines":[{"line_number":299,"context_line":"    for item in data:"},{"line_number":300,"context_line":"        msg \u003d _validate_subnet(item)"},{"line_number":301,"context_line":"        if msg:"},{"line_number":302,"context_line":"            return msg"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAP3%2F%2FjvY%3D","line":302,"in_reply_to":"AAAAP3%2F%2FmUw%3D","updated":"2013-07-16 15:48:01.000000000","message":"I know that - I am saying why the if statement too and not just \u0027return msg\u0027?","commit_id":"b6f85d856486fa4d6d4043a0db66c52e638d6d4f"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"b6b4381a13b5892ccecbbf89248cbec7acc6e653","unresolved":false,"context_lines":[{"line_number":299,"context_line":"    for item in data:"},{"line_number":300,"context_line":"        msg \u003d _validate_subnet(item)"},{"line_number":301,"context_line":"        if msg:"},{"line_number":302,"context_line":"            return msg"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAP3%2F%2FmUw%3D","line":302,"in_reply_to":"AAAAP3%2F%2FmY8%3D","updated":"2013-07-16 01:23:55.000000000","message":"IMO, this function returns value when it have error.\nso we should return error message in case of error","commit_id":"b6f85d856486fa4d6d4043a0db66c52e638d6d4f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":285,"context_line":"        return _validate_uuid(data)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"def _validate_subnet_list(data, valid_values\u003dNone):"},{"line_number":289,"context_line":"    if not isinstance(data, list):"},{"line_number":290,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"},{"line_number":291,"context_line":"        LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAP3%2F%2Fk1Y%3D","line":288,"updated":"2013-07-16 12:22:37.000000000","message":"Nit: This function should go up to line 262 to be together with the other *_subnet_* function(s).","commit_id":"c3760d4383b697d4093cdab6e962b57735a3deea"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":285,"context_line":"        return _validate_uuid(data)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"def _validate_subnet_list(data, valid_values\u003dNone):"},{"line_number":289,"context_line":"    if not isinstance(data, list):"},{"line_number":290,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"},{"line_number":291,"context_line":"        LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAP3%2F%2FjjY%3D","line":288,"in_reply_to":"AAAAP3%2F%2Fk1Y%3D","updated":"2013-07-16 16:18:27.000000000","message":"gotcha I\u0027ll fix this","commit_id":"c3760d4383b697d4093cdab6e962b57735a3deea"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":291,"context_line":"        LOG.debug(msg)"},{"line_number":292,"context_line":"        return msg"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    if len(set(data)) !\u003d len(data):"},{"line_number":295,"context_line":"        msg \u003d _(\"Duplicate items in the list: \u0027%s\u0027\") % \u0027, \u0027.join(data)"},{"line_number":296,"context_line":"        LOG.debug(msg)"},{"line_number":297,"context_line":"        return msg"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAP3%2F%2Fkzc%3D","line":294,"updated":"2013-07-16 12:22:37.000000000","message":"Nit: I think it would be nicer to validate the items before complaining about duplicate items, similar to the way _validate_uuid_list() does.","commit_id":"c3760d4383b697d4093cdab6e962b57735a3deea"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":291,"context_line":"        LOG.debug(msg)"},{"line_number":292,"context_line":"        return msg"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    if len(set(data)) !\u003d len(data):"},{"line_number":295,"context_line":"        msg \u003d _(\"Duplicate items in the list: \u0027%s\u0027\") % \u0027, \u0027.join(data)"},{"line_number":296,"context_line":"        LOG.debug(msg)"},{"line_number":297,"context_line":"        return msg"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAP3%2F%2Fjjc%3D","line":294,"in_reply_to":"AAAAP3%2F%2FjuQ%3D","updated":"2013-07-16 16:18:27.000000000","message":"This is fixed in patchset 39.. but Swami overwrites it..\nI\u0027ll talk with him.","commit_id":"c3760d4383b697d4093cdab6e962b57735a3deea"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"4d297c81729a71342faf6d5d82a80f073541e951","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        LOG.debug(msg)"},{"line_number":292,"context_line":"        return msg"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    if len(set(data)) !\u003d len(data):"},{"line_number":295,"context_line":"        msg \u003d _(\"Duplicate items in the list: \u0027%s\u0027\") % \u0027, \u0027.join(data)"},{"line_number":296,"context_line":"        LOG.debug(msg)"},{"line_number":297,"context_line":"        return msg"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAP3%2F%2FjuQ%3D","line":294,"in_reply_to":"AAAAP3%2F%2Fkzc%3D","updated":"2013-07-16 15:49:24.000000000","message":"I think I asked to invert the order and moving this up in order to perform computationally lighter checks before.\n\nBut I have not strong opinion, so I won\u0027t mind if it\u0027s done as Henry suggests.","commit_id":"c3760d4383b697d4093cdab6e962b57735a3deea"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        return _validate_uuid(data)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"def _validate_subnet_list(data, valid_values\u003dNone):"},{"line_number":289,"context_line":"    if not isinstance(data, list):"},{"line_number":290,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"},{"line_number":291,"context_line":"        LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrUU%3D","line":288,"updated":"2013-07-25 10:36:35.000000000","message":"Move it after subnet_list. At least the current place is not good since it is located between _validate_uuid* validators.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":285,"context_line":"        return _validate_uuid(data)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"def _validate_subnet_list(data, valid_values\u003dNone):"},{"line_number":289,"context_line":"    if not isinstance(data, list):"},{"line_number":290,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"},{"line_number":291,"context_line":"        LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fpu0%3D","line":288,"in_reply_to":"AAAAQn%2F%2FrUU%3D","updated":"2013-07-25 19:53:37.000000000","message":"I moved this in previous patch set, but my some reason, it looks came back here.. I\u0027ll fix again","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":475,"context_line":"MAC_PATTERN \u003d \"^%s[aceACE02468](:%s{2}){5}$\" % (HEX_ELEM, HEX_ELEM)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"# Dictionary that maintains a list of validation functions"},{"line_number":478,"context_line":"validators \u003d {\u0027type:subnet_list\u0027: _validate_subnet_list,"},{"line_number":479,"context_line":"              \u0027type:dict\u0027: _validate_dict,"},{"line_number":480,"context_line":"              \u0027type:dict_or_none\u0027: _validate_dict_or_none,"},{"line_number":481,"context_line":"              \u0027type:dict_or_empty\u0027: _validate_dict_or_empty,"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrUc%3D","line":478,"updated":"2013-07-25 10:36:35.000000000","message":"Move it after type:subnet","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":475,"context_line":"MAC_PATTERN \u003d \"^%s[aceACE02468](:%s{2}){5}$\" % (HEX_ELEM, HEX_ELEM)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"# Dictionary that maintains a list of validation functions"},{"line_number":478,"context_line":"validators \u003d {\u0027type:subnet_list\u0027: _validate_subnet_list,"},{"line_number":479,"context_line":"              \u0027type:dict\u0027: _validate_dict,"},{"line_number":480,"context_line":"              \u0027type:dict_or_none\u0027: _validate_dict_or_none,"},{"line_number":481,"context_line":"              \u0027type:dict_or_empty\u0027: _validate_dict_or_empty,"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fpuw%3D","line":478,"in_reply_to":"AAAAQn%2F%2FrUc%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"}],"neutron/db/migration/alembic_migrations/versions/52ff27f7567a_support_for_vpnaas.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"dec86e84bf08fad2b2a63fa34e48d567797859ba","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027)"},{"line_number":75,"context_line":"    )"},{"line_number":76,"context_line":"    op.create_table("},{"line_number":77,"context_line":"        \u0027quotas\u0027,"},{"line_number":78,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":79,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":80,"context_line":"        sa.Column(\u0027resource\u0027, sa.String(length\u003d255), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAP3%2F%2Fmmo%3D","line":77,"updated":"2013-07-15 23:14:49.000000000","message":"Just curious, what is this table for? Didn\u0027t recall seeing it previously (though I\u0027ve been on vacation for 1.5 weeks :)","commit_id":"d62e3e2e7991ba41a2a0ebad3bcb561aa6d1c7c8"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"a8c0206aba52cf21af8ea11a417e4f7d17c68638","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027)"},{"line_number":75,"context_line":"    )"},{"line_number":76,"context_line":"    op.create_table("},{"line_number":77,"context_line":"        \u0027quotas\u0027,"},{"line_number":78,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":79,"context_line":"        sa.Column(\u0027tenant_id\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":80,"context_line":"        sa.Column(\u0027resource\u0027, sa.String(length\u003d255), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAP3%2F%2Fmho%3D","line":77,"in_reply_to":"AAAAP3%2F%2Fmmo%3D","updated":"2013-07-15 23:40:44.000000000","message":"I\u0027m not sure why this is added...\nRemoved","commit_id":"d62e3e2e7991ba41a2a0ebad3bcb561aa6d1c7c8"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"cc8f68f51bbb02e9b59b0a786521e947a61b633a","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        sa.Column(\u0027vpnconnection_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":167,"context_line":"        sa.ForeignKeyConstraint("},{"line_number":168,"context_line":"            [\u0027vpnconnection_id\u0027], [\u0027vpnconnections.id\u0027], ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":169,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027, \u0027cidr\u0027, \u0027vpnconnection_id\u0027)"},{"line_number":170,"context_line":"    )"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAP3%2F%2FmZU%3D","line":169,"updated":"2013-07-16 01:05:11.000000000","message":"id is enough as a primary constraint, I guess","commit_id":"b6f85d856486fa4d6d4043a0db66c52e638d6d4f"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"b6b4381a13b5892ccecbbf89248cbec7acc6e653","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        sa.Column(\u0027vpnconnection_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":167,"context_line":"        sa.ForeignKeyConstraint("},{"line_number":168,"context_line":"            [\u0027vpnconnection_id\u0027], [\u0027vpnconnections.id\u0027], ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":169,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027, \u0027cidr\u0027, \u0027vpnconnection_id\u0027)"},{"line_number":170,"context_line":"    )"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAP3%2F%2FmR8%3D","line":169,"in_reply_to":"AAAAP3%2F%2FmZU%3D","updated":"2013-07-16 01:23:55.000000000","message":"It looks like this table don\u0027t need id.\nI\u0027ll remove it in next patch","commit_id":"b6f85d856486fa4d6d4043a0db66c52e638d6d4f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":166,"context_line":"        sa.Column(\u0027vpnconnection_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":167,"context_line":"        sa.ForeignKeyConstraint("},{"line_number":168,"context_line":"            [\u0027vpnconnection_id\u0027], [\u0027vpnconnections.id\u0027], ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":169,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027, \u0027cidr\u0027, \u0027vpnconnection_id\u0027)"},{"line_number":170,"context_line":"    )"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAP3%2F%2Fkwo%3D","line":169,"updated":"2013-07-16 12:22:37.000000000","message":"What Salvatore meant is you don\u0027t need \u0027cidr\u0027 and \u0027vpnconnection_id\u0027 to be part of the primary key, just \u0027id\u0027 is sufficient.","commit_id":"c3760d4383b697d4093cdab6e962b57735a3deea"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"b6b4381a13b5892ccecbbf89248cbec7acc6e653","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        sa.Column(\u0027vpnconnection_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":167,"context_line":"        sa.ForeignKeyConstraint("},{"line_number":168,"context_line":"            [\u0027vpnconnection_id\u0027], [\u0027vpnconnections.id\u0027], ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":169,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027, \u0027cidr\u0027, \u0027vpnconnection_id\u0027)"},{"line_number":170,"context_line":"    )"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAP3%2F%2FkeE%3D","line":169,"in_reply_to":"AAAAP3%2F%2Fkwo%3D","updated":"2013-07-16 13:29:33.000000000","message":"I fixed this on patchset 39. (I\u0027m not sure why, but Swami overwrites the change...) Basically, the id is not needed, so I updated the DB code also","commit_id":"c3760d4383b697d4093cdab6e962b57735a3deea"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":178,"context_line":"    op.drop_table(\u0027vpnconnections\u0027)"},{"line_number":179,"context_line":"    op.drop_table(\u0027vpnservices\u0027)"},{"line_number":180,"context_line":"    op.drop_table(\u0027ipsecpolicies\u0027)"},{"line_number":181,"context_line":"    op.drop_table(\u0027ikepolicies\u0027)"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAP3%2F%2Fku4%3D","line":181,"updated":"2013-07-16 12:22:37.000000000","message":"You know what would look really nice, especially when you\u0027re troubleshooting and have to go digging around in the database, is to have all the table names begin with \u0027vpnaas_*\u0027. For this changeset It should be as simple as renaming them in this file and using __tablename__ in each model class. (Other reviewers feel free to shoot it down if this is a bad idea.)","commit_id":"c3760d4383b697d4093cdab6e962b57735a3deea"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"b6b4381a13b5892ccecbbf89248cbec7acc6e653","unresolved":false,"context_lines":[{"line_number":178,"context_line":"    op.drop_table(\u0027vpnconnections\u0027)"},{"line_number":179,"context_line":"    op.drop_table(\u0027vpnservices\u0027)"},{"line_number":180,"context_line":"    op.drop_table(\u0027ipsecpolicies\u0027)"},{"line_number":181,"context_line":"    op.drop_table(\u0027ikepolicies\u0027)"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAP3%2F%2FkdE%3D","line":181,"in_reply_to":"AAAAP3%2F%2Fku4%3D","updated":"2013-07-16 13:29:33.000000000","message":"Sounds nice. However lbaas is not following the naming rule. FW is also, so we should agree the table naming at first for consistency.","commit_id":"c3760d4383b697d4093cdab6e962b57735a3deea"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":30,"context_line":"# Change to [\u0027*\u0027] if this migration applies to all plugins"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"migration_for_plugins \u003d ["},{"line_number":33,"context_line":"    \u0027neutron.plugins.openvswitch.ovs_neutron_plugin.OVSNeutronPluginV2\u0027"},{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"from alembic import op"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAP3%2F%2FgCw%3D","line":33,"updated":"2013-07-17 10:14:51.000000000","message":"\u0027*\u0027 should be used. In other service plugins such as loadbalancer and firewall, \u0027*\u0027 (all core plugins) is specified.This patch implements DB layer and it is independent from core plugins, so there is no reason to limit the migration to OVS plugin.","commit_id":"e66acc8297ec37321941cac38d13391c200af26e"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":30,"context_line":"# Change to [\u0027*\u0027] if this migration applies to all plugins"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"migration_for_plugins \u003d ["},{"line_number":33,"context_line":"    \u0027neutron.plugins.openvswitch.ovs_neutron_plugin.OVSNeutronPluginV2\u0027"},{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"from alembic import op"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAP3%2F%2FfR0%3D","line":33,"in_reply_to":"AAAAP3%2F%2FgCw%3D","updated":"2013-07-17 14:26:41.000000000","message":"Done","commit_id":"e66acc8297ec37321941cac38d13391c200af26e"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# revision identifiers, used by Alembic."},{"line_number":27,"context_line":"revision \u003d \u002752ff27f7567a\u0027"},{"line_number":28,"context_line":"down_revision \u003d \u002713de305df56e\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"from alembic import op"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAQn%2F%2F3ZA%3D","line":28,"updated":"2013-07-20 19:39:18.000000000","message":"This down_revision is old. I think the newest is 2032abe8edac.","commit_id":"1f378d3455761fe0a1688e06c6d64bf38253aa33"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"from alembic import op"},{"line_number":32,"context_line":"import sqlalchemy as sa"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def upgrade(active_plugin\u003dNone, options\u003dNone):"},{"line_number":36,"context_line":"    op.create_table("}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAQn%2F%2F3ZU%3D","line":33,"updated":"2013-07-20 19:39:18.000000000","message":"I think there should be a line like this here:\n\n   migration_for_plugins \u003d [\u0027*\u0027]","commit_id":"1f378d3455761fe0a1688e06c6d64bf38253aa33"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"from alembic import op"},{"line_number":32,"context_line":"import sqlalchemy as sa"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def upgrade(active_plugin\u003dNone, options\u003dNone):"},{"line_number":36,"context_line":"    op.create_table("}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAQn%2F%2F3K8%3D","line":33,"in_reply_to":"AAAAQn%2F%2F3ZU%3D","updated":"2013-07-21 09:59:46.000000000","message":"This migration script does not have the following logic to check core plugins, so migration_for_plugins actually has no meaning, but it is better to have this logic for the consistency.\n\n    if not migration.should_run(active_plugin, migration_for_plugins):\n        return","commit_id":"1f378d3455761fe0a1688e06c6d64bf38253aa33"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":177,"context_line":"        return"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    op.drop_table(\u0027ipsecpeercidrs\u0027)"},{"line_number":180,"context_line":"    op.drop_table(\u0027vpnconnections\u0027)"},{"line_number":181,"context_line":"    op.drop_table(\u0027vpnservices\u0027)"},{"line_number":182,"context_line":"    op.drop_table(\u0027ipsecpolicies\u0027)"},{"line_number":183,"context_line":"    op.drop_table(\u0027ikepolicies\u0027)"}],"source_content_type":"text/x-python","patch_set":44,"id":"AAAAQn%2F%2Fwu8%3D","line":180,"updated":"2013-07-23 17:50:43.000000000","message":"ipsecsiteconnections","commit_id":"7df2f86598fcf1a68a6b833393025858de38b7b5"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":177,"context_line":"        return"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    op.drop_table(\u0027ipsecpeercidrs\u0027)"},{"line_number":180,"context_line":"    op.drop_table(\u0027vpnconnections\u0027)"},{"line_number":181,"context_line":"    op.drop_table(\u0027vpnservices\u0027)"},{"line_number":182,"context_line":"    op.drop_table(\u0027ipsecpolicies\u0027)"},{"line_number":183,"context_line":"    op.drop_table(\u0027ikepolicies\u0027)"}],"source_content_type":"text/x-python","patch_set":44,"id":"AAAAQn%2F%2Fv%2BE%3D","line":180,"in_reply_to":"AAAAQn%2F%2Fwu8%3D","updated":"2013-07-23 22:26:47.000000000","message":"Done","commit_id":"7df2f86598fcf1a68a6b833393025858de38b7b5"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"\"\"Support for VPNaaS"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Revision ID: 52ff27f7567a"},{"line_number":21,"context_line":"Revises: 13de305df56e"},{"line_number":22,"context_line":"Create Date: 2013-07-14 23:04:13.395955"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAQn%2F%2FmJE%3D","line":21,"updated":"2013-07-26 21:42:32.000000000","message":"The current head revision is probably e6b16a30d97\n\nSurely not this one.","commit_id":"f4128e0a6d709796d775ec3a5aabc50c7716fee6"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"\"\"Support for VPNaaS"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Revision ID: 52ff27f7567a"},{"line_number":21,"context_line":"Revises: 13de305df56e"},{"line_number":22,"context_line":"Create Date: 2013-07-14 23:04:13.395955"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAQn%2F%2FmBc%3D","line":21,"in_reply_to":"AAAAQn%2F%2FmJE%3D","updated":"2013-07-26 22:08:00.000000000","message":"Done","commit_id":"f4128e0a6d709796d775ec3a5aabc50c7716fee6"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# revision identifiers, used by Alembic."},{"line_number":27,"context_line":"revision \u003d \u002752ff27f7567a\u0027"},{"line_number":28,"context_line":"down_revision \u003d \u002752c5e4a18807\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"# Change to [\u0027*\u0027] if this migration applies to all plugins"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAQn%2F%2FmJA%3D","line":28,"updated":"2013-07-26 21:42:32.000000000","message":"and when you update here please remember to update line 21 as well.","commit_id":"f4128e0a6d709796d775ec3a5aabc50c7716fee6"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# revision identifiers, used by Alembic."},{"line_number":27,"context_line":"revision \u003d \u002752ff27f7567a\u0027"},{"line_number":28,"context_line":"down_revision \u003d \u002752c5e4a18807\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"# Change to [\u0027*\u0027] if this migration applies to all plugins"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAQn%2F%2FmBY%3D","line":28,"in_reply_to":"AAAAQn%2F%2FmJA%3D","updated":"2013-07-26 22:08:00.000000000","message":"Done","commit_id":"f4128e0a6d709796d775ec3a5aabc50c7716fee6"}],"neutron/db/vpn/vpn_db.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from neutron.plugins.common import constants"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class IPsecPeerCidr(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":36,"context_line":"    \"\"\"Internal representation of a IPsec Peer Cidrs.\"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    cidr \u003d sa.Column(sa.String(32), nullable\u003dFalse, primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2Fuec%3D","line":35,"updated":"2013-07-12 11:24:37.000000000","message":"As this model is not mapped to an API resource, perhaps tenant_id is not needed.","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from neutron.plugins.common import constants"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class IPsecPeerCidr(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":36,"context_line":"    \"\"\"Internal representation of a IPsec Peer Cidrs.\"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    cidr \u003d sa.Column(sa.String(32), nullable\u003dFalse, primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnT0%3D","line":35,"in_reply_to":"AAAAP3%2F%2Fuec%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    vpnservice_id \u003d sa.Column(sa.String(36),"},{"line_number":117,"context_line":"                              sa.ForeignKey(\u0027vpnservices.id\u0027,"},{"line_number":118,"context_line":"                                            ondelete\u003d\"CASCADE\"),"},{"line_number":119,"context_line":"                              nullable\u003dFalse)"},{"line_number":120,"context_line":"    ipsecpolicy_id \u003d sa.Column(sa.String(36),"},{"line_number":121,"context_line":"                               sa.ForeignKey(\u0027ipsecpolicies.id\u0027,"},{"line_number":122,"context_line":"                                             ondelete\u003d\"CASCADE\"),"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FueA%3D","line":119,"updated":"2013-07-12 11:24:37.000000000","message":"Not sure about the cascade relationship.\nIs it ok to remove a VPN service when it has still connections?","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    vpnservice_id \u003d sa.Column(sa.String(36),"},{"line_number":117,"context_line":"                              sa.ForeignKey(\u0027vpnservices.id\u0027,"},{"line_number":118,"context_line":"                                            ondelete\u003d\"CASCADE\"),"},{"line_number":119,"context_line":"                              nullable\u003dFalse)"},{"line_number":120,"context_line":"    ipsecpolicy_id \u003d sa.Column(sa.String(36),"},{"line_number":121,"context_line":"                               sa.ForeignKey(\u0027ipsecpolicies.id\u0027,"},{"line_number":122,"context_line":"                                             ondelete\u003d\"CASCADE\"),"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnTs%3D","line":119,"in_reply_to":"AAAAP3%2F%2FueA%3D","updated":"2013-07-15 20:52:19.000000000","message":"It should not be deleted. I removed the relation","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    ikepolicy \u003d orm.relationship(IKEPolicy, backref\u003d\u0027vpnconnection\u0027)"},{"line_number":130,"context_line":"    peer_cidrs \u003d orm.relationship(IPsecPeerCidr,"},{"line_number":131,"context_line":"                                  backref\u003d\u0027vpnconnection\u0027,"},{"line_number":132,"context_line":"                                  cascade\u003d\u0027all, delete, delete-orphan\u0027)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"class VPNService(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FudU%3D","line":132,"updated":"2013-07-12 11:24:37.000000000","message":"I would consider lazy\u003d\u0027joined\u0027 for this relationship.\nOtherwise every query on Vpn connection would trigger another query here.","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    ikepolicy \u003d orm.relationship(IKEPolicy, backref\u003d\u0027vpnconnection\u0027)"},{"line_number":130,"context_line":"    peer_cidrs \u003d orm.relationship(IPsecPeerCidr,"},{"line_number":131,"context_line":"                                  backref\u003d\u0027vpnconnection\u0027,"},{"line_number":132,"context_line":"                                  cascade\u003d\u0027all, delete, delete-orphan\u0027)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"class VPNService(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnTg%3D","line":132,"in_reply_to":"AAAAP3%2F%2FudU%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            elif issubclass(model, VPNService):"},{"line_number":174,"context_line":"                raise vpnaas.VPNServiceNotFound(vpnservice_id\u003dv_id)"},{"line_number":175,"context_line":"            else:"},{"line_number":176,"context_line":"                raise"},{"line_number":177,"context_line":"        return r"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def _get_peer_cidr_by_vpnconnection(self, context, vpn_conn_id):"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2Fudg%3D","line":176,"updated":"2013-07-12 11:24:37.000000000","message":"minor nit.\nInstead of this cascaded if one might create a dict mapping class with its NotFound exception and use that dict.","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            elif issubclass(model, VPNService):"},{"line_number":174,"context_line":"                raise vpnaas.VPNServiceNotFound(vpnservice_id\u003dv_id)"},{"line_number":175,"context_line":"            else:"},{"line_number":176,"context_line":"                raise"},{"line_number":177,"context_line":"        return r"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def _get_peer_cidr_by_vpnconnection(self, context, vpn_conn_id):"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnSY%3D","line":176,"in_reply_to":"AAAAP3%2F%2Fudg%3D","updated":"2013-07-15 20:52:19.000000000","message":"IMO, this is simple way, because each exception takes different arguments","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                                   VPNService,"},{"line_number":223,"context_line":"                                   vpnc[\u0027vpnservice_id\u0027])"},{"line_number":224,"context_line":"            except exc.NoResultFound:"},{"line_number":225,"context_line":"                raise vpnaas.VPNServiceNotFound(comm_id\u003dvpnc[\u0027vpnservice_id\u0027])"},{"line_number":226,"context_line":"            try:"},{"line_number":227,"context_line":"                self._get_resource(context,"},{"line_number":228,"context_line":"                                   IKEPolicy,"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FudQ%3D","line":225,"updated":"2013-07-12 11:24:37.000000000","message":"why not go ahead and handle the fk violation tghat would be reaised by the vpn connection create statement.\n\nSame comment regarding the other two resources below.","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                                   VPNService,"},{"line_number":223,"context_line":"                                   vpnc[\u0027vpnservice_id\u0027])"},{"line_number":224,"context_line":"            except exc.NoResultFound:"},{"line_number":225,"context_line":"                raise vpnaas.VPNServiceNotFound(comm_id\u003dvpnc[\u0027vpnservice_id\u0027])"},{"line_number":226,"context_line":"            try:"},{"line_number":227,"context_line":"                self._get_resource(context,"},{"line_number":228,"context_line":"                                   IKEPolicy,"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnSA%3D","line":225,"in_reply_to":"AAAAP3%2F%2FudQ%3D","updated":"2013-07-15 20:52:19.000000000","message":"This check is also needed to permissions.\nsimilar code is in l3_db","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":227,"context_line":"                self._get_resource(context,"},{"line_number":228,"context_line":"                                   IKEPolicy,"},{"line_number":229,"context_line":"                                   vpnc[\u0027ikepolicy_id\u0027])"},{"line_number":230,"context_line":"            except exc.NoResultFound:"},{"line_number":231,"context_line":"                raise vpnaas.IKEPolicyNotFound("},{"line_number":232,"context_line":"                    ikepolicy_id\u003dvpnc[\u0027ikepolicy_id\u0027]"},{"line_number":233,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FudM%3D","line":230,"updated":"2013-07-12 11:24:37.000000000","message":"How can you get a NoResultFound from _get_resource when you\u0027re passing it an IKEPolicy class?\n\nI think the except block is superfluous here.","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":227,"context_line":"                self._get_resource(context,"},{"line_number":228,"context_line":"                                   IKEPolicy,"},{"line_number":229,"context_line":"                                   vpnc[\u0027ikepolicy_id\u0027])"},{"line_number":230,"context_line":"            except exc.NoResultFound:"},{"line_number":231,"context_line":"                raise vpnaas.IKEPolicyNotFound("},{"line_number":232,"context_line":"                    ikepolicy_id\u003dvpnc[\u0027ikepolicy_id\u0027]"},{"line_number":233,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnR4%3D","line":230,"in_reply_to":"AAAAP3%2F%2FudM%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            if (vpnc[\u0027dpd_timeout\u0027] \u003c vpnc[\u0027dpd_interval\u0027]):"},{"line_number":262,"context_line":"                raise vpnaas.VPNConnectionAttributeValueError("},{"line_number":263,"context_line":"                    attribute_a\u003d\u0027dpd_timeout\u0027"},{"line_number":264,"context_line":"                )"},{"line_number":265,"context_line":"            context.session.add(vpn_conn_db)"},{"line_number":266,"context_line":"            for cidr in vpnc[\u0027peer_cidrs\u0027]:"},{"line_number":267,"context_line":"                peer_cidr_db \u003d IPsecPeerCidr(cidr\u003dcidr,"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FudE%3D","line":264,"updated":"2013-07-12 11:24:37.000000000","message":"You should do this check before even starting the transaction, in my opinion","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":283,"context_line":"                old_peer_cidr_list \u003d self._get_peer_cidr_by_vpnconnection("},{"line_number":284,"context_line":"                    context,"},{"line_number":285,"context_line":"                    vpn_conn_id"},{"line_number":286,"context_line":"                )"},{"line_number":287,"context_line":"                new_peer_cidr_set \u003d set(vpnc[\"peer_cidrs\"])"},{"line_number":288,"context_line":"                old_peer_cidr_set \u003d set([pcidr[\u0027cidr\u0027]"},{"line_number":289,"context_line":"                                        for pcidr in old_peer_cidr_list])"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2Fuco%3D","line":286,"updated":"2013-07-12 11:24:37.000000000","message":"vpnc_db.peer_cidrs is already a collection of Peer Cidr object. why not use that collection?","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":283,"context_line":"                old_peer_cidr_list \u003d self._get_peer_cidr_by_vpnconnection("},{"line_number":284,"context_line":"                    context,"},{"line_number":285,"context_line":"                    vpn_conn_id"},{"line_number":286,"context_line":"                )"},{"line_number":287,"context_line":"                new_peer_cidr_set \u003d set(vpnc[\"peer_cidrs\"])"},{"line_number":288,"context_line":"                old_peer_cidr_set \u003d set([pcidr[\u0027cidr\u0027]"},{"line_number":289,"context_line":"                                        for pcidr in old_peer_cidr_list])"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnRM%3D","line":286,"in_reply_to":"AAAAP3%2F%2Fuco%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":"                new_peer_cidrs \u003d list(new_peer_cidr_set)"},{"line_number":292,"context_line":"                for peer_cidr in old_peer_cidr_set - new_peer_cidr_set:"},{"line_number":293,"context_line":"                    for pcidr in old_peer_cidr_list:"},{"line_number":294,"context_line":"                        if pcidr[\u0027cidr\u0027] \u003d\u003d peer_cidr:"},{"line_number":295,"context_line":"                            context.session.delete(pcidr)"},{"line_number":296,"context_line":"                for peer_cidr in new_peer_cidr_set - old_peer_cidr_set:"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2Fuck%3D","line":293,"updated":"2013-07-12 11:24:37.000000000","message":"nit: you can build a dict mapping a peer cidr with its id outside of this main loop. this will allow you to avoid executing the inner loop at each iteration","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":"                new_peer_cidrs \u003d list(new_peer_cidr_set)"},{"line_number":292,"context_line":"                for peer_cidr in old_peer_cidr_set - new_peer_cidr_set:"},{"line_number":293,"context_line":"                    for pcidr in old_peer_cidr_list:"},{"line_number":294,"context_line":"                        if pcidr[\u0027cidr\u0027] \u003d\u003d peer_cidr:"},{"line_number":295,"context_line":"                            context.session.delete(pcidr)"},{"line_number":296,"context_line":"                for peer_cidr in new_peer_cidr_set - old_peer_cidr_set:"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnOY%3D","line":293,"in_reply_to":"AAAAP3%2F%2Fuck%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":307,"context_line":"        return result"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def delete_vpnconnection(self, context, vpn_conn_id):"},{"line_number":310,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":311,"context_line":"            vpnc_db \u003d self._get_resource(context, VPNConnection, vpn_conn_id)"},{"line_number":312,"context_line":"            context.session.delete(vpnc_db)"},{"line_number":313,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FucU%3D","line":310,"updated":"2013-07-12 11:24:37.000000000","message":"I was expecting status to be put in PENDING_DELETE here rather than being immediately removed.","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":307,"context_line":"        return result"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def delete_vpnconnection(self, context, vpn_conn_id):"},{"line_number":310,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":311,"context_line":"            vpnc_db \u003d self._get_resource(context, VPNConnection, vpn_conn_id)"},{"line_number":312,"context_line":"            context.session.delete(vpnc_db)"},{"line_number":313,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnNs%3D","line":310,"in_reply_to":"AAAAP3%2F%2FucU%3D","updated":"2013-07-15 20:52:19.000000000","message":"In this first version, we don\u0027t support status management.\nso it is OK for now","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":358,"context_line":"            context.session.add(ike_db)"},{"line_number":359,"context_line":"        return self._make_ikepolicy_dict(ike_db)"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    def update_ikepolicy(self, context, ikepolicy_id, ikepolicy):"},{"line_number":362,"context_line":"        ike \u003d ikepolicy[\u0027ikepolicy\u0027]"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FucQ%3D","line":361,"updated":"2013-07-12 11:24:37.000000000","message":"Is it ok to updated IKE/IPSEC policies for active VPN connections?","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":358,"context_line":"            context.session.add(ike_db)"},{"line_number":359,"context_line":"        return self._make_ikepolicy_dict(ike_db)"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    def update_ikepolicy(self, context, ikepolicy_id, ikepolicy):"},{"line_number":362,"context_line":"        ike \u003d ikepolicy[\u0027ikepolicy\u0027]"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnNE%3D","line":361,"in_reply_to":"AAAAP3%2F%2FucQ%3D","updated":"2013-07-15 20:52:19.000000000","message":"I added check for this","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":493,"context_line":"    def delete_vpnservice(self, context, vpns_id):"},{"line_number":494,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":495,"context_line":"            vpns_db \u003d self._get_resource(context, VPNService, vpns_id)"},{"line_number":496,"context_line":"            context.session.delete(vpns_db)"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"    def get_vpnservice(self, context, vpnservice_id, fields\u003dNone):"},{"line_number":499,"context_line":"        vpns_db \u003d self._get_resource(context, VPNService, vpnservice_id)"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FucM%3D","line":496,"updated":"2013-07-12 11:24:37.000000000","message":"Is it ok to remove a VPN service which has one or more connections?","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":493,"context_line":"    def delete_vpnservice(self, context, vpns_id):"},{"line_number":494,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":495,"context_line":"            vpns_db \u003d self._get_resource(context, VPNService, vpns_id)"},{"line_number":496,"context_line":"            context.session.delete(vpns_db)"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"    def get_vpnservice(self, context, vpnservice_id, fields\u003dNone):"},{"line_number":499,"context_line":"        vpns_db \u003d self._get_resource(context, VPNService, vpnservice_id)"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnM4%3D","line":496,"in_reply_to":"AAAAP3%2F%2FucM%3D","updated":"2013-07-15 20:52:19.000000000","message":"added check","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":45,"context_line":"class IPsecPolicy(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":46,"context_line":"    \"\"\"Represents a v2 IPsecPolicy Object.\"\"\""},{"line_number":47,"context_line":"    __tablename__ \u003d \u0027ipsecpolicies\u0027"},{"line_number":48,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":49,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":50,"context_line":"    transform_protocol \u003d sa.Column(sa.Enum(\"esp\", \"ah\", \"ah-esp\","},{"line_number":51,"context_line":"                                           name\u003d\"ipsec_transform_protocols\"),"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqpg%3D","line":48,"updated":"2013-07-14 21:56:10.000000000","message":"For other resources, name is a field with 255 chars. It is better to follow the convention.","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":45,"context_line":"class IPsecPolicy(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":46,"context_line":"    \"\"\"Represents a v2 IPsecPolicy Object.\"\"\""},{"line_number":47,"context_line":"    __tablename__ \u003d \u0027ipsecpolicies\u0027"},{"line_number":48,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":49,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":50,"context_line":"    transform_protocol \u003d sa.Column(sa.Enum(\"esp\", \"ah\", \"ah-esp\","},{"line_number":51,"context_line":"                                           name\u003d\"ipsec_transform_protocols\"),"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fnh8%3D","line":48,"in_reply_to":"AAAAP3%2F%2Fqpg%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":71,"context_line":"class IKEPolicy(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":72,"context_line":"    \"\"\"Represents a v2 IKEPolicy Object.\"\"\""},{"line_number":73,"context_line":"    __tablename__ \u003d \u0027ikepolicies\u0027"},{"line_number":74,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":75,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":76,"context_line":"    auth_algorithm \u003d sa.Column(sa.Enum(\"sha1\","},{"line_number":77,"context_line":"                                       name\u003d\"vpn_auth_algorithms\"),"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqpc%3D","line":74,"updated":"2013-07-14 21:56:10.000000000","message":"Ditto","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":71,"context_line":"class IKEPolicy(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":72,"context_line":"    \"\"\"Represents a v2 IKEPolicy Object.\"\"\""},{"line_number":73,"context_line":"    __tablename__ \u003d \u0027ikepolicies\u0027"},{"line_number":74,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":75,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":76,"context_line":"    auth_algorithm \u003d sa.Column(sa.Enum(\"sha1\","},{"line_number":77,"context_line":"                                       name\u003d\"vpn_auth_algorithms\"),"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fnh4%3D","line":74,"in_reply_to":"AAAAP3%2F%2Fqpc%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"class VPNConnection(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":97,"context_line":"    \"\"\"Represents a v2 VPNServiceConnection Object.\"\"\""},{"line_number":98,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":99,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":100,"context_line":"    peer_address \u003d sa.Column(sa.String(64), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FqpQ%3D","line":97,"updated":"2013-07-14 21:56:10.000000000","message":"VPNServiceConnection -\u003e VPNConnection?","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"class VPNConnection(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":97,"context_line":"    \"\"\"Represents a v2 VPNServiceConnection Object.\"\"\""},{"line_number":98,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":99,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":100,"context_line":"    peer_address \u003d sa.Column(sa.String(64), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fnh0%3D","line":97,"in_reply_to":"AAAAP3%2F%2FqpQ%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"class VPNConnection(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":97,"context_line":"    \"\"\"Represents a v2 VPNServiceConnection Object.\"\"\""},{"line_number":98,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":99,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":100,"context_line":"    peer_address \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":101,"context_line":"    peer_id \u003d sa.Column(sa.String(255), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FqpY%3D","line":98,"updated":"2013-07-14 21:56:10.000000000","message":"Ditto","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"class VPNConnection(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":97,"context_line":"    \"\"\"Represents a v2 VPNServiceConnection Object.\"\"\""},{"line_number":98,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":99,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":100,"context_line":"    peer_address \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":101,"context_line":"    peer_id \u003d sa.Column(sa.String(255), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fnhw%3D","line":98,"in_reply_to":"AAAAP3%2F%2FqpY%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"class VPNService(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":137,"context_line":"    \"\"\"Represents a v2 VPNService Object.\"\"\""},{"line_number":138,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":139,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":140,"context_line":"    status \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":141,"context_line":"    admin_state_up \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FqpA%3D","line":138,"updated":"2013-07-14 21:56:10.000000000","message":"Ditto","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"class VPNService(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":137,"context_line":"    \"\"\"Represents a v2 VPNService Object.\"\"\""},{"line_number":138,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":139,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":140,"context_line":"    status \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":141,"context_line":"    admin_state_up \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fnhs%3D","line":138,"in_reply_to":"AAAAP3%2F%2FqpA%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    \"\"\"VPN plugin database class using SQLAlchemy models.\"\"\""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    @property"},{"line_number":156,"context_line":"    def _core_plugin(self):"},{"line_number":157,"context_line":"        return manager.NeutronManager.get_plugin()"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def update_status(self, context, model, v_id, status):"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqok%3D","line":156,"updated":"2013-07-14 21:56:10.000000000","message":"A property means this is public. It is better not to start the name with an underscore.","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    \"\"\"VPN plugin database class using SQLAlchemy models.\"\"\""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    @property"},{"line_number":156,"context_line":"    def _core_plugin(self):"},{"line_number":157,"context_line":"        return manager.NeutronManager.get_plugin()"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def update_status(self, context, model, v_id, status):"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FnhU%3D","line":156,"in_reply_to":"AAAAP3%2F%2Fqok%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"dec86e84bf08fad2b2a63fa34e48d567797859ba","unresolved":false,"context_lines":[{"line_number":273,"context_line":"            if \"peer_cidrs\" in vpnc:"},{"line_number":274,"context_line":"                changed_peer_cidrs \u003d True"},{"line_number":275,"context_line":"                old_peer_cidr_list \u003d vpnc_db[\u0027peer_cidrs\u0027]"},{"line_number":276,"context_line":"                old_peer_cidr_dict \u003d {}"},{"line_number":277,"context_line":"                for peer_cidr in old_peer_cidr_list:"},{"line_number":278,"context_line":"                    old_peer_cidr_dict[peer_cidr[\u0027cidr\u0027]] \u003d peer_cidr"},{"line_number":279,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAP3%2F%2Fmn4%3D","line":276,"updated":"2013-07-15 23:14:49.000000000","message":"Could use dict comprehension with:\nold_peer_cidr_dict \u003d dict((peer_cidr[\u0027cidr\u0027], peer_cidr) for peer_cidr in old_peer_cidr_list)","commit_id":"d62e3e2e7991ba41a2a0ebad3bcb561aa6d1c7c8"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"a8c0206aba52cf21af8ea11a417e4f7d17c68638","unresolved":false,"context_lines":[{"line_number":273,"context_line":"            if \"peer_cidrs\" in vpnc:"},{"line_number":274,"context_line":"                changed_peer_cidrs \u003d True"},{"line_number":275,"context_line":"                old_peer_cidr_list \u003d vpnc_db[\u0027peer_cidrs\u0027]"},{"line_number":276,"context_line":"                old_peer_cidr_dict \u003d {}"},{"line_number":277,"context_line":"                for peer_cidr in old_peer_cidr_list:"},{"line_number":278,"context_line":"                    old_peer_cidr_dict[peer_cidr[\u0027cidr\u0027]] \u003d peer_cidr"},{"line_number":279,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAP3%2F%2FmhY%3D","line":276,"in_reply_to":"AAAAP3%2F%2Fmn4%3D","updated":"2013-07-15 23:40:44.000000000","message":"Done","commit_id":"d62e3e2e7991ba41a2a0ebad3bcb561aa6d1c7c8"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"cc8f68f51bbb02e9b59b0a786521e947a61b633a","unresolved":false,"context_lines":[{"line_number":514,"context_line":""},{"line_number":515,"context_line":"    def delete_vpnservice(self, context, vpnservice_id):"},{"line_number":516,"context_line":"        #Check if VPNService is in use before deleting"},{"line_number":517,"context_line":"        vpnservice \u003d context.session.query(VPNConnection).filter_by("},{"line_number":518,"context_line":"            vpnservice_id\u003dvpnservice_id).first()"},{"line_number":519,"context_line":"        if vpnservice:"},{"line_number":520,"context_line":"            raise vpnaas.VPNServiceInUse(vpnservice_id\u003dvpnservice_id)"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAP3%2F%2FmWg%3D","line":517,"updated":"2013-07-16 01:05:11.000000000","message":"the local name \u0027vpnservice\u0027 is probably not right.\nAnd you can probably anyway remove the local assignment and just do \n\nif context.session.query(VPNConnection).filter_by(vpnservice_id\u003dvpnservice_id).first():\n  raise","commit_id":"b6f85d856486fa4d6d4043a0db66c52e638d6d4f"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"b6b4381a13b5892ccecbbf89248cbec7acc6e653","unresolved":false,"context_lines":[{"line_number":514,"context_line":""},{"line_number":515,"context_line":"    def delete_vpnservice(self, context, vpnservice_id):"},{"line_number":516,"context_line":"        #Check if VPNService is in use before deleting"},{"line_number":517,"context_line":"        vpnservice \u003d context.session.query(VPNConnection).filter_by("},{"line_number":518,"context_line":"            vpnservice_id\u003dvpnservice_id).first()"},{"line_number":519,"context_line":"        if vpnservice:"},{"line_number":520,"context_line":"            raise vpnaas.VPNServiceInUse(vpnservice_id\u003dvpnservice_id)"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAP3%2F%2FmQ4%3D","line":517,"in_reply_to":"AAAAP3%2F%2FmWg%3D","updated":"2013-07-16 01:23:55.000000000","message":"Done","commit_id":"b6f85d856486fa4d6d4043a0db66c52e638d6d4f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":214,"context_line":"        vpnc[\u0027dpd_interval\u0027] \u003d dpd.get(\u0027interval\u0027, 30)"},{"line_number":215,"context_line":"        vpnc[\u0027dpd_timeout\u0027] \u003d dpd.get(\u0027timeout\u0027, 120)"},{"line_number":216,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, vpnc)"},{"line_number":217,"context_line":"        if (vpnc[\u0027dpd_timeout\u0027] \u003c vpnc[\u0027dpd_interval\u0027]):"},{"line_number":218,"context_line":"            raise vpnaas.VPNConnectionDpdIntervalValueError("},{"line_number":219,"context_line":"                attribute_a\u003d\u0027dpd_timeout\u0027)"},{"line_number":220,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAQn%2F%2F3Y0%3D","line":217,"updated":"2013-07-20 19:39:18.000000000","message":"Parentheses not needed.","commit_id":"1f378d3455761fe0a1688e06c6d64bf38253aa33"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":292,"context_line":"                vpnc_db.update(vpnc)"},{"line_number":293,"context_line":"        result \u003d self._make_vpnconnection_dict(vpnc_db)"},{"line_number":294,"context_line":"        if changed_peer_cidrs:"},{"line_number":295,"context_line":"            result[\u0027peer_cidrs\u0027] \u003d new_peer_cidrs"},{"line_number":296,"context_line":"        return result"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def delete_vpnconnection(self, context, vpn_conn_id):"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAQn%2F%2F3Ys%3D","line":295,"updated":"2013-07-20 19:39:18.000000000","message":"If vpnc does not have a \u0027peer_cidrs\u0027 attribute then new_peer_cidrs will not be initialized.","commit_id":"1f378d3455761fe0a1688e06c6d64bf38253aa33"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":"    \"\"\"Internal representation of a IPsec Peer Cidrs.\"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    cidr \u003d sa.Column(sa.String(32), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":44,"context_line":"    ipsecsiteconnection_id \u003d sa.Column(sa.String(36),"},{"line_number":45,"context_line":"                                       sa.ForeignKey(\u0027ipsecsiteconnections.id\u0027,"},{"line_number":46,"context_line":"                                                     ondelete\u003d\"CASCADE\"),"},{"line_number":47,"context_line":"                                       primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":44,"id":"AAAAQn%2F%2Fx9s%3D","line":44,"updated":"2013-07-23 12:02:12.000000000","message":"As with API review, should underscores be added to improve readability?\n\nipsec_site_conn_id or ipsec_site_connection_id?","commit_id":"7df2f86598fcf1a68a6b833393025858de38b7b5"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":"    \"\"\"Internal representation of a IPsec Peer Cidrs.\"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    cidr \u003d sa.Column(sa.String(32), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":44,"context_line":"    ipsecsiteconnection_id \u003d sa.Column(sa.String(36),"},{"line_number":45,"context_line":"                                       sa.ForeignKey(\u0027ipsecsiteconnections.id\u0027,"},{"line_number":46,"context_line":"                                                     ondelete\u003d\"CASCADE\"),"},{"line_number":47,"context_line":"                                       primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":44,"id":"AAAAQn%2F%2Fv98%3D","line":44,"in_reply_to":"AAAAQn%2F%2Fwzg%3D","updated":"2013-07-23 22:26:47.000000000","message":"Done","commit_id":"7df2f86598fcf1a68a6b833393025858de38b7b5"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":"    \"\"\"Internal representation of a IPsec Peer Cidrs.\"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    cidr \u003d sa.Column(sa.String(32), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":44,"context_line":"    ipsecsiteconnection_id \u003d sa.Column(sa.String(36),"},{"line_number":45,"context_line":"                                       sa.ForeignKey(\u0027ipsecsiteconnections.id\u0027,"},{"line_number":46,"context_line":"                                                     ondelete\u003d\"CASCADE\"),"},{"line_number":47,"context_line":"                                       primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":44,"id":"AAAAQn%2F%2Fwzg%3D","line":44,"in_reply_to":"AAAAQn%2F%2Fx9s%3D","updated":"2013-07-23 17:37:24.000000000","message":"I think here is ok for consistancy.\nbecause resource name is ipsecsiteconnection","commit_id":"7df2f86598fcf1a68a6b833393025858de38b7b5"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"unresolved":false,"context_lines":[{"line_number":179,"context_line":"                raise"},{"line_number":180,"context_line":"        return r"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def _get_peer_cidr_by_ipsecsiteconnection(self, context,"},{"line_number":183,"context_line":"                                              ipsecsite_conn_id):"},{"line_number":184,"context_line":"        peer_cidr_qry \u003d context.session.query(IPsecPeerCidr)"},{"line_number":185,"context_line":"        return peer_cidr_qry.filter_by("}],"source_content_type":"text/x-python","patch_set":44,"id":"AAAAQn%2F%2Fx9c%3D","line":182,"updated":"2013-07-23 12:02:12.000000000","message":"Ditto on function names.","commit_id":"7df2f86598fcf1a68a6b833393025858de38b7b5"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":179,"context_line":"                raise"},{"line_number":180,"context_line":"        return r"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def _get_peer_cidr_by_ipsecsiteconnection(self, context,"},{"line_number":183,"context_line":"                                              ipsecsite_conn_id):"},{"line_number":184,"context_line":"        peer_cidr_qry \u003d context.session.query(IPsecPeerCidr)"},{"line_number":185,"context_line":"        return peer_cidr_qry.filter_by("}],"source_content_type":"text/x-python","patch_set":44,"id":"AAAAQn%2F%2Fv90%3D","line":182,"in_reply_to":"AAAAQn%2F%2FwzY%3D","updated":"2013-07-23 22:26:47.000000000","message":"Done","commit_id":"7df2f86598fcf1a68a6b833393025858de38b7b5"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":179,"context_line":"                raise"},{"line_number":180,"context_line":"        return r"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def _get_peer_cidr_by_ipsecsiteconnection(self, context,"},{"line_number":183,"context_line":"                                              ipsecsite_conn_id):"},{"line_number":184,"context_line":"        peer_cidr_qry \u003d context.session.query(IPsecPeerCidr)"},{"line_number":185,"context_line":"        return peer_cidr_qry.filter_by("}],"source_content_type":"text/x-python","patch_set":44,"id":"AAAAQn%2F%2FwzY%3D","line":182,"in_reply_to":"AAAAQn%2F%2Fx9c%3D","updated":"2013-07-23 17:37:24.000000000","message":"ditto","commit_id":"7df2f86598fcf1a68a6b833393025858de38b7b5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                raise"},{"line_number":189,"context_line":"        return r"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def _get_peer_cidr_by_ipsec_site_connection(self, context,"},{"line_number":192,"context_line":"                                                ipsecsite_conn_id):"},{"line_number":193,"context_line":"        peer_cidr_qry \u003d context.session.query(IPsecPeerCidr)"},{"line_number":194,"context_line":"        return peer_cidr_qry.filter_by("}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrRA%3D","line":191,"updated":"2013-07-25 10:36:35.000000000","message":"This is not used in anywhere by grep. Is it still needed?","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":188,"context_line":"                raise"},{"line_number":189,"context_line":"        return r"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def _get_peer_cidr_by_ipsec_site_connection(self, context,"},{"line_number":192,"context_line":"                                                ipsecsite_conn_id):"},{"line_number":193,"context_line":"        peer_cidr_qry \u003d context.session.query(IPsecPeerCidr)"},{"line_number":194,"context_line":"        return peer_cidr_qry.filter_by("}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fpuk%3D","line":191,"in_reply_to":"AAAAQn%2F%2FrRA%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    def update_vpnservice(self, context, vpnservice_id, vpnservice):"},{"line_number":530,"context_line":"        vpns \u003d vpnservice[\u0027vpnservice\u0027]"},{"line_number":531,"context_line":"        #Check if VPNService is in use before updating"},{"line_number":532,"context_line":"        vpnservice \u003d context.session.query(IPsecSiteConnection).filter_by("},{"line_number":533,"context_line":"            vpnservice_id\u003dvpnservice_id).first()"},{"line_number":534,"context_line":"        if vpnservice:"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrQM%3D","line":531,"updated":"2013-07-25 10:36:35.000000000","message":"The comment looks unnecessary.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    def update_vpnservice(self, context, vpnservice_id, vpnservice):"},{"line_number":530,"context_line":"        vpns \u003d vpnservice[\u0027vpnservice\u0027]"},{"line_number":531,"context_line":"        #Check if VPNService is in use before updating"},{"line_number":532,"context_line":"        vpnservice \u003d context.session.query(IPsecSiteConnection).filter_by("},{"line_number":533,"context_line":"            vpnservice_id\u003dvpnservice_id).first()"},{"line_number":534,"context_line":"        if vpnservice:"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FpuY%3D","line":531,"in_reply_to":"AAAAQn%2F%2FrQM%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":541,"context_line":"        return self._make_vpnservice_dict(vpns_db)"},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"    def delete_vpnservice(self, context, vpnservice_id):"},{"line_number":544,"context_line":"        #Check if VPNService is in use before deleting"},{"line_number":545,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":546,"context_line":"            if context.session.query(IPsecSiteConnection).filter_by("},{"line_number":547,"context_line":"                vpnservice_id\u003dvpnservice_id"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrQI%3D","line":544,"updated":"2013-07-25 10:36:35.000000000","message":"Ditto","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":541,"context_line":"        return self._make_vpnservice_dict(vpns_db)"},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"    def delete_vpnservice(self, context, vpnservice_id):"},{"line_number":544,"context_line":"        #Check if VPNService is in use before deleting"},{"line_number":545,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":546,"context_line":"            if context.session.query(IPsecSiteConnection).filter_by("},{"line_number":547,"context_line":"                vpnservice_id\u003dvpnservice_id"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fpuc%3D","line":544,"in_reply_to":"AAAAQn%2F%2FrQI%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":546,"context_line":"            if context.session.query(IPsecSiteConnection).filter_by("},{"line_number":547,"context_line":"                vpnservice_id\u003dvpnservice_id"},{"line_number":548,"context_line":"            ).first():"},{"line_number":549,"context_line":"                raise vpnaas.VPNServiceInUse(vpnservice_id\u003dvpnservice_id)"},{"line_number":550,"context_line":"            vpns_db \u003d self._get_resource(context, VPNService, vpnservice_id)"},{"line_number":551,"context_line":"            context.session.delete(vpns_db)"},{"line_number":552,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrPk%3D","line":549,"updated":"2013-07-25 10:36:35.000000000","message":"In other update_* and delete_* methods, in-use check is done outside of a subtransaction. In-use check should be done to deal with race conditions.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":546,"context_line":"            if context.session.query(IPsecSiteConnection).filter_by("},{"line_number":547,"context_line":"                vpnservice_id\u003dvpnservice_id"},{"line_number":548,"context_line":"            ).first():"},{"line_number":549,"context_line":"                raise vpnaas.VPNServiceInUse(vpnservice_id\u003dvpnservice_id)"},{"line_number":550,"context_line":"            vpns_db \u003d self._get_resource(context, VPNService, vpnservice_id)"},{"line_number":551,"context_line":"            context.session.delete(vpns_db)"},{"line_number":552,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fps0%3D","line":549,"in_reply_to":"AAAAQn%2F%2FrPk%3D","updated":"2013-07-25 19:53:37.000000000","message":"Thanks. Good point\nI move all check inside the transaction","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":505,"context_line":"               \u0027subnet_id\u0027: vpnservice[\u0027subnet_id\u0027],"},{"line_number":506,"context_line":"               \u0027router_id\u0027: vpnservice[\u0027router_id\u0027],"},{"line_number":507,"context_line":"               \u0027admin_state_up\u0027: vpnservice[\u0027admin_state_up\u0027],"},{"line_number":508,"context_line":"               \u0027status\u0027: vpnservice[\u0027status\u0027]}"},{"line_number":509,"context_line":"        return self._fields(res, fields)"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"    def create_vpnservice(self, context, vpnservice):"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAQn%2F%2FmHI%3D","line":508,"updated":"2013-07-26 21:42:32.000000000","message":"I wonder if we should return a list of ip sec site connections just like we do for subnets and network.\n\nThis is just a question. your answer would be appreciated, but there\u0027s no need to address it.","commit_id":"f4128e0a6d709796d775ec3a5aabc50c7716fee6"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":505,"context_line":"               \u0027subnet_id\u0027: vpnservice[\u0027subnet_id\u0027],"},{"line_number":506,"context_line":"               \u0027router_id\u0027: vpnservice[\u0027router_id\u0027],"},{"line_number":507,"context_line":"               \u0027admin_state_up\u0027: vpnservice[\u0027admin_state_up\u0027],"},{"line_number":508,"context_line":"               \u0027status\u0027: vpnservice[\u0027status\u0027]}"},{"line_number":509,"context_line":"        return self._fields(res, fields)"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"    def create_vpnservice(self, context, vpnservice):"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAQn%2F%2FmB8%3D","line":508,"in_reply_to":"AAAAQn%2F%2FmHI%3D","updated":"2013-07-26 22:08:00.000000000","message":"so vpnservice will be used by the other VPN types (SSL-VPN, MPLS,...) so IMO, we shouldn\u0027t return the information here.","commit_id":"f4128e0a6d709796d775ec3a5aabc50c7716fee6"}],"neutron/extensions/vpnaas.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                        \u0027default\u0027: \u0027150\u0027,"},{"line_number":156,"context_line":"                        \u0027validate\u0027: {\u0027type:non_negative\u0027: None},"},{"line_number":157,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":158,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":159,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":160,"context_line":"                           \u0027default\u0027: True,"},{"line_number":161,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FufE%3D","line":158,"updated":"2013-07-12 11:24:37.000000000","message":"Consider grouping dpd attributes in a single attribute.","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                        \u0027default\u0027: \u0027150\u0027,"},{"line_number":156,"context_line":"                        \u0027validate\u0027: {\u0027type:non_negative\u0027: None},"},{"line_number":157,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":158,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":159,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":160,"context_line":"                           \u0027default\u0027: True,"},{"line_number":161,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnMw%3D","line":158,"in_reply_to":"AAAAP3%2F%2FufE%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                           \u0027default\u0027: \u00273600\u0027,"},{"line_number":220,"context_line":"                           \u0027validate\u0027: {\u0027type:non_negative\u0027: None},"},{"line_number":221,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":222,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":223,"context_line":"        \u0027pfs\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":224,"context_line":"                \u0027default\u0027: \u0027group5\u0027,"},{"line_number":225,"context_line":"                \u0027validate\u0027: {\u0027type:values\u0027: [\u0027group2\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2Fufk%3D","line":222,"updated":"2013-07-12 11:24:37.000000000","message":"consider making lifetime an attribute with two keys: units and value.","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                           \u0027default\u0027: \u00273600\u0027,"},{"line_number":220,"context_line":"                           \u0027validate\u0027: {\u0027type:non_negative\u0027: None},"},{"line_number":221,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":222,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":223,"context_line":"        \u0027pfs\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":224,"context_line":"                \u0027default\u0027: \u0027group5\u0027,"},{"line_number":225,"context_line":"                \u0027validate\u0027: {\u0027type:values\u0027: [\u0027group2\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnMo%3D","line":222,"in_reply_to":"AAAAP3%2F%2Fufk%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            else:"},{"line_number":316,"context_line":"                singular \u003d plural[:-1]"},{"line_number":317,"context_line":"            my_plurals.append((plural, singular))"},{"line_number":318,"context_line":"            my_plurals.append((\u0027peer_cidrs\u0027, \u0027peer_cidr\u0027))"},{"line_number":319,"context_line":"        attr.PLURALS.update(dict(my_plurals))"},{"line_number":320,"context_line":"        resources \u003d []"},{"line_number":321,"context_line":"        plugin \u003d manager.NeutronManager.get_service_plugins()["}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2Fue4%3D","line":318,"updated":"2013-07-12 11:24:37.000000000","message":"Is the above declaration for XML serialization?","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            else:"},{"line_number":316,"context_line":"                singular \u003d plural[:-1]"},{"line_number":317,"context_line":"            my_plurals.append((plural, singular))"},{"line_number":318,"context_line":"            my_plurals.append((\u0027peer_cidrs\u0027, \u0027peer_cidr\u0027))"},{"line_number":319,"context_line":"        attr.PLURALS.update(dict(my_plurals))"},{"line_number":320,"context_line":"        resources \u003d []"},{"line_number":321,"context_line":"        plugin \u003d manager.NeutronManager.get_service_plugins()["}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnMQ%3D","line":318,"in_reply_to":"AAAAP3%2F%2Fue4%3D","updated":"2013-07-15 20:52:19.000000000","message":"yes","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":324,"context_line":"            if collection_name \u003d\u003d \u0027ikepolicies\u0027:"},{"line_number":325,"context_line":"                resource_name \u003d \u0027ikepolicy\u0027"},{"line_number":326,"context_line":"            elif collection_name \u003d\u003d \u0027ipsecpolicies\u0027:"},{"line_number":327,"context_line":"                resource_name \u003d \u0027ipsecpolicy\u0027"},{"line_number":328,"context_line":"            else:"},{"line_number":329,"context_line":"                resource_name \u003d collection_name[:-1]"},{"line_number":330,"context_line":"            params \u003d RESOURCE_ATTRIBUTE_MAP[collection_name]"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2Fueo%3D","line":327,"updated":"2013-07-12 11:24:37.000000000","message":"perhaps leverage plurals.\n\nOptional comment.","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":324,"context_line":"            if collection_name \u003d\u003d \u0027ikepolicies\u0027:"},{"line_number":325,"context_line":"                resource_name \u003d \u0027ikepolicy\u0027"},{"line_number":326,"context_line":"            elif collection_name \u003d\u003d \u0027ipsecpolicies\u0027:"},{"line_number":327,"context_line":"                resource_name \u003d \u0027ipsecpolicy\u0027"},{"line_number":328,"context_line":"            else:"},{"line_number":329,"context_line":"                resource_name \u003d collection_name[:-1]"},{"line_number":330,"context_line":"            params \u003d RESOURCE_ATTRIBUTE_MAP[collection_name]"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnLs%3D","line":327,"in_reply_to":"AAAAP3%2F%2Fueo%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":329,"context_line":"                resource_name \u003d collection_name[:-1]"},{"line_number":330,"context_line":"            params \u003d RESOURCE_ATTRIBUTE_MAP[collection_name]"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"            member_actions \u003d {}"},{"line_number":333,"context_line":"            controller \u003d base.create_resource("},{"line_number":334,"context_line":"                collection_name, resource_name, plugin, params,"},{"line_number":335,"context_line":"                member_actions\u003dmember_actions,"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2Fuek%3D","line":332,"updated":"2013-07-12 11:24:37.000000000","message":"it seems you can remove member_actions since there isn\u0027t any defined.","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":329,"context_line":"                resource_name \u003d collection_name[:-1]"},{"line_number":330,"context_line":"            params \u003d RESOURCE_ATTRIBUTE_MAP[collection_name]"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"            member_actions \u003d {}"},{"line_number":333,"context_line":"            controller \u003d base.create_resource("},{"line_number":334,"context_line":"                collection_name, resource_name, plugin, params,"},{"line_number":335,"context_line":"                member_actions\u003dmember_actions,"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnMI%3D","line":332,"in_reply_to":"AAAAP3%2F%2Fuek%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class VPNConnectionAttributeValueError(qexception.InvalidInput):"},{"line_number":41,"context_line":"    message \u003d _(\"VPNConnection %(attribute_a)s less than dpd_interval\")"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class IKEPolicyNotFound(qexception.NotFound):"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqq8%3D","line":41,"updated":"2013-07-14 21:56:10.000000000","message":"The class name is generic but the message is too specific. It seems this exception is specific to dpd_interval. It is better to change the class name or the message.","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class VPNConnectionAttributeValueError(qexception.InvalidInput):"},{"line_number":41,"context_line":"    message \u003d _(\"VPNConnection %(attribute_a)s less than dpd_interval\")"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class IKEPolicyNotFound(qexception.NotFound):"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FnhM%3D","line":41,"in_reply_to":"AAAAP3%2F%2Fqq8%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    message \u003d _(\"IKEPolicy %(ikepolicy_id)s is still in use\")"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class StateInvalid(qexception.NeutronException):"},{"line_number":57,"context_line":"    message \u003d _(\"Invalid state %(state)s of vpnaas resource %(id)s\")"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqq0%3D","line":56,"updated":"2013-07-14 21:56:10.000000000","message":"It is better to have some prefix such as VPN or something.\nOther exceptions have VPNaaS specific prefixes.","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    message \u003d _(\"IKEPolicy %(ikepolicy_id)s is still in use\")"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class StateInvalid(qexception.NeutronException):"},{"line_number":57,"context_line":"    message \u003d _(\"Invalid state %(state)s of vpnaas resource %(id)s\")"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fng4%3D","line":56,"in_reply_to":"AAAAP3%2F%2Fqq0%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":75,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":76,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":77,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":78,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":79,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":80,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqqs%3D","line":77,"updated":"2013-07-14 21:56:10.000000000","message":"name is not a required field. \"default\" is needed.","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":75,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":76,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":77,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":78,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":79,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":80,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fngo%3D","line":77,"in_reply_to":"AAAAP3%2F%2Fqqs%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                        \u0027default\u0027: \u0027150\u0027,"},{"line_number":156,"context_line":"                        \u0027validate\u0027: {\u0027type:non_negative\u0027: None},"},{"line_number":157,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":158,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":159,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":160,"context_line":"                           \u0027default\u0027: True,"},{"line_number":161,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqp0%3D","line":158,"updated":"2013-07-14 21:56:10.000000000","message":"In the previous patch set Salvatore suggested grouping of dpd_* attributes. I second it. Now we support validations for sub-attributes.","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                        \u0027default\u0027: \u0027150\u0027,"},{"line_number":156,"context_line":"                        \u0027validate\u0027: {\u0027type:non_negative\u0027: None},"},{"line_number":157,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":158,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":159,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":160,"context_line":"                           \u0027default\u0027: True,"},{"line_number":161,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fngg%3D","line":158,"in_reply_to":"AAAAP3%2F%2Fqp0%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":185,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":186,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":187,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":188,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":189,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":190,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqpw%3D","line":187,"updated":"2013-07-14 21:56:10.000000000","message":"Need \"default\"","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":185,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":186,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":187,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":188,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":189,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":190,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FngQ%3D","line":187,"in_reply_to":"AAAAP3%2F%2Fqpw%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                               \u0027default\u0027: \u0027esp\u0027,"},{"line_number":193,"context_line":"                               \u0027validate\u0027: {\u0027type:values\u0027: [\u0027esp\u0027,"},{"line_number":194,"context_line":"                                                            \u0027ah\u0027,"},{"line_number":195,"context_line":"                                                            \u0027ah-esp\u0027]},"},{"line_number":196,"context_line":"                               \u0027is_visible\u0027: True},"},{"line_number":197,"context_line":"        \u0027auth_algorithm\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":198,"context_line":"                           \u0027default\u0027: \u0027sha1\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqps%3D","line":195,"updated":"2013-07-14 21:56:10.000000000","message":"It is better a list of accepted values should be defined as a constant.\nextension/security_groups.py is a good example and it defines sg_supported_protocols and sg_supported_ethertypes.","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                               \u0027default\u0027: \u0027esp\u0027,"},{"line_number":193,"context_line":"                               \u0027validate\u0027: {\u0027type:values\u0027: [\u0027esp\u0027,"},{"line_number":194,"context_line":"                                                            \u0027ah\u0027,"},{"line_number":195,"context_line":"                                                            \u0027ah-esp\u0027]},"},{"line_number":196,"context_line":"                               \u0027is_visible\u0027: True},"},{"line_number":197,"context_line":"        \u0027auth_algorithm\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":198,"context_line":"                           \u0027default\u0027: \u0027sha1\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FngI%3D","line":195,"in_reply_to":"AAAAP3%2F%2Fqps%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                           \u0027default\u0027: \u00273600\u0027,"},{"line_number":220,"context_line":"                           \u0027validate\u0027: {\u0027type:non_negative\u0027: None},"},{"line_number":221,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":222,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":223,"context_line":"        \u0027pfs\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":224,"context_line":"                \u0027default\u0027: \u0027group5\u0027,"},{"line_number":225,"context_line":"                \u0027validate\u0027: {\u0027type:values\u0027: [\u0027group2\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqpo%3D","line":222,"updated":"2013-07-14 21:56:10.000000000","message":"In the previous patch set, grouping of lifetime_* is suggested.","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                           \u0027default\u0027: \u00273600\u0027,"},{"line_number":220,"context_line":"                           \u0027validate\u0027: {\u0027type:non_negative\u0027: None},"},{"line_number":221,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":222,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":223,"context_line":"        \u0027pfs\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":224,"context_line":"                \u0027default\u0027: \u0027group5\u0027,"},{"line_number":225,"context_line":"                \u0027validate\u0027: {\u0027type:values\u0027: [\u0027group2\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FngA%3D","line":222,"in_reply_to":"AAAAP3%2F%2Fqpo%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":239,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":240,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":241,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":242,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":243,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":244,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":245,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqpk%3D","line":242,"updated":"2013-07-14 21:56:10.000000000","message":"Needs \"default\"","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":239,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":240,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":241,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":242,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":243,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":244,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":245,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fnf8%3D","line":242,"in_reply_to":"AAAAP3%2F%2Fqpk%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \u0027peer_address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":133,"context_line":"                         \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":134,"context_line":"                         \u0027is_visible\u0027: True},"},{"line_number":135,"context_line":"        \u0027peer_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":136,"context_line":"                    \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":137,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":138,"context_line":"        \u0027peer_cidrs\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAP3%2F%2FgWM%3D","line":135,"updated":"2013-07-17 08:24:43.000000000","message":"One question: According to VPNaaS API specification, peer_id looks just information and a name or description can be specified to peer_id. It is not required to be unique too.\nIn Neutron API, \"*_id\" attributes are expected as unique in general. A name \"peer_name\" looks better to me rathan \"peer_id\". It might be discussed already, but i would like to confirm it.","commit_id":"e66acc8297ec37321941cac38d13391c200af26e"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \u0027peer_address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":133,"context_line":"                         \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":134,"context_line":"                         \u0027is_visible\u0027: True},"},{"line_number":135,"context_line":"        \u0027peer_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":136,"context_line":"                    \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":137,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":138,"context_line":"        \u0027peer_cidrs\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAP3%2F%2FfDI%3D","line":135,"in_reply_to":"AAAAP3%2F%2FfRg%3D","updated":"2013-07-17 15:27:01.000000000","message":"Thanks for the clarification. I got it.","commit_id":"e66acc8297ec37321941cac38d13391c200af26e"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \u0027peer_address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":133,"context_line":"                         \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":134,"context_line":"                         \u0027is_visible\u0027: True},"},{"line_number":135,"context_line":"        \u0027peer_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":136,"context_line":"                    \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":137,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":138,"context_line":"        \u0027peer_cidrs\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAP3%2F%2FfRg%3D","line":135,"in_reply_to":"AAAAP3%2F%2FgWM%3D","updated":"2013-07-17 14:26:41.000000000","message":"peer_id should be @fqdn or ip address.\nso it is one of vpn terms, so vpn team decided to use it.","commit_id":"e66acc8297ec37321941cac38d13391c200af26e"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":434,"context_line":"        pass"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    @abc.abstractmethod"},{"line_number":437,"context_line":"    def get_ikepolicy(self, context, filters\u003dNone, fields\u003dNone):"},{"line_number":438,"context_line":"        pass"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAQn%2F%2F3YY%3D","line":437,"updated":"2013-07-20 19:39:18.000000000","message":"Third argument (filters) should be ikepolicy_id.","commit_id":"1f378d3455761fe0a1688e06c6d64bf38253aa33"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":"# @author: Swaminathan Vasudevan, Hewlett-Packard."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import abc"},{"line_number":21,"context_line":"from oslo.config import cfg"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from neutron.api import extensions"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrUM%3D","line":20,"updated":"2013-07-25 10:36:35.000000000","message":"Needs a blank line here. abc is a standard module and oslo.config is third-party.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":"# @author: Swaminathan Vasudevan, Hewlett-Packard."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import abc"},{"line_number":21,"context_line":"from oslo.config import cfg"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from neutron.api import extensions"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fpsc%3D","line":20,"in_reply_to":"AAAAQn%2F%2FrUM%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        \u0027auth_algorithm\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":271,"context_line":"                           \u0027default\u0027: \u0027sha1\u0027,"},{"line_number":272,"context_line":"                           \u0027validate\u0027: {"},{"line_number":273,"context_line":"                           \u0027type:values\u0027: vpn_supported_auth_algorithms"},{"line_number":274,"context_line":"                           },"},{"line_number":275,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":276,"context_line":"        \u0027encryption_algorithm\u0027: {"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrQY%3D","line":273,"updated":"2013-07-25 10:36:35.000000000","message":"The indentation level needs to be fixed.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":270,"context_line":"        \u0027auth_algorithm\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":271,"context_line":"                           \u0027default\u0027: \u0027sha1\u0027,"},{"line_number":272,"context_line":"                           \u0027validate\u0027: {"},{"line_number":273,"context_line":"                           \u0027type:values\u0027: vpn_supported_auth_algorithms"},{"line_number":274,"context_line":"                           },"},{"line_number":275,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":276,"context_line":"        \u0027encryption_algorithm\u0027: {"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FpsY%3D","line":273,"in_reply_to":"AAAAQn%2F%2FrQY%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    @classmethod"},{"line_number":320,"context_line":"    def get_alias(cls):"},{"line_number":321,"context_line":"        return \"vpnaas\""},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    @classmethod"},{"line_number":324,"context_line":"    def get_description(cls):"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrSc%3D","line":321,"updated":"2013-07-25 10:36:35.000000000","message":"The alias for LBaaS is not \"lbaas\" but \"loadbalancer\". Which is better \"vpn\" or \"vpnaa\"?\n\nThe discussion can be said for the filename: \"vpnaas.py\" or \"vpn.py\".","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"unresolved":false,"context_lines":[{"line_number":353,"context_line":"            params \u003d RESOURCE_ATTRIBUTE_MAP[collection_name]"},{"line_number":354,"context_line":"            collection_name \u003d collection_name.replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"            quota.QUOTAS.register_resource_by_name(resource_name)"},{"line_number":357,"context_line":"            controller \u003d base.create_resource("},{"line_number":358,"context_line":"                collection_name, resource_name, plugin, params,"},{"line_number":359,"context_line":"                allow_pagination\u003dcfg.CONF.allow_pagination,"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fub0%3D","line":356,"updated":"2013-07-24 12:08:33.000000000","message":"Just for my education... what is the above line doing?","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":353,"context_line":"            params \u003d RESOURCE_ATTRIBUTE_MAP[collection_name]"},{"line_number":354,"context_line":"            collection_name \u003d collection_name.replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"            quota.QUOTAS.register_resource_by_name(resource_name)"},{"line_number":357,"context_line":"            controller \u003d base.create_resource("},{"line_number":358,"context_line":"                collection_name, resource_name, plugin, params,"},{"line_number":359,"context_line":"                allow_pagination\u003dcfg.CONF.allow_pagination,"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FtKA%3D","line":356,"in_reply_to":"AAAAQn%2F%2Fub0%3D","updated":"2013-07-24 18:19:54.000000000","message":"This code adds vpn resource for supporting quota","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    @classmethod"},{"line_number":320,"context_line":"    def get_alias(cls):"},{"line_number":321,"context_line":"        return \"vpnaas\""},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    @classmethod"},{"line_number":324,"context_line":"    def get_description(cls):"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAQn%2F%2FmIc%3D","line":321,"updated":"2013-07-26 21:42:32.000000000","message":"I have expressed my distaste for anything \u0027aas\u0027 - but it seems I\u0027m fighting against windmills, so never mind.","commit_id":"f4128e0a6d709796d775ec3a5aabc50c7716fee6"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    @classmethod"},{"line_number":320,"context_line":"    def get_alias(cls):"},{"line_number":321,"context_line":"        return \"vpnaas\""},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    @classmethod"},{"line_number":324,"context_line":"    def get_description(cls):"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAQn%2F%2FmB0%3D","line":321,"in_reply_to":"AAAAQn%2F%2FmIc%3D","updated":"2013-07-26 22:08:00.000000000","message":"I agree.. but we followed lbaas.\nso let\u0027s us keep this here.","commit_id":"f4128e0a6d709796d775ec3a5aabc50c7716fee6"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"vpn_supported_initiators \u003d [\u0027bi-directional\u0027, \u0027response-only\u0027]"},{"line_number":71,"context_line":"vpn_supported_encryption_algorithms \u003d [\u00273des\u0027, \u0027aes-128\u0027,"},{"line_number":72,"context_line":"                                       \u0027aes-192\u0027, \u0027aes-256\u0027]"},{"line_number":73,"context_line":"vpn_dpd_supported_actions \u003d ["},{"line_number":74,"context_line":"    \u0027hold\u0027, \u0027clear\u0027, \u0027restart\u0027, \u0027restart-by-peer\u0027, \u0027disabled\u0027"},{"line_number":75,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":52,"id":"AAAAQn%2F%2FdJM%3D","line":72,"updated":"2013-07-30 22:51:24.000000000","message":"these are duplicated in a few places, I am starting to wonder whether it\u0027s more appropriate to have constants and make potential changes less error prone.","commit_id":"7856f68ec3229d0f7bf177532022a32b6543730d"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"vpn_supported_initiators \u003d [\u0027bi-directional\u0027, \u0027response-only\u0027]"},{"line_number":71,"context_line":"vpn_supported_encryption_algorithms \u003d [\u00273des\u0027, \u0027aes-128\u0027,"},{"line_number":72,"context_line":"                                       \u0027aes-192\u0027, \u0027aes-256\u0027]"},{"line_number":73,"context_line":"vpn_dpd_supported_actions \u003d ["},{"line_number":74,"context_line":"    \u0027hold\u0027, \u0027clear\u0027, \u0027restart\u0027, \u0027restart-by-peer\u0027, \u0027disabled\u0027"},{"line_number":75,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":52,"id":"AAAAQn%2F%2Fasg%3D","line":72,"in_reply_to":"AAAAQn%2F%2Fbd0%3D","updated":"2013-07-31 14:51:53.000000000","message":"Yeah.. I think this is a minor item we can fix up in a follow-up patch.","commit_id":"7856f68ec3229d0f7bf177532022a32b6543730d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"vpn_supported_initiators \u003d [\u0027bi-directional\u0027, \u0027response-only\u0027]"},{"line_number":71,"context_line":"vpn_supported_encryption_algorithms \u003d [\u00273des\u0027, \u0027aes-128\u0027,"},{"line_number":72,"context_line":"                                       \u0027aes-192\u0027, \u0027aes-256\u0027]"},{"line_number":73,"context_line":"vpn_dpd_supported_actions \u003d ["},{"line_number":74,"context_line":"    \u0027hold\u0027, \u0027clear\u0027, \u0027restart\u0027, \u0027restart-by-peer\u0027, \u0027disabled\u0027"},{"line_number":75,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":52,"id":"AAAAQn%2F%2Fbd0%3D","line":72,"in_reply_to":"AAAAQn%2F%2FdJM%3D","updated":"2013-07-31 13:24:57.000000000","message":"According to my grep-ing the code, this is the only place where a list of algorithms is defined except db model and db migration.\n\nAre you talking about the duplication between Enum in DB model and here? If so, I have no idea at now.","commit_id":"7856f68ec3229d0f7bf177532022a32b6543730d"}],"neutron/services/vpn/plugin.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from neutron.plugins.common import constants"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class VPNPlugin(vpn_db.VPNPluginDb):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    \"\"\"Implementation of the VPN Service Plugin."},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FubU%3D","line":26,"updated":"2013-07-12 11:24:37.000000000","message":"It actually seems this class is a proxy to the db object.\nIs it supposed to be extended in the future?","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from neutron.plugins.common import constants"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class VPNPlugin(vpn_db.VPNPluginDb):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    \"\"\"Implementation of the VPN Service Plugin."},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnLk%3D","line":26,"in_reply_to":"AAAAP3%2F%2FubU%3D","updated":"2013-07-15 20:52:19.000000000","message":"yes. We will extend this class in driver patch","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def update_vpnconnection(self, context,"},{"line_number":54,"context_line":"                             vpn_conn_id, vpnconnection):"},{"line_number":55,"context_line":"        return super(VPNPlugin, self).update_vpnconnection(context,"},{"line_number":56,"context_line":"                                                           vpn_conn_id,"},{"line_number":57,"context_line":"                                                           vpnconnection)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FubY%3D","line":55,"updated":"2013-07-12 11:24:37.000000000","message":"consider going to new line with parameter list","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def update_vpnconnection(self, context,"},{"line_number":54,"context_line":"                             vpn_conn_id, vpnconnection):"},{"line_number":55,"context_line":"        return super(VPNPlugin, self).update_vpnconnection(context,"},{"line_number":56,"context_line":"                                                           vpn_conn_id,"},{"line_number":57,"context_line":"                                                           vpnconnection)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnLY%3D","line":55,"in_reply_to":"AAAAP3%2F%2FubY%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        super(VPNPlugin, self).delete_ikepolicy(context, ikepolicy_id)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def update_ikepolicy(self, context, ikepolicy_id, ikepolicy):"},{"line_number":66,"context_line":"        return super(VPNPlugin, self).update_ikepolicy(context,"},{"line_number":67,"context_line":"                                                       ikepolicy_id,"},{"line_number":68,"context_line":"                                                       ikepolicy)"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2Fubc%3D","line":66,"updated":"2013-07-12 11:24:37.000000000","message":"consider going to new line with parameter list","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        super(VPNPlugin, self).delete_ikepolicy(context, ikepolicy_id)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def update_ikepolicy(self, context, ikepolicy_id, ikepolicy):"},{"line_number":66,"context_line":"        return super(VPNPlugin, self).update_ikepolicy(context,"},{"line_number":67,"context_line":"                                                       ikepolicy_id,"},{"line_number":68,"context_line":"                                                       ikepolicy)"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnLU%3D","line":66,"in_reply_to":"AAAAP3%2F%2Fubc%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        super(VPNPlugin, self).delete_ipsecpolicy(context, ipsecpolicy_id)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def update_ipsecpolicy(self, context, ipsecpolicy_id, ipsecpolicy):"},{"line_number":78,"context_line":"        return super(VPNPlugin, self).update_ipsecpolicy(context,"},{"line_number":79,"context_line":"                                                         ipsecpolicy_id,"},{"line_number":80,"context_line":"                                                         ipsecpolicy)"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2Fubg%3D","line":78,"updated":"2013-07-12 11:24:37.000000000","message":"consider going to new line with parameter list","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        super(VPNPlugin, self).delete_ipsecpolicy(context, ipsecpolicy_id)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def update_ipsecpolicy(self, context, ipsecpolicy_id, ipsecpolicy):"},{"line_number":78,"context_line":"        return super(VPNPlugin, self).update_ipsecpolicy(context,"},{"line_number":79,"context_line":"                                                         ipsecpolicy_id,"},{"line_number":80,"context_line":"                                                         ipsecpolicy)"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnLQ%3D","line":78,"in_reply_to":"AAAAP3%2F%2Fubg%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                                                        vpnservice)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def update_vpnservice(self, context, vpnservice_id, vpnservice):"},{"line_number":87,"context_line":"        return super(VPNPlugin, self).update_vpnservice(context,"},{"line_number":88,"context_line":"                                                        vpnservice_id,"},{"line_number":89,"context_line":"                                                        vpnservice)"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2Fubk%3D","line":87,"updated":"2013-07-12 11:24:37.000000000","message":"consider going to new line with parameter list","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                                                        vpnservice)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def update_vpnservice(self, context, vpnservice_id, vpnservice):"},{"line_number":87,"context_line":"        return super(VPNPlugin, self).update_vpnservice(context,"},{"line_number":88,"context_line":"                                                        vpnservice_id,"},{"line_number":89,"context_line":"                                                        vpnservice)"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnLM%3D","line":87,"in_reply_to":"AAAAP3%2F%2Fubk%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        return constants.VPN"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def get_plugin_description(self):"},{"line_number":44,"context_line":"        return \"VPN Service Plugin\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def create_vpnconnection(self, context, vpnconnection):"},{"line_number":47,"context_line":"        return super(VPNPlugin, self).create_vpnconnection(context,"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqog%3D","line":44,"updated":"2013-07-14 21:56:10.000000000","message":"get_plugin_type and get_plugin_description are unnecessary.\nThis class inherits VPNPluginBase and these methods are defined in VPNPluginBase.","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        return constants.VPN"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def get_plugin_description(self):"},{"line_number":44,"context_line":"        return \"VPN Service Plugin\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def create_vpnconnection(self, context, vpnconnection):"},{"line_number":47,"context_line":"        return super(VPNPlugin, self).create_vpnconnection(context,"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FnfI%3D","line":44,"in_reply_to":"AAAAP3%2F%2Fqog%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":"    supported_extension_aliases \u003d [\"vpnaas\"]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def get_plugin_type(self):"},{"line_number":36,"context_line":"        return constants.VPN"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def get_plugin_description(self):"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrRc%3D","line":35,"updated":"2013-07-25 10:36:35.000000000","message":"This method is unnecessary. it is defined in extension/vpnaas.py and both are exactly same.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":"    supported_extension_aliases \u003d [\"vpnaas\"]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def get_plugin_type(self):"},{"line_number":36,"context_line":"        return constants.VPN"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def get_plugin_description(self):"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FprY%3D","line":35,"in_reply_to":"AAAAQn%2F%2FrRc%3D","updated":"2013-07-25 19:53:37.000000000","message":"Ah you are true.\nI\u0027ll remove this lines and add inherits","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    def get_plugin_type(self):"},{"line_number":36,"context_line":"        return constants.VPN"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def get_plugin_description(self):"},{"line_number":39,"context_line":"        return \"VPN Service Plugin\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrRY%3D","line":38,"updated":"2013-07-25 10:36:35.000000000","message":"Ditto","commit_id":"d0d176157ae465000e64e09a37812476254e300c"}],"neutron/tests/unit/db/vpn/test_db_vpnaas.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import contextlib"},{"line_number":21,"context_line":"import logging"},{"line_number":22,"context_line":"import os"},{"line_number":23,"context_line":"import webob.exc"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from neutron.api.extensions import ExtensionMiddleware"},{"line_number":26,"context_line":"from neutron.api.extensions import PluginAwareExtensionManager"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FqoI%3D","line":23,"updated":"2013-07-14 21:56:10.000000000","message":"webos is a third party module. Needs a blank line before L.23\n\nUse \"from webob import exc\" instead of \"import webob.exe\"","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import contextlib"},{"line_number":21,"context_line":"import logging"},{"line_number":22,"context_line":"import os"},{"line_number":23,"context_line":"import webob.exc"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from neutron.api.extensions import ExtensionMiddleware"},{"line_number":26,"context_line":"from neutron.api.extensions import PluginAwareExtensionManager"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fne8%3D","line":23,"in_reply_to":"AAAAP3%2F%2FqoI%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from neutron.plugins.openvswitch import ovs_neutron_plugin"},{"line_number":33,"context_line":"from neutron.services.vpn import ("},{"line_number":34,"context_line":"    plugin as vpn_plugin"},{"line_number":35,"context_line":")"},{"line_number":36,"context_line":"from neutron.tests.unit import test_db_plugin"},{"line_number":37,"context_line":"from neutron.tests.unit import test_l3_plugin"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FqoE%3D","line":35,"updated":"2013-07-14 21:56:10.000000000","message":"L.33-35 fits into one line.","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from neutron.plugins.openvswitch import ovs_neutron_plugin"},{"line_number":33,"context_line":"from neutron.services.vpn import ("},{"line_number":34,"context_line":"    plugin as vpn_plugin"},{"line_number":35,"context_line":")"},{"line_number":36,"context_line":"from neutron.tests.unit import test_db_plugin"},{"line_number":37,"context_line":"from neutron.tests.unit import test_l3_plugin"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fne0%3D","line":35,"in_reply_to":"AAAAP3%2F%2FqoE%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":41,"context_line":"DB_CORE_PLUGIN_KLASS \u003d \u0027neutron.db.db_base_plugin_v2.NeutronDbPluginV2\u0027"},{"line_number":42,"context_line":"DB_VPN_PLUGIN_KLASS \u003d ("},{"line_number":43,"context_line":"    \"neutron.services.vpn.plugin.VPNPlugin\""},{"line_number":44,"context_line":")"},{"line_number":45,"context_line":"ROOTDIR \u003d os.path.dirname(__file__) + \u0027../../../..\u0027"},{"line_number":46,"context_line":"ETCDIR \u003d os.path.join(ROOTDIR, \u0027etc\u0027)"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FqoA%3D","line":44,"updated":"2013-07-14 21:56:10.000000000","message":"Ditto","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":41,"context_line":"DB_CORE_PLUGIN_KLASS \u003d \u0027neutron.db.db_base_plugin_v2.NeutronDbPluginV2\u0027"},{"line_number":42,"context_line":"DB_VPN_PLUGIN_KLASS \u003d ("},{"line_number":43,"context_line":"    \"neutron.services.vpn.plugin.VPNPlugin\""},{"line_number":44,"context_line":")"},{"line_number":45,"context_line":"ROOTDIR \u003d os.path.dirname(__file__) + \u0027../../../..\u0027"},{"line_number":46,"context_line":"ETCDIR \u003d os.path.join(ROOTDIR, \u0027etc\u0027)"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fnew%3D","line":44,"in_reply_to":"AAAAP3%2F%2FqoA%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def etcdir(*p):"},{"line_number":52,"context_line":"    return os.path.join(ETCDIR, *p)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class VPNPluginDbTestCase(test_l3_plugin.L3NatTestCaseMixin,"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqn8%3D","line":52,"updated":"2013-07-14 21:56:10.000000000","message":"This seems not be used in this module.","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def etcdir(*p):"},{"line_number":52,"context_line":"    return os.path.join(ETCDIR, *p)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class VPNPluginDbTestCase(test_l3_plugin.L3NatTestCaseMixin,"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fnes%3D","line":52,"in_reply_to":"AAAAP3%2F%2Fqn8%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            service_plugins\u003dservice_plugins"},{"line_number":70,"context_line":"        )"},{"line_number":71,"context_line":"        self._subnet_id \u003d \"0c798ed8-33ba-11e2-8b28-000c291c4d14\""},{"line_number":72,"context_line":"        self.core_plugin \u003d ovs_neutron_plugin.OVSNeutronPluginV2()"},{"line_number":73,"context_line":"        self.plugin \u003d vpn_plugin.VPNPlugin()"},{"line_number":74,"context_line":"        ext_mgr \u003d PluginAwareExtensionManager("},{"line_number":75,"context_line":"            extensions_path,"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqnw%3D","line":72,"updated":"2013-07-14 21:56:10.000000000","message":"It is not good the DB unit tests depend on the specific plugin.\nCan\u0027t we use L3-db plugin which is used in L3-db tests?","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            service_plugins\u003dservice_plugins"},{"line_number":70,"context_line":"        )"},{"line_number":71,"context_line":"        self._subnet_id \u003d \"0c798ed8-33ba-11e2-8b28-000c291c4d14\""},{"line_number":72,"context_line":"        self.core_plugin \u003d ovs_neutron_plugin.OVSNeutronPluginV2()"},{"line_number":73,"context_line":"        self.plugin \u003d vpn_plugin.VPNPlugin()"},{"line_number":74,"context_line":"        ext_mgr \u003d PluginAwareExtensionManager("},{"line_number":75,"context_line":"            extensions_path,"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FneI%3D","line":72,"in_reply_to":"AAAAP3%2F%2Fqnw%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":419,"context_line":"        with contextlib.nested(self.ikepolicy(name\u003d\u0027ikepolicy1\u0027),"},{"line_number":420,"context_line":"                               self.ikepolicy(name\u003d\u0027ikepolicy2\u0027),"},{"line_number":421,"context_line":"                               self.ikepolicy(name\u003d\u0027ikepolicy3\u0027)"},{"line_number":422,"context_line":"                               ) as(ikepolicy1, ikepolicy2, ikepolicy3):"},{"line_number":423,"context_line":"            self._test_list_with_sort(\u0027ikepolicy\u0027, (ikepolicy3,"},{"line_number":424,"context_line":"                                                    ikepolicy2,"},{"line_number":425,"context_line":"                                                    ikepolicy1),"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqnk%3D","line":422,"updated":"2013-07-14 21:56:10.000000000","message":"Add a space between as and (","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":419,"context_line":"        with contextlib.nested(self.ikepolicy(name\u003d\u0027ikepolicy1\u0027),"},{"line_number":420,"context_line":"                               self.ikepolicy(name\u003d\u0027ikepolicy2\u0027),"},{"line_number":421,"context_line":"                               self.ikepolicy(name\u003d\u0027ikepolicy3\u0027)"},{"line_number":422,"context_line":"                               ) as(ikepolicy1, ikepolicy2, ikepolicy3):"},{"line_number":423,"context_line":"            self._test_list_with_sort(\u0027ikepolicy\u0027, (ikepolicy3,"},{"line_number":424,"context_line":"                                                    ikepolicy2,"},{"line_number":425,"context_line":"                                                    ikepolicy1),"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fndg%3D","line":422,"in_reply_to":"AAAAP3%2F%2Fqnk%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        name \u003d \u0027ikepolicy1\u0027"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"        ikepolicy \u003d self.ikepolicy(name\u003dname, auth_algorithm\u003d\u0027md5\u0027)"},{"line_number":481,"context_line":"        self.assertRaises(webob.exc.HTTPClientError, ikepolicy.__enter__)"},{"line_number":482,"context_line":"        ikepolicy \u003d self.ikepolicy(name\u003dname, auth_algorithm\u003d200)"},{"line_number":483,"context_line":"        self.assertRaises(webob.exc.HTTPClientError, ikepolicy.__enter__)"},{"line_number":484,"context_line":"        ikepolicy \u003d self.ikepolicy(name\u003dname, encryption_algorithm\u003d\u0027des\u0027)"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fqnc%3D","line":481,"updated":"2013-07-14 21:56:10.000000000","message":"It is better to check the status code as other db tests do (and hopefully check the message)","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        name \u003d \u0027ikepolicy1\u0027"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"        ikepolicy \u003d self.ikepolicy(name\u003dname, auth_algorithm\u003d\u0027md5\u0027)"},{"line_number":481,"context_line":"        self.assertRaises(webob.exc.HTTPClientError, ikepolicy.__enter__)"},{"line_number":482,"context_line":"        ikepolicy \u003d self.ikepolicy(name\u003dname, auth_algorithm\u003d200)"},{"line_number":483,"context_line":"        self.assertRaises(webob.exc.HTTPClientError, ikepolicy.__enter__)"},{"line_number":484,"context_line":"        ikepolicy \u003d self.ikepolicy(name\u003dname, encryption_algorithm\u003d\u0027des\u0027)"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FnbI%3D","line":481,"in_reply_to":"AAAAP3%2F%2Fqnc%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":788,"context_line":"                                                       router\u003drouter)"},{"line_number":789,"context_line":"                                       ) as(vpnservice1,"},{"line_number":790,"context_line":"                                            vpnservice2,"},{"line_number":791,"context_line":"                                            vpnservice3):"},{"line_number":792,"context_line":"                    self._test_list_with_sort(\u0027vpnservice\u0027, (vpnservice3,"},{"line_number":793,"context_line":"                                                             vpnservice2,"},{"line_number":794,"context_line":"                                                             vpnservice1),"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FqnM%3D","line":791,"updated":"2013-07-14 21:56:10.000000000","message":"I think the following is easier to read:\n\nwith contextlib.nested(\n    self.vpnservice(....),\n    self.vpnservice(....),\n    self.vpnservice(....)\n) as (vpnservice1, vpnservice2, vpnservice3):\n    self._test_list_with_sort()","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":788,"context_line":"                                                       router\u003drouter)"},{"line_number":789,"context_line":"                                       ) as(vpnservice1,"},{"line_number":790,"context_line":"                                            vpnservice2,"},{"line_number":791,"context_line":"                                            vpnservice3):"},{"line_number":792,"context_line":"                    self._test_list_with_sort(\u0027vpnservice\u0027, (vpnservice3,"},{"line_number":793,"context_line":"                                                             vpnservice2,"},{"line_number":794,"context_line":"                                                             vpnservice1),"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2Fnd4%3D","line":791,"in_reply_to":"AAAAP3%2F%2FqnM%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":947,"context_line":"        with self.ikepolicy(name\u003dikename) as ikepolicy:"},{"line_number":948,"context_line":"            with self.ipsecpolicy(name\u003dipsecname) as ipsecpolicy:"},{"line_number":949,"context_line":"                with self.subnet(cidr\u003d\u002710.2.0.0/24\u0027) as subnet:"},{"line_number":950,"context_line":"                    with self.router() as router:"},{"line_number":951,"context_line":"                        with self.vpnservice(name\u003dvpnsname, subnet\u003dsubnet,"},{"line_number":952,"context_line":"                                             router\u003drouter) as vpnservice1:"},{"line_number":953,"context_line":"                            keys[\u0027vpnservice_id\u0027] \u003d ("}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FqnI%3D","line":950,"updated":"2013-07-14 21:56:10.000000000","message":"Deep nesting of with! ikepolicy, ipsecpolicy, subnet and router are independent, so we can use contextlib.nested for them. It reduces the nesting level.","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":947,"context_line":"        with self.ikepolicy(name\u003dikename) as ikepolicy:"},{"line_number":948,"context_line":"            with self.ipsecpolicy(name\u003dipsecname) as ipsecpolicy:"},{"line_number":949,"context_line":"                with self.subnet(cidr\u003d\u002710.2.0.0/24\u0027) as subnet:"},{"line_number":950,"context_line":"                    with self.router() as router:"},{"line_number":951,"context_line":"                        with self.vpnservice(name\u003dvpnsname, subnet\u003dsubnet,"},{"line_number":952,"context_line":"                                             router\u003drouter) as vpnservice1:"},{"line_number":953,"context_line":"                            keys[\u0027vpnservice_id\u0027] \u003d ("}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FnbE%3D","line":950,"in_reply_to":"AAAAP3%2F%2FqnI%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"51ad882290a4884dac86d1b4463bb0cfc302bb1a","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"DB_CORE_PLUGIN_KLASS \u003d \u0027neutron.db.db_base_plugin_v2.NeutronDbPluginV2\u0027"},{"line_number":41,"context_line":"DB_VPN_PLUGIN_KLASS \u003d \"neutron.services.vpn.plugin.VPNPlugin\""},{"line_number":42,"context_line":"ROOTDIR \u003d os.path.dirname(__file__) + \u0027../../../..\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"extensions_path \u003d \u0027:\u0027.join(neutron.extensions.__path__)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAP3%2F%2FohY%3D","line":42,"updated":"2013-07-15 17:53:38.000000000","message":"should normpath() be called to remove redundant separators, ..\u0027s, and use the correct path separator?","commit_id":"b76ba0455f3d9553daf93614a20e3f44af4878a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"DB_CORE_PLUGIN_KLASS \u003d \u0027neutron.db.db_base_plugin_v2.NeutronDbPluginV2\u0027"},{"line_number":41,"context_line":"DB_VPN_PLUGIN_KLASS \u003d \"neutron.services.vpn.plugin.VPNPlugin\""},{"line_number":42,"context_line":"ROOTDIR \u003d os.path.dirname(__file__) + \u0027../../../..\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"extensions_path \u003d \u0027:\u0027.join(neutron.extensions.__path__)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAP3%2F%2Fni8%3D","line":42,"in_reply_to":"AAAAP3%2F%2FohY%3D","updated":"2013-07-15 19:36:14.000000000","message":"Done","commit_id":"b76ba0455f3d9553daf93614a20e3f44af4878a3"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"51ad882290a4884dac86d1b4463bb0cfc302bb1a","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                          test_db_plugin.NeutronDbPluginV2TestCase):"},{"line_number":49,"context_line":"    resource_prefix_map \u003d dict("},{"line_number":50,"context_line":"        (k, constants.COMMON_PREFIXES[constants.VPN])"},{"line_number":51,"context_line":"        for k in vpnaas.RESOURCE_ATTRIBUTE_MAP.keys()"},{"line_number":52,"context_line":"    )"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def setUp(self, core_plugin\u003dNone, vpnaas_plugin\u003dNone):"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAP3%2F%2Fohw%3D","line":51,"updated":"2013-07-15 17:53:38.000000000","message":"The default access to the dictionary is to return the keys, so keys() is not needed.","commit_id":"b76ba0455f3d9553daf93614a20e3f44af4878a3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                          test_db_plugin.NeutronDbPluginV2TestCase):"},{"line_number":49,"context_line":"    resource_prefix_map \u003d dict("},{"line_number":50,"context_line":"        (k, constants.COMMON_PREFIXES[constants.VPN])"},{"line_number":51,"context_line":"        for k in vpnaas.RESOURCE_ATTRIBUTE_MAP.keys()"},{"line_number":52,"context_line":"    )"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def setUp(self, core_plugin\u003dNone, vpnaas_plugin\u003dNone):"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAP3%2F%2Fni4%3D","line":51,"in_reply_to":"AAAAP3%2F%2Fohw%3D","updated":"2013-07-15 19:36:14.000000000","message":"Done","commit_id":"b76ba0455f3d9553daf93614a20e3f44af4878a3"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":146,"context_line":"            yield ikepolicy"},{"line_number":147,"context_line":"        finally:"},{"line_number":148,"context_line":"            if not no_delete:"},{"line_number":149,"context_line":"                self._delete(\u0027ikepolicies\u0027, ikepolicy[\u0027ikepolicy\u0027][\u0027id\u0027])"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def _create_ipsecpolicy(self, fmt,"},{"line_number":152,"context_line":"                            name\u003d\u0027ipsecpolicy1\u0027,"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAQn%2F%2F3YE%3D","line":149,"updated":"2013-07-20 19:39:18.000000000","message":"If the try failed then ikepolicy will not have a value. (Currently the tests don\u0027t hit this condition, so you can leave it for now.) Same with ipsecpolicy, vpnservice and vpnconnection below.","commit_id":"1f378d3455761fe0a1688e06c6d64bf38253aa33"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":18,"context_line":"# @author: Swaminathan Vasudevan, Hewlett-Packard."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import contextlib"},{"line_number":21,"context_line":"import logging"},{"line_number":22,"context_line":"import os"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import webob.exc"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrPU%3D","line":21,"updated":"2013-07-25 10:36:35.000000000","message":"LOG below is not used so it is not needed.\n\nIn addition, if \"logging\" is required, openstack.common.log should be used instead of standard logging.\n\n   from neutron.openstack.common import log as logging","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":"# @author: Swaminathan Vasudevan, Hewlett-Packard."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import contextlib"},{"line_number":21,"context_line":"import logging"},{"line_number":22,"context_line":"import os"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import webob.exc"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FprI%3D","line":21,"in_reply_to":"AAAAQn%2F%2FrPU%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from neutron.api.extensions import PluginAwareExtensionManager"},{"line_number":28,"context_line":"from neutron.common import config"},{"line_number":29,"context_line":"from neutron.db import agentschedulers_db"},{"line_number":30,"context_line":"import neutron.extensions"},{"line_number":31,"context_line":"from neutron.extensions import vpnaas"},{"line_number":32,"context_line":"from neutron.plugins.common import constants"},{"line_number":33,"context_line":"from neutron.scheduler import l3_agent_scheduler"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrPQ%3D","line":30,"updated":"2013-07-25 10:36:35.000000000","message":"from neutron import extensions","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":27,"context_line":"from neutron.api.extensions import PluginAwareExtensionManager"},{"line_number":28,"context_line":"from neutron.common import config"},{"line_number":29,"context_line":"from neutron.db import agentschedulers_db"},{"line_number":30,"context_line":"import neutron.extensions"},{"line_number":31,"context_line":"from neutron.extensions import vpnaas"},{"line_number":32,"context_line":"from neutron.plugins.common import constants"},{"line_number":33,"context_line":"from neutron.scheduler import l3_agent_scheduler"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FprE%3D","line":30,"in_reply_to":"AAAAQn%2F%2FrPQ%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":35,"context_line":"from neutron.tests.unit import test_db_plugin"},{"line_number":36,"context_line":"from neutron.tests.unit import test_l3_plugin"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"DB_CORE_PLUGIN_KLASS \u003d \u0027neutron.db.db_base_plugin_v2.NeutronDbPluginV2\u0027"},{"line_number":41,"context_line":"DB_VPN_PLUGIN_KLASS \u003d \"neutron.services.vpn.plugin.VPNPlugin\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrIE%3D","line":38,"updated":"2013-07-25 10:36:35.000000000","message":"LOG is not used.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":35,"context_line":"from neutron.tests.unit import test_db_plugin"},{"line_number":36,"context_line":"from neutron.tests.unit import test_l3_plugin"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"DB_CORE_PLUGIN_KLASS \u003d \u0027neutron.db.db_base_plugin_v2.NeutronDbPluginV2\u0027"},{"line_number":41,"context_line":"DB_VPN_PLUGIN_KLASS \u003d \"neutron.services.vpn.plugin.VPNPlugin\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FprA%3D","line":38,"in_reply_to":"AAAAQn%2F%2FrIE%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":41,"context_line":"DB_VPN_PLUGIN_KLASS \u003d \"neutron.services.vpn.plugin.VPNPlugin\""},{"line_number":42,"context_line":"ROOTDIR \u003d os.path.normpath(os.path.join("},{"line_number":43,"context_line":"    os.path.dirname(__file__),"},{"line_number":44,"context_line":"    \u0027..\u0027, \u0027..\u0027, \u0027..\u0027, \u0027..\u0027))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"extensions_path \u003d \u0027:\u0027.join(neutron.extensions.__path__)"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrOw%3D","line":44,"updated":"2013-07-25 10:36:35.000000000","message":"\u0027../../../..\u0027 looks more readable to me, but it is up to you.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":41,"context_line":"DB_VPN_PLUGIN_KLASS \u003d \"neutron.services.vpn.plugin.VPNPlugin\""},{"line_number":42,"context_line":"ROOTDIR \u003d os.path.normpath(os.path.join("},{"line_number":43,"context_line":"    os.path.dirname(__file__),"},{"line_number":44,"context_line":"    \u0027..\u0027, \u0027..\u0027, \u0027..\u0027, \u0027..\u0027))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"extensions_path \u003d \u0027:\u0027.join(neutron.extensions.__path__)"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fo8U%3D","line":44,"in_reply_to":"AAAAQn%2F%2Fpqs%3D","updated":"2013-07-26 00:48:03.000000000","message":"Agree. The path should be platform-independent.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":"DB_VPN_PLUGIN_KLASS \u003d \"neutron.services.vpn.plugin.VPNPlugin\""},{"line_number":42,"context_line":"ROOTDIR \u003d os.path.normpath(os.path.join("},{"line_number":43,"context_line":"    os.path.dirname(__file__),"},{"line_number":44,"context_line":"    \u0027..\u0027, \u0027..\u0027, \u0027..\u0027, \u0027..\u0027))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"extensions_path \u003d \u0027:\u0027.join(neutron.extensions.__path__)"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fpqs%3D","line":44,"in_reply_to":"AAAAQn%2F%2FrOw%3D","updated":"2013-07-25 19:53:37.000000000","message":"I got this in another review. The reason here is \u0027/\u0027 is platform dependent. so Let\u0027s me keep this style","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class TestVpnCorePlugin(test_l3_plugin.TestL3NatPlugin,"},{"line_number":50,"context_line":"                        agentschedulers_db.L3AgentSchedulerDbMixin,"},{"line_number":51,"context_line":"                        agentschedulers_db.DhcpAgentSchedulerDbMixin):"},{"line_number":52,"context_line":"    def __init__(self, configfile\u003dNone):"},{"line_number":53,"context_line":"        super(TestVpnCorePlugin, self).__init__()"},{"line_number":54,"context_line":"        self.router_scheduler \u003d l3_agent_scheduler.ChanceScheduler()"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrOg%3D","line":51,"updated":"2013-07-25 10:36:35.000000000","message":"Why are agentscheduler extensions needed for VPNaaS tests?","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class TestVpnCorePlugin(test_l3_plugin.TestL3NatPlugin,"},{"line_number":50,"context_line":"                        agentschedulers_db.L3AgentSchedulerDbMixin,"},{"line_number":51,"context_line":"                        agentschedulers_db.DhcpAgentSchedulerDbMixin):"},{"line_number":52,"context_line":"    def __init__(self, configfile\u003dNone):"},{"line_number":53,"context_line":"        super(TestVpnCorePlugin, self).__init__()"},{"line_number":54,"context_line":"        self.router_scheduler \u003d l3_agent_scheduler.ChanceScheduler()"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fo70%3D","line":51,"in_reply_to":"AAAAQn%2F%2Fo8Q%3D","updated":"2013-07-26 00:50:44.000000000","message":"Agent scheduler support is used to know the host of the router.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class TestVpnCorePlugin(test_l3_plugin.TestL3NatPlugin,"},{"line_number":50,"context_line":"                        agentschedulers_db.L3AgentSchedulerDbMixin,"},{"line_number":51,"context_line":"                        agentschedulers_db.DhcpAgentSchedulerDbMixin):"},{"line_number":52,"context_line":"    def __init__(self, configfile\u003dNone):"},{"line_number":53,"context_line":"        super(TestVpnCorePlugin, self).__init__()"},{"line_number":54,"context_line":"        self.router_scheduler \u003d l3_agent_scheduler.ChanceScheduler()"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fo8Q%3D","line":51,"in_reply_to":"AAAAQn%2F%2Fpqk%3D","updated":"2013-07-26 00:48:03.000000000","message":"Is it related to l3-agent notifier? i think VPNaaS reference implementation works with l3-agent without agent scheduler support. That is the reason I  have a question.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class TestVpnCorePlugin(test_l3_plugin.TestL3NatPlugin,"},{"line_number":50,"context_line":"                        agentschedulers_db.L3AgentSchedulerDbMixin,"},{"line_number":51,"context_line":"                        agentschedulers_db.DhcpAgentSchedulerDbMixin):"},{"line_number":52,"context_line":"    def __init__(self, configfile\u003dNone):"},{"line_number":53,"context_line":"        super(TestVpnCorePlugin, self).__init__()"},{"line_number":54,"context_line":"        self.router_scheduler \u003d l3_agent_scheduler.ChanceScheduler()"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fpqk%3D","line":51,"in_reply_to":"AAAAQn%2F%2FrOg%3D","updated":"2013-07-25 19:53:37.000000000","message":"This will be needed to implement plugin which talk with driver.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        return ikepolicy_res"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def _api_for_resource(self, resource):"},{"line_number":120,"context_line":"        if resource in [\u0027networks\u0027, \u0027subnets\u0027, \u0027ports\u0027]:"},{"line_number":121,"context_line":"            return self.api"},{"line_number":122,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrOA%3D","line":119,"updated":"2013-07-25 10:36:35.000000000","message":"Why is it needed? It is same as one defined in test_db_plugin.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        return ikepolicy_res"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def _api_for_resource(self, resource):"},{"line_number":120,"context_line":"        if resource in [\u0027networks\u0027, \u0027subnets\u0027, \u0027ports\u0027]:"},{"line_number":121,"context_line":"            return self.api"},{"line_number":122,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fpqg%3D","line":119,"in_reply_to":"AAAAQn%2F%2FrOA%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":342,"context_line":"                                             ) as tmp_ikepolicy:"},{"line_number":343,"context_line":"                with test_db_plugin.optional_ctx(ipsecpolicy,"},{"line_number":344,"context_line":"                                                 self.ipsecpolicy"},{"line_number":345,"context_line":"                                                 ) as tmp_ipsecpolicy:"},{"line_number":346,"context_line":"                    vpnservice_id \u003d tmp_vpnservice[\u0027vpnservice\u0027][\u0027id\u0027]"},{"line_number":347,"context_line":"                    ikepolicy_id \u003d tmp_ikepolicy[\u0027ikepolicy\u0027][\u0027id\u0027]"},{"line_number":348,"context_line":"                    ipsecpolicy_id \u003d tmp_ipsecpolicy[\u0027ipsecpolicy\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrNs%3D","line":345,"updated":"2013-07-25 10:36:35.000000000","message":"Consider contextlib.nested to avoid a deep indentation.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":342,"context_line":"                                             ) as tmp_ikepolicy:"},{"line_number":343,"context_line":"                with test_db_plugin.optional_ctx(ipsecpolicy,"},{"line_number":344,"context_line":"                                                 self.ipsecpolicy"},{"line_number":345,"context_line":"                                                 ) as tmp_ipsecpolicy:"},{"line_number":346,"context_line":"                    vpnservice_id \u003d tmp_vpnservice[\u0027vpnservice\u0027][\u0027id\u0027]"},{"line_number":347,"context_line":"                    ikepolicy_id \u003d tmp_ikepolicy[\u0027ikepolicy\u0027][\u0027id\u0027]"},{"line_number":348,"context_line":"                    ipsecpolicy_id \u003d tmp_ipsecpolicy[\u0027ipsecpolicy\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FpqI%3D","line":345,"in_reply_to":"AAAAQn%2F%2FrNs%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":593,"context_line":"            for k, v in keys:"},{"line_number":594,"context_line":"                self.assertEqual(ipsecpolicy[\u0027ipsecpolicy\u0027][k], v)"},{"line_number":595,"context_line":"            for k, v in lifetime.iteritems():"},{"line_number":596,"context_line":"                self.assertEqual(ipsecpolicy[\u0027ipsecpolicy\u0027][\u0027lifetime\u0027][k], v)"},{"line_number":597,"context_line":""},{"line_number":598,"context_line":"    def test_delete_ipsecpolicy(self):"},{"line_number":599,"context_line":"        \"\"\"Test case to delete an ipsecpolicy.\"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrLo%3D","line":596,"updated":"2013-07-25 10:36:35.000000000","message":"It is better to make L.593-596 a method.\n\n   check_ipsecpolicy(ipsecpolicy[\u0027ipsecpolicy\u0027], keys, lifetime)\n\nIf so, we can also use this method in L.624 and L.647","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":593,"context_line":"            for k, v in keys:"},{"line_number":594,"context_line":"                self.assertEqual(ipsecpolicy[\u0027ipsecpolicy\u0027][k], v)"},{"line_number":595,"context_line":"            for k, v in lifetime.iteritems():"},{"line_number":596,"context_line":"                self.assertEqual(ipsecpolicy[\u0027ipsecpolicy\u0027][\u0027lifetime\u0027][k], v)"},{"line_number":597,"context_line":""},{"line_number":598,"context_line":"    def test_delete_ipsecpolicy(self):"},{"line_number":599,"context_line":"        \"\"\"Test case to delete an ipsecpolicy.\"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fppo%3D","line":596,"in_reply_to":"AAAAQn%2F%2FrLo%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":624,"context_line":"            for k, v in keys:"},{"line_number":625,"context_line":"                self.assertEqual(res[\u0027ipsecpolicy\u0027][k], v)"},{"line_number":626,"context_line":"            for k, v in lifetime.iteritems():"},{"line_number":627,"context_line":"                self.assertEqual(res[\u0027ipsecpolicy\u0027][\u0027lifetime\u0027][k], v)"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"    def test_list_ipsecpolicies(self):"},{"line_number":630,"context_line":"        \"\"\"Test case to list all ipsecpolicies.\"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrLg%3D","line":627,"updated":"2013-07-25 10:36:35.000000000","message":"See the comment at L.596.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":624,"context_line":"            for k, v in keys:"},{"line_number":625,"context_line":"                self.assertEqual(res[\u0027ipsecpolicy\u0027][k], v)"},{"line_number":626,"context_line":"            for k, v in lifetime.iteritems():"},{"line_number":627,"context_line":"                self.assertEqual(res[\u0027ipsecpolicy\u0027][\u0027lifetime\u0027][k], v)"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"    def test_list_ipsecpolicies(self):"},{"line_number":630,"context_line":"        \"\"\"Test case to list all ipsecpolicies.\"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FppE%3D","line":627,"in_reply_to":"AAAAQn%2F%2FrLg%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":647,"context_line":"            for k, v in keys:"},{"line_number":648,"context_line":"                self.assertEqual(res[\u0027ipsecpolicies\u0027][0][k], v)"},{"line_number":649,"context_line":"            for k, v in lifetime.iteritems():"},{"line_number":650,"context_line":"                self.assertEqual(res[\u0027ipsecpolicies\u0027][0][\u0027lifetime\u0027][k], v)"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"    def test_list_ipsecpolicies_with_sort_emulated(self):"},{"line_number":653,"context_line":"        \"\"\"Test case to list all ipsecpolicies.\"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrLc%3D","line":650,"updated":"2013-07-25 10:36:35.000000000","message":"See the comment at L.596.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":647,"context_line":"            for k, v in keys:"},{"line_number":648,"context_line":"                self.assertEqual(res[\u0027ipsecpolicies\u0027][0][k], v)"},{"line_number":649,"context_line":"            for k, v in lifetime.iteritems():"},{"line_number":650,"context_line":"                self.assertEqual(res[\u0027ipsecpolicies\u0027][0][\u0027lifetime\u0027][k], v)"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"    def test_list_ipsecpolicies_with_sort_emulated(self):"},{"line_number":653,"context_line":"        \"\"\"Test case to list all ipsecpolicies.\"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FppA%3D","line":650,"in_reply_to":"AAAAQn%2F%2FrLc%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":962,"context_line":"        with self.ikepolicy(name\u003dikename) as ikepolicy:"},{"line_number":963,"context_line":"            with self.ipsecpolicy(name\u003dipsecname) as ipsecpolicy:"},{"line_number":964,"context_line":"                with self.subnet() as subnet:"},{"line_number":965,"context_line":"                    with self.router() as router:"},{"line_number":966,"context_line":"                        with self.vpnservice(name\u003dvpnsname, subnet\u003dsubnet,"},{"line_number":967,"context_line":"                                             router\u003drouter) as vpnservice1:"},{"line_number":968,"context_line":"                            keys[\u0027ikepolicy_id\u0027] \u003d ikepolicy[\u0027ikepolicy\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrMU%3D","line":965,"updated":"2013-07-25 10:36:35.000000000","message":"Please consider using contextlib.nested for L.962-965.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":962,"context_line":"        with self.ikepolicy(name\u003dikename) as ikepolicy:"},{"line_number":963,"context_line":"            with self.ipsecpolicy(name\u003dipsecname) as ipsecpolicy:"},{"line_number":964,"context_line":"                with self.subnet() as subnet:"},{"line_number":965,"context_line":"                    with self.router() as router:"},{"line_number":966,"context_line":"                        with self.vpnservice(name\u003dvpnsname, subnet\u003dsubnet,"},{"line_number":967,"context_line":"                                             router\u003drouter) as vpnservice1:"},{"line_number":968,"context_line":"                            keys[\u0027ikepolicy_id\u0027] \u003d ikepolicy[\u0027ikepolicy\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FpoE%3D","line":965,"in_reply_to":"AAAAQn%2F%2FrMU%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":1001,"context_line":"                                         in ipsec_site_connection["},{"line_number":1002,"context_line":"                                             \u0027ipsec_site_connection\u0027]["},{"line_number":1003,"context_line":"                                                 \u0027dpd\u0027].items()"},{"line_number":1004,"context_line":"                                         if k in dpd), dpd)"},{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"    def test_delete_ipsec_site_connection(self):"},{"line_number":1007,"context_line":"        \"\"\"Test case to delete a ipsec_site_connection.\"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrLA%3D","line":1004,"updated":"2013-07-25 10:36:35.000000000","message":"it is better to make the check logic L.994-1004 a method. There is the same logic in several places.\n  self.check_ipsec_site_connection(ipsec_site_connection[\u0027ipsec_site_connection\u0027], keys, dpd)","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":1001,"context_line":"                                         in ipsec_site_connection["},{"line_number":1002,"context_line":"                                             \u0027ipsec_site_connection\u0027]["},{"line_number":1003,"context_line":"                                                 \u0027dpd\u0027].items()"},{"line_number":1004,"context_line":"                                         if k in dpd), dpd)"},{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"    def test_delete_ipsec_site_connection(self):"},{"line_number":1007,"context_line":"        \"\"\"Test case to delete a ipsec_site_connection.\"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FpnU%3D","line":1004,"in_reply_to":"AAAAQn%2F%2FrLA%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":1081,"context_line":"                        req.get_response(self.ext_api)"},{"line_number":1082,"context_line":"                    )"},{"line_number":1083,"context_line":"                    for k, v in keys.items():"},{"line_number":1084,"context_line":"                        self.assertEqual(res[\u0027ipsec_site_connection\u0027][k], v)"},{"line_number":1085,"context_line":""},{"line_number":1086,"context_line":"    def test_update_ipsec_site_connection_peer_cidrs(self):"},{"line_number":1087,"context_line":"        \"\"\"Test case to update a ipsec_site_connection for peer_cidrs.\"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrK8%3D","line":1084,"updated":"2013-07-25 10:36:35.000000000","message":"\"dpd\" is not checked. Also see the comment at L.1004.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":1081,"context_line":"                        req.get_response(self.ext_api)"},{"line_number":1082,"context_line":"                    )"},{"line_number":1083,"context_line":"                    for k, v in keys.items():"},{"line_number":1084,"context_line":"                        self.assertEqual(res[\u0027ipsec_site_connection\u0027][k], v)"},{"line_number":1085,"context_line":""},{"line_number":1086,"context_line":"    def test_update_ipsec_site_connection_peer_cidrs(self):"},{"line_number":1087,"context_line":"        \"\"\"Test case to update a ipsec_site_connection for peer_cidrs.\"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FpnQ%3D","line":1084,"in_reply_to":"AAAAQn%2F%2FrK8%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":1107,"context_line":"        with self.ikepolicy(name\u003dikename) as ikepolicy:"},{"line_number":1108,"context_line":"            with self.ipsecpolicy(name\u003dipsecname) as ipsecpolicy:"},{"line_number":1109,"context_line":"                with self.subnet(cidr\u003d\u002710.2.0.0/24\u0027) as subnet:"},{"line_number":1110,"context_line":"                    with self.router() as router:"},{"line_number":1111,"context_line":"                        with self.vpnservice(name\u003dvpnsname, subnet\u003dsubnet,"},{"line_number":1112,"context_line":"                                             router\u003drouter) as vpnservice1:"},{"line_number":1113,"context_line":"                            keys[\u0027vpnservice_id\u0027] \u003d ("}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrK0%3D","line":1110,"updated":"2013-07-25 10:36:35.000000000","message":"Please consider using contextlib.nested for the above 4 lines.\n\nIf so, we can fold the lines below beginning with \"keys\" into one line.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":1107,"context_line":"        with self.ikepolicy(name\u003dikename) as ikepolicy:"},{"line_number":1108,"context_line":"            with self.ipsecpolicy(name\u003dipsecname) as ipsecpolicy:"},{"line_number":1109,"context_line":"                with self.subnet(cidr\u003d\u002710.2.0.0/24\u0027) as subnet:"},{"line_number":1110,"context_line":"                    with self.router() as router:"},{"line_number":1111,"context_line":"                        with self.vpnservice(name\u003dvpnsname, subnet\u003dsubnet,"},{"line_number":1112,"context_line":"                                             router\u003drouter) as vpnservice1:"},{"line_number":1113,"context_line":"                            keys[\u0027vpnservice_id\u0027] \u003d ("}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FpmY%3D","line":1110,"in_reply_to":"AAAAQn%2F%2FrK0%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":1153,"context_line":"                                )"},{"line_number":1154,"context_line":"                                for k, v in keys.items():"},{"line_number":1155,"context_line":"                                    self.assertEqual("},{"line_number":1156,"context_line":"                                        res[\u0027ipsec_site_connection\u0027][k], v)"},{"line_number":1157,"context_line":""},{"line_number":1158,"context_line":"    def test_show_ipsec_site_connection(self):"},{"line_number":1159,"context_line":"        \"\"\"Test case to show a ipsec_site_connection.\"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrKo%3D","line":1156,"updated":"2013-07-25 10:36:35.000000000","message":"\"dpd\" is not checked. Also see the comment at L.1004.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":1153,"context_line":"                                )"},{"line_number":1154,"context_line":"                                for k, v in keys.items():"},{"line_number":1155,"context_line":"                                    self.assertEqual("},{"line_number":1156,"context_line":"                                        res[\u0027ipsec_site_connection\u0027][k], v)"},{"line_number":1157,"context_line":""},{"line_number":1158,"context_line":"    def test_show_ipsec_site_connection(self):"},{"line_number":1159,"context_line":"        \"\"\"Test case to show a ipsec_site_connection.\"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FpmA%3D","line":1156,"in_reply_to":"AAAAQn%2F%2FrKo%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":1179,"context_line":"        with self.ikepolicy(name\u003dikename) as ikepolicy:"},{"line_number":1180,"context_line":"            with self.ipsecpolicy(name\u003dipsecname) as ipsecpolicy:"},{"line_number":1181,"context_line":"                with self.subnet() as subnet:"},{"line_number":1182,"context_line":"                    with self.router() as router:"},{"line_number":1183,"context_line":"                        with self.vpnservice(name\u003dvpnsname, subnet\u003dsubnet,"},{"line_number":1184,"context_line":"                                             router\u003drouter) as vpnservice1:"},{"line_number":1185,"context_line":"                            keys[\u0027ikepolicy_id\u0027] \u003d ikepolicy[\u0027ikepolicy\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrKg%3D","line":1182,"updated":"2013-07-25 10:36:35.000000000","message":"Same comment as for the previous method.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":1179,"context_line":"        with self.ikepolicy(name\u003dikename) as ikepolicy:"},{"line_number":1180,"context_line":"            with self.ipsecpolicy(name\u003dipsecname) as ipsecpolicy:"},{"line_number":1181,"context_line":"                with self.subnet() as subnet:"},{"line_number":1182,"context_line":"                    with self.router() as router:"},{"line_number":1183,"context_line":"                        with self.vpnservice(name\u003dvpnsname, subnet\u003dsubnet,"},{"line_number":1184,"context_line":"                                             router\u003drouter) as vpnservice1:"},{"line_number":1185,"context_line":"                            keys[\u0027ikepolicy_id\u0027] \u003d ikepolicy[\u0027ikepolicy\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fplw%3D","line":1182,"in_reply_to":"AAAAQn%2F%2FrKg%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":1226,"context_line":"                                self.assertEqual("},{"line_number":1227,"context_line":"                                    dict((k, v) for k, v in res["},{"line_number":1228,"context_line":"                                        \u0027ipsec_site_connection\u0027][\u0027dpd\u0027].items()"},{"line_number":1229,"context_line":"                                        if k in dpd), dpd)"},{"line_number":1230,"context_line":""},{"line_number":1231,"context_line":"    def test_list_ipsec_site_connections_with_sort_emulated(self):"},{"line_number":1232,"context_line":"        \"\"\"Test case to list all ipsec_site_connections with sort.\"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrKQ%3D","line":1229,"updated":"2013-07-25 10:36:35.000000000","message":"Same comment as the comment at L.1004.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":1226,"context_line":"                                self.assertEqual("},{"line_number":1227,"context_line":"                                    dict((k, v) for k, v in res["},{"line_number":1228,"context_line":"                                        \u0027ipsec_site_connection\u0027][\u0027dpd\u0027].items()"},{"line_number":1229,"context_line":"                                        if k in dpd), dpd)"},{"line_number":1230,"context_line":""},{"line_number":1231,"context_line":"    def test_list_ipsec_site_connections_with_sort_emulated(self):"},{"line_number":1232,"context_line":"        \"\"\"Test case to list all ipsec_site_connections with sort.\"\"\""}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fpls%3D","line":1229,"in_reply_to":"AAAAQn%2F%2FrKQ%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":1320,"context_line":"        name1 \u003d \"ipsec_site_connection1\""},{"line_number":1321,"context_line":"        with self.ikepolicy(name\u003dike_name) as ikepolicy:"},{"line_number":1322,"context_line":"            with self.ipsecpolicy(name\u003dipsec_name) as ipsecpolicy:"},{"line_number":1323,"context_line":"                with self.vpnservice(name\u003dvpns_name) as vpnservice:"},{"line_number":1324,"context_line":"                    vpnservice_id \u003d vpnservice[\u0027vpnservice\u0027][\u0027id\u0027]"},{"line_number":1325,"context_line":"                    ikepolicy_id \u003d ikepolicy[\u0027ikepolicy\u0027][\u0027id\u0027]"},{"line_number":1326,"context_line":"                    ipsecpolicy_id \u003d ipsecpolicy[\u0027ipsecpolicy\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrKE%3D","line":1323,"updated":"2013-07-25 10:36:35.000000000","message":"Consider contextlib.nested for L.1321-1323.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":1320,"context_line":"        name1 \u003d \"ipsec_site_connection1\""},{"line_number":1321,"context_line":"        with self.ikepolicy(name\u003dike_name) as ikepolicy:"},{"line_number":1322,"context_line":"            with self.ipsecpolicy(name\u003dipsec_name) as ipsecpolicy:"},{"line_number":1323,"context_line":"                with self.vpnservice(name\u003dvpns_name) as vpnservice:"},{"line_number":1324,"context_line":"                    vpnservice_id \u003d vpnservice[\u0027vpnservice\u0027][\u0027id\u0027]"},{"line_number":1325,"context_line":"                    ikepolicy_id \u003d ikepolicy[\u0027ikepolicy\u0027][\u0027id\u0027]"},{"line_number":1326,"context_line":"                    ipsecpolicy_id \u003d ipsecpolicy[\u0027ipsecpolicy\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fplg%3D","line":1323,"in_reply_to":"AAAAQn%2F%2FrKE%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":1387,"context_line":"        with self.ikepolicy(name\u003dike_name) as ikepolicy:"},{"line_number":1388,"context_line":"            with self.ipsecpolicy(name\u003dipsec_name) as ipsecpolicy:"},{"line_number":1389,"context_line":"                with self.vpnservice(name\u003dvpns_name) as vpnservice:"},{"line_number":1390,"context_line":"                    # Add two connections"},{"line_number":1391,"context_line":"                    with self.ipsec_site_connection("},{"line_number":1392,"context_line":"                        self.fmt,"},{"line_number":1393,"context_line":"                        name1,"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrIs%3D","line":1390,"updated":"2013-07-25 10:36:35.000000000","message":"It looks unnecessary.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":1387,"context_line":"        with self.ikepolicy(name\u003dike_name) as ikepolicy:"},{"line_number":1388,"context_line":"            with self.ipsecpolicy(name\u003dipsec_name) as ipsecpolicy:"},{"line_number":1389,"context_line":"                with self.vpnservice(name\u003dvpns_name) as vpnservice:"},{"line_number":1390,"context_line":"                    # Add two connections"},{"line_number":1391,"context_line":"                    with self.ipsec_site_connection("},{"line_number":1392,"context_line":"                        self.fmt,"},{"line_number":1393,"context_line":"                        name1,"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2Fplc%3D","line":1390,"in_reply_to":"AAAAQn%2F%2FrIs%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"81f5dd133c403c0263cc6cdeada1884e198cfa58","unresolved":false,"context_lines":[{"line_number":1423,"context_line":"        with self.ikepolicy(name\u003dike_name) as ikepolicy:"},{"line_number":1424,"context_line":"            with self.ipsecpolicy(name\u003dipsec_name) as ipsecpolicy:"},{"line_number":1425,"context_line":"                with self.vpnservice(name\u003dvpns_name) as vpnservice:"},{"line_number":1426,"context_line":"                    # Add two connections"},{"line_number":1427,"context_line":"                    with self.ipsec_site_connection("},{"line_number":1428,"context_line":"                        self.fmt,"},{"line_number":1429,"context_line":"                        name1,"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FrJw%3D","line":1426,"updated":"2013-07-25 10:36:35.000000000","message":"It looks unnecessary.","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":1423,"context_line":"        with self.ikepolicy(name\u003dike_name) as ikepolicy:"},{"line_number":1424,"context_line":"            with self.ipsecpolicy(name\u003dipsec_name) as ipsecpolicy:"},{"line_number":1425,"context_line":"                with self.vpnservice(name\u003dvpns_name) as vpnservice:"},{"line_number":1426,"context_line":"                    # Add two connections"},{"line_number":1427,"context_line":"                    with self.ipsec_site_connection("},{"line_number":1428,"context_line":"                        self.fmt,"},{"line_number":1429,"context_line":"                        name1,"}],"source_content_type":"text/x-python","patch_set":47,"id":"AAAAQn%2F%2FplM%3D","line":1426,"in_reply_to":"AAAAQn%2F%2FrJw%3D","updated":"2013-07-25 19:53:37.000000000","message":"Done","commit_id":"d0d176157ae465000e64e09a37812476254e300c"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self.plugin \u003d vpn_plugin.VPNPlugin()"},{"line_number":74,"context_line":"        ext_mgr \u003d PluginAwareExtensionManager("},{"line_number":75,"context_line":"            extensions_path,"},{"line_number":76,"context_line":"            {constants.CORE: self.core_plugin,"},{"line_number":77,"context_line":"             constants.VPN: self.plugin}"},{"line_number":78,"context_line":"        )"},{"line_number":79,"context_line":"        app \u003d config.load_paste_app(\u0027extensions_test_app\u0027)"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAQn%2F%2FmGQ%3D","line":76,"updated":"2013-07-26 21:42:32.000000000","message":"Test start failing weirdly if we remove the core plugin from here, but other test cases such as firewall does not pass it to the extension manager.\nany clue?","commit_id":"f4128e0a6d709796d775ec3a5aabc50c7716fee6"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self.plugin \u003d vpn_plugin.VPNPlugin()"},{"line_number":74,"context_line":"        ext_mgr \u003d PluginAwareExtensionManager("},{"line_number":75,"context_line":"            extensions_path,"},{"line_number":76,"context_line":"            {constants.CORE: self.core_plugin,"},{"line_number":77,"context_line":"             constants.VPN: self.plugin}"},{"line_number":78,"context_line":"        )"},{"line_number":79,"context_line":"        app \u003d config.load_paste_app(\u0027extensions_test_app\u0027)"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAAQn%2F%2FmBk%3D","line":76,"in_reply_to":"AAAAQn%2F%2FmGQ%3D","updated":"2013-07-26 22:08:00.000000000","message":"This is because VPN service plugin is using router informations.\nso we need core plugin reference here.","commit_id":"f4128e0a6d709796d775ec3a5aabc50c7716fee6"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"unresolved":false,"context_lines":[{"line_number":784,"context_line":"        \"\"\"Test case to update a vpnservice.\"\"\""},{"line_number":785,"context_line":"        name \u003d \u0027new_vpnservice1\u0027"},{"line_number":786,"context_line":"        keys \u003d [(\u0027name\u0027, name)]"},{"line_number":787,"context_line":"        with self.subnet(cidr\u003d\u002710.2.0.0/24\u0027) as subnet:"},{"line_number":788,"context_line":"            with self.router() as router:"},{"line_number":789,"context_line":"                with self.vpnservice(name\u003dname,"},{"line_number":790,"context_line":"                                     subnet\u003dsubnet,"}],"source_content_type":"text/x-python","patch_set":49,"id":"AAAAQn%2F%2FjZQ%3D","line":787,"updated":"2013-07-29 11:50:10.000000000","message":"Could use nested with?\n\nHere and 813-815.","commit_id":"c493f25e8b167056f2587ce8be1081f416800584"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"unresolved":false,"context_lines":[{"line_number":807,"context_line":"                        self.assertEqual(res[\u0027vpnservice\u0027][k], v)"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"    def test_update_vpnservice_with_invalid_state(self):"},{"line_number":810,"context_line":"        \"\"\"Test case to update a vpnservice.\"\"\""},{"line_number":811,"context_line":"        name \u003d \u0027new_vpnservice1\u0027"},{"line_number":812,"context_line":"        keys \u003d [(\u0027name\u0027, name)]"},{"line_number":813,"context_line":"        with self.subnet(cidr\u003d\u002710.2.0.0/24\u0027) as subnet:"}],"source_content_type":"text/x-python","patch_set":49,"id":"AAAAQn%2F%2FjZg%3D","line":810,"updated":"2013-07-29 11:50:10.000000000","message":"Docstring should be more descriptive (duplicate of previous).","commit_id":"c493f25e8b167056f2587ce8be1081f416800584"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"unresolved":false,"context_lines":[{"line_number":1111,"context_line":"                        self.assertEqual(res[\u0027ipsec_site_connection\u0027][k], v)"},{"line_number":1112,"context_line":""},{"line_number":1113,"context_line":"    def test_update_ipsec_site_connection_with_invalid_state(self):"},{"line_number":1114,"context_line":"        \"\"\"Test case to update a ipsec_site_connection.\"\"\""},{"line_number":1115,"context_line":"        name \u003d \u0027new_ipsec_site_connection\u0027"},{"line_number":1116,"context_line":"        ikename \u003d \u0027ikepolicy1\u0027"},{"line_number":1117,"context_line":"        ipsecname \u003d \u0027ipsecpolicy1\u0027"}],"source_content_type":"text/x-python","patch_set":49,"id":"AAAAQn%2F%2FjY8%3D","line":1114,"updated":"2013-07-29 11:50:10.000000000","message":"More descriptive docstring.","commit_id":"c493f25e8b167056f2587ce8be1081f416800584"}],"neutron/tests/unit/services/vpn/test_vpnaas_extension.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":423,"context_line":"    def _test_entity_delete(self, entity):"},{"line_number":424,"context_line":"        \"\"\"does the entity deletion based on naming convention.\"\"\""},{"line_number":425,"context_line":"        entity_id \u003d _uuid()"},{"line_number":426,"context_line":"        if(entity \u003d\u003d \u0027ipsecpolicy\u0027):"},{"line_number":427,"context_line":"            res \u003d self.api.delete(_get_path(\u0027vpn/\u0027 + \u0027ipsecpolicies\u0027,"},{"line_number":428,"context_line":"                                            id\u003dentity_id,"},{"line_number":429,"context_line":"                                            fmt\u003dself.fmt))"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAQn%2F%2F3X4%3D","line":426,"updated":"2013-07-20 19:39:18.000000000","message":"Space after if, and parentheses not needed.","commit_id":"1f378d3455761fe0a1688e06c6d64bf38253aa33"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":427,"context_line":"            res \u003d self.api.delete(_get_path(\u0027vpn/\u0027 + \u0027ipsecpolicies\u0027,"},{"line_number":428,"context_line":"                                            id\u003dentity_id,"},{"line_number":429,"context_line":"                                            fmt\u003dself.fmt))"},{"line_number":430,"context_line":"        elif(entity \u003d\u003d \u0027ikepolicy\u0027):"},{"line_number":431,"context_line":"            res \u003d self.api.delete(_get_path(\u0027vpn/\u0027 + \u0027ikepolicies\u0027,"},{"line_number":432,"context_line":"                                            id\u003dentity_id,"},{"line_number":433,"context_line":"                                            fmt\u003dself.fmt))"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAQn%2F%2F3X0%3D","line":430,"updated":"2013-07-20 19:39:18.000000000","message":"Space, no parentheses.","commit_id":"1f378d3455761fe0a1688e06c6d64bf38253aa33"}],"neutron/tests/unit/test_attributes.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"unresolved":false,"context_lines":[{"line_number":422,"context_line":"    def test_validate_subnet_list(self):"},{"line_number":423,"context_line":"        data \u003d None"},{"line_number":424,"context_line":"        msg \u003d attributes._validate_subnet_list(data)"},{"line_number":425,"context_line":"        error \u003d _(\"\u0027%s\u0027 is not a list\") % data"},{"line_number":426,"context_line":"        self.assertEqual(error, msg)"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"        data \u003d [\"192.168.1.1/24\", \"192.168.1.1/24\", \"10.0.0.0/24\"]"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAQn%2F%2F6I8%3D","line":425,"updated":"2013-07-19 12:21:59.000000000","message":"Nit: could name this expected_error","commit_id":"1f378d3455761fe0a1688e06c6d64bf38253aa33"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"unresolved":false,"context_lines":[{"line_number":422,"context_line":"    def test_validate_subnet_list(self):"},{"line_number":423,"context_line":"        data \u003d None"},{"line_number":424,"context_line":"        msg \u003d attributes._validate_subnet_list(data)"},{"line_number":425,"context_line":"        error \u003d _(\"\u0027%s\u0027 is not a list\") % data"},{"line_number":426,"context_line":"        self.assertEqual(error, msg)"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"        data \u003d [\"192.168.1.1/24\", \"192.168.1.1/24\", \"10.0.0.0/24\"]"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAQn%2F%2F1uk%3D","line":425,"in_reply_to":"AAAAQn%2F%2F4yY%3D","updated":"2013-07-22 13:06:49.000000000","message":"Would suggest renaming all occurrences of name.","commit_id":"1f378d3455761fe0a1688e06c6d64bf38253aa33"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":422,"context_line":"    def test_validate_subnet_list(self):"},{"line_number":423,"context_line":"        data \u003d None"},{"line_number":424,"context_line":"        msg \u003d attributes._validate_subnet_list(data)"},{"line_number":425,"context_line":"        error \u003d _(\"\u0027%s\u0027 is not a list\") % data"},{"line_number":426,"context_line":"        self.assertEqual(error, msg)"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"        data \u003d [\"192.168.1.1/24\", \"192.168.1.1/24\", \"10.0.0.0/24\"]"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAQn%2F%2F4yY%3D","line":425,"in_reply_to":"AAAAQn%2F%2F6I8%3D","updated":"2013-07-19 19:30:19.000000000","message":"I like the name, but it is good to keep same naming in this test","commit_id":"1f378d3455761fe0a1688e06c6d64bf38253aa33"}],"neutron/tests/unit/test_db_plugin.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":574,"context_line":"        for key, direction in sorts:"},{"line_number":575,"context_line":"            query_str \u003d query_str + \"\u0026sort_key\u003d%s\u0026sort_dir\u003d%s\" % (key,"},{"line_number":576,"context_line":"                                                                  direction)"},{"line_number":577,"context_line":"        if(collection \u003d\u003d \u0027ikepolicy\u0027):"},{"line_number":578,"context_line":"            req \u003d self.new_list_request(\u0027ikepolicies\u0027,"},{"line_number":579,"context_line":"                                        params\u003dquery_str)"},{"line_number":580,"context_line":"            api \u003d self._api_for_resource(\u0027ikepolicies\u0027)"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FucA%3D","line":577,"updated":"2013-07-12 11:24:37.000000000","message":"this test module should not have any knowledge of extension.\n\nconsider passing the plural form as an additional, optional parameter.\n\nThis might allow you to remove all the vpn-specific stuff from this method.","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":574,"context_line":"        for key, direction in sorts:"},{"line_number":575,"context_line":"            query_str \u003d query_str + \"\u0026sort_key\u003d%s\u0026sort_dir\u003d%s\" % (key,"},{"line_number":576,"context_line":"                                                                  direction)"},{"line_number":577,"context_line":"        if(collection \u003d\u003d \u0027ikepolicy\u0027):"},{"line_number":578,"context_line":"            req \u003d self.new_list_request(\u0027ikepolicies\u0027,"},{"line_number":579,"context_line":"                                        params\u003dquery_str)"},{"line_number":580,"context_line":"            api \u003d self._api_for_resource(\u0027ikepolicies\u0027)"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnLA%3D","line":577,"in_reply_to":"AAAAP3%2F%2FucA%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"62a8754632e52f2e19b6db63853e3c847018b5b3","unresolved":false,"context_lines":[{"line_number":674,"context_line":"            resources \u003d \u0027ikepolicies\u0027"},{"line_number":675,"context_line":"        elif(collection \u003d\u003d \u0027ipsecpolicy\u0027):"},{"line_number":676,"context_line":"            resources \u003d \u0027ipsecpolicies\u0027"},{"line_number":677,"context_line":"        else:"},{"line_number":678,"context_line":"            resources \u003d \u0027%ss\u0027 % collection"},{"line_number":679,"context_line":"        collection \u003d collection.replace(\u0027-\u0027, \u0027_\u0027)"},{"line_number":680,"context_line":"        api \u003d self._api_for_resource(resources)"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2Fub0%3D","line":677,"updated":"2013-07-12 11:24:37.000000000","message":"some comment as above.","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":674,"context_line":"            resources \u003d \u0027ikepolicies\u0027"},{"line_number":675,"context_line":"        elif(collection \u003d\u003d \u0027ipsecpolicy\u0027):"},{"line_number":676,"context_line":"            resources \u003d \u0027ipsecpolicies\u0027"},{"line_number":677,"context_line":"        else:"},{"line_number":678,"context_line":"            resources \u003d \u0027%ss\u0027 % collection"},{"line_number":679,"context_line":"        collection \u003d collection.replace(\u0027-\u0027, \u0027_\u0027)"},{"line_number":680,"context_line":"        api \u003d self._api_for_resource(resources)"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAP3%2F%2FnK8%3D","line":677,"in_reply_to":"AAAAP3%2F%2Fub0%3D","updated":"2013-07-15 20:52:19.000000000","message":"Done","commit_id":"fe164f9aad323261bef0083f387f01c65b47d2ab"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"814c28635d89d9625cf6966c958f86de6e8e6793","unresolved":false,"context_lines":[{"line_number":570,"context_line":"                    self._delete(\u0027ports\u0027, port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"    def _test_list_with_sort(self, collection,"},{"line_number":573,"context_line":"                             items, sorts, resources\u003dNone, query_params\u003d\u0027\u0027):"},{"line_number":574,"context_line":"        query_str \u003d query_params"},{"line_number":575,"context_line":"        for key, direction in sorts:"},{"line_number":576,"context_line":"            query_str \u003d query_str + \"\u0026sort_key\u003d%s\u0026sort_dir\u003d%s\" % (key,"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FqoM%3D","line":573,"updated":"2013-07-14 21:56:10.000000000","message":"In general, \"collection\" and \"resources\" are used in the same meaning. Both of them represent a plural form. And a single form (i.e., resoruce name) is actually passed to the first argument \"collection\".\n\nIMO, it is better to change the first argument \"collection\" to \"resource\" and then \"resources\" should be \"collection\" to avoid the future confusion.","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"31d356bd1035c43f2ce69714ee6b46d5f0c0f330","unresolved":false,"context_lines":[{"line_number":570,"context_line":"                    self._delete(\u0027ports\u0027, port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"    def _test_list_with_sort(self, collection,"},{"line_number":573,"context_line":"                             items, sorts, resources\u003dNone, query_params\u003d\u0027\u0027):"},{"line_number":574,"context_line":"        query_str \u003d query_params"},{"line_number":575,"context_line":"        for key, direction in sorts:"},{"line_number":576,"context_line":"            query_str \u003d query_str + \"\u0026sort_key\u003d%s\u0026sort_dir\u003d%s\" % (key,"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAP3%2F%2FnUM%3D","line":573,"in_reply_to":"AAAAP3%2F%2FqoM%3D","updated":"2013-07-15 20:29:28.000000000","message":"Done","commit_id":"c2f50c36aec1972ba1948da876dd3c3832a5c008"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"unresolved":false,"context_lines":[{"line_number":1718,"context_line":""},{"line_number":1719,"context_line":"                self.assertEqual(q.count(), 1)"},{"line_number":1720,"context_line":""},{"line_number":1721,"context_line":"    def test_recycle_ip_address_without_allocation_pool(self):"},{"line_number":1722,"context_line":"        plugin \u003d NeutronManager.get_plugin()"},{"line_number":1723,"context_line":"        allocation_pools \u003d [{\"start\": \u002710.0.0.10\u0027,"},{"line_number":1724,"context_line":"                             \"end\": \u002710.0.0.50\u0027}]"}],"source_content_type":"text/x-python","patch_set":49,"id":"AAAAQn%2F%2FjX8%3D","line":1721,"updated":"2013-07-29 11:50:10.000000000","message":"How does this relate to the VPN changes?","commit_id":"c493f25e8b167056f2587ce8be1081f416800584"}],"quantum/api/v2/attributes.py":[{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":280,"context_line":"        return _validate_uuid(data)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"#Added function to validate the cidr_list"},{"line_number":284,"context_line":"def _validate_cidr_list(data, valid_values\u003dNone):"},{"line_number":285,"context_line":"    if not isinstance(data, list):"},{"line_number":286,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2Ff%2BA%3D","line":283,"updated":"2013-06-29 05:55:16.000000000","message":"seems like a redundant comment","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"}],"quantum/common/topics.py":[{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":25,"context_line":"AGENT \u003d \u0027q-agent-notifier\u0027"},{"line_number":26,"context_line":"PLUGIN \u003d \u0027q-plugin\u0027"},{"line_number":27,"context_line":"DHCP \u003d \u0027q-dhcp-notifer\u0027"},{"line_number":28,"context_line":"LOADBALANCER_PLUGIN \u003d \u0027q-loadbalancer-plugin\u0027"},{"line_number":29,"context_line":"VPN_PLUGIN \u003d \u0027q-vpn-plugin\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"L3_AGENT \u003d \u0027l3_agent\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2Ff90%3D","line":28,"updated":"2013-06-29 05:55:16.000000000","message":"Why is LOADBALANCER_PLUGIN being added here?","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":25,"context_line":"AGENT \u003d \u0027q-agent-notifier\u0027"},{"line_number":26,"context_line":"PLUGIN \u003d \u0027q-plugin\u0027"},{"line_number":27,"context_line":"DHCP \u003d \u0027q-dhcp-notifer\u0027"},{"line_number":28,"context_line":"LOADBALANCER_PLUGIN \u003d \u0027q-loadbalancer-plugin\u0027"},{"line_number":29,"context_line":"VPN_PLUGIN \u003d \u0027q-vpn-plugin\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"L3_AGENT \u003d \u0027l3_agent\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2Ff9M%3D","line":28,"in_reply_to":"AAAAPn%2F%2Ff90%3D","updated":"2013-06-29 05:57:11.000000000","message":"This seems to be incorrect merge/rebase with master","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"L3_AGENT \u003d \u0027l3_agent\u0027"},{"line_number":32,"context_line":"DHCP_AGENT \u003d \u0027dhcp_agent\u0027"},{"line_number":33,"context_line":"LOADBALANCER_AGENT \u003d \u0027loadbalancer_agent\u0027"},{"line_number":34,"context_line":"VPN_AGENT \u003d \u0027vpn_agent\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2Ff9w%3D","line":33,"updated":"2013-06-29 05:55:16.000000000","message":"ditto","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"}],"quantum/db/vpn/vpn_db.py":[{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":"# @author: Swaminathan Vasudevan, Hewlett-Packard."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from oslo.config import cfg"},{"line_number":21,"context_line":"import sqlalchemy as sa"},{"line_number":22,"context_line":"from sqlalchemy import orm"},{"line_number":23,"context_line":"from sqlalchemy.orm import exc"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3yQ%3D","line":20,"updated":"2013-05-21 09:31:48.000000000","message":"unused","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":42,"context_line":"class VPNServiceConnection(model_base.BASEV2, models_v2.HasId,"},{"line_number":43,"context_line":"                           models_v2.HasTenant):"},{"line_number":44,"context_line":"    \"\"\"Represents a v2 VPNServiceConnection Object.\"\"\""},{"line_number":45,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":46,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":47,"context_line":"    peer_address \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":48,"context_line":"    peer_id \u003d sa.Column(sa.String(255), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4iQ%3D","line":45,"updated":"2013-05-21 01:54:31.000000000","message":"Shorten length(64) for name may be enough","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":47,"context_line":"    peer_address \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":48,"context_line":"    peer_id \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":49,"context_line":"    peer_cidrs \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":50,"context_line":"    route_mode \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":51,"context_line":"    mtu \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":52,"context_line":"    initiator \u003d sa.Column(sa.String(16), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4jU%3D","line":49,"updated":"2013-05-21 01:54:31.000000000","message":"How many subnets can be included in this peer_cidrs? 64 seems too short for many of IPv4 subnets and short for many of IPv6 subnets(feature extension)","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    peer_address \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":48,"context_line":"    peer_id \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":49,"context_line":"    peer_cidrs \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":50,"context_line":"    route_mode \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":51,"context_line":"    mtu \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":52,"context_line":"    initiator \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":53,"context_line":"    auth_mode \u003d sa.Column(sa.String(16), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4io%3D","line":50,"updated":"2013-05-21 01:54:31.000000000","message":"Default values can be set here for \"route_mode\", mtu, initiator, auth_mode, dpd_action, dpd_timeout, dpd_interval.\r\n\r\nenum type for route_mode would be better","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    peer_cidrs \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":50,"context_line":"    route_mode \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":51,"context_line":"    mtu \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":52,"context_line":"    initiator \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":53,"context_line":"    auth_mode \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":54,"context_line":"    psk \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":55,"context_line":"    dpd_action \u003d sa.Column(sa.String(16))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4iA%3D","line":52,"updated":"2013-05-21 01:54:31.000000000","message":"enum type for it would be better","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    initiator \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":53,"context_line":"    auth_mode \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":54,"context_line":"    psk \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":55,"context_line":"    dpd_action \u003d sa.Column(sa.String(16))"},{"line_number":56,"context_line":"    dpd_interval \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":57,"context_line":"    dpd_timeout \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":58,"context_line":"    status \u003d sa.Column(sa.String(16), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4h8%3D","line":55,"updated":"2013-05-21 01:54:31.000000000","message":"enum type for it would be better","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                                        sa.ForeignKey(\u0027ikepolicys.id\u0027,"},{"line_number":70,"context_line":"                                                      ondelete\u003d\"CASCADE\"),"},{"line_number":71,"context_line":"                                        nullable\u003dFalse)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class IPsecPolicy(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":75,"context_line":"    \"\"\"Represents a v2 IPsecPolicy Object.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4ic%3D","line":72,"updated":"2013-05-21 01:54:31.000000000","message":"If there is no local_cidrs, how to support multiple local subnets. If we select local subnets from subnet_id, how to support select some of the subnets from subnet_id? For example, if there are 4 subnets include in subnet_id, how to select 2 of them as local subnets?","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class IPsecPolicy(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":75,"context_line":"    \"\"\"Represents a v2 IPsecPolicy Object.\"\"\""},{"line_number":76,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":77,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":78,"context_line":"    transform_protocol \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":79,"context_line":"    auth_algorithm \u003d sa.Column(sa.String(8), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4iM%3D","line":76,"updated":"2013-05-21 01:54:31.000000000","message":"Shorten length(64) for name may be enough","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    \"\"\"Represents a v2 IPsecPolicy Object.\"\"\""},{"line_number":76,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":77,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":78,"context_line":"    transform_protocol \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":79,"context_line":"    auth_algorithm \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":80,"context_line":"    encryption_algorithm \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":81,"context_line":"    encapsulation_mode \u003d sa.Column(sa.String(16), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4iE%3D","line":78,"updated":"2013-05-21 01:54:31.000000000","message":"enum type would be better","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    transform_protocol \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":79,"context_line":"    auth_algorithm \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":80,"context_line":"    encryption_algorithm \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":81,"context_line":"    encapsulation_mode \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":82,"context_line":"    lifetime_units \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":83,"context_line":"    lifetime_value \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":84,"context_line":"    pfs \u003d sa.Column(sa.String(8), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4ho%3D","line":81,"updated":"2013-05-21 01:54:31.000000000","message":"enum type would be better","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    auth_algorithm \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":80,"context_line":"    encryption_algorithm \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":81,"context_line":"    encapsulation_mode \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":82,"context_line":"    lifetime_units \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":83,"context_line":"    lifetime_value \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":84,"context_line":"    pfs \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":85,"context_line":"    vpnserviceconnections \u003d orm.relationship(VPNServiceConnection,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3bo%3D","line":82,"updated":"2013-05-21 15:18:55.000000000","message":"Strongswan also supported a lifetime unit of \"packets\". Do we want to allow that? If so, default?\n\nNot sure if this applies to IPSec, IKE, or both policies.","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    encapsulation_mode \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":82,"context_line":"    lifetime_units \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":83,"context_line":"    lifetime_value \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":84,"context_line":"    pfs \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":85,"context_line":"    vpnserviceconnections \u003d orm.relationship(VPNServiceConnection,"},{"line_number":86,"context_line":"                                             backref\u003d\u0027IPsecPolicy\u0027)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4hk%3D","line":84,"updated":"2013-05-21 01:54:31.000000000","message":"enum type would be better","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class IKEPolicy(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":90,"context_line":"    \"\"\"Represents a v2 IKEPolicy Object.\"\"\""},{"line_number":91,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":92,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":93,"context_line":"    auth_algorithm \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":94,"context_line":"    encryption_algorithm \u003d sa.Column(sa.String(16), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4hI%3D","line":91,"updated":"2013-05-21 01:54:31.000000000","message":"Shorten length(64) for name would be enough","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":93,"context_line":"    auth_algorithm \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":94,"context_line":"    encryption_algorithm \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":95,"context_line":"    phase1_negotiation_mode \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":96,"context_line":"    lifetime_units \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":97,"context_line":"    lifetime_value \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":98,"context_line":"    pfs \u003d sa.Column(sa.String(8), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4hY%3D","line":95,"updated":"2013-05-21 01:54:31.000000000","message":"enum type would be better","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    phase1_negotiation_mode \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":96,"context_line":"    lifetime_units \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":97,"context_line":"    lifetime_value \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":98,"context_line":"    pfs \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":99,"context_line":"    vpnserviceconnections \u003d orm.relationship(VPNServiceConnection,"},{"line_number":100,"context_line":"                                             backref\u003d\u0027IKEPolicy\u0027)"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4hU%3D","line":98,"updated":"2013-05-21 01:54:31.000000000","message":"enum type would be better","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    \"\"\"Represents a v2 VPNService Object.\"\"\""},{"line_number":105,"context_line":"    name \u003d sa.Column(sa.String(255))"},{"line_number":106,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":107,"context_line":"    vpn_type \u003d sa.Column(sa.String(36))"},{"line_number":108,"context_line":"    status \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":109,"context_line":"    admin_state_up \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":110,"context_line":"    subnet_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3Z4%3D","line":107,"updated":"2013-05-21 15:18:55.000000000","message":"Can this field be null?","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                                             cascade\u003d\"all, delete-orphan\")"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"class VPNPluginDb(VPNPluginBase):"},{"line_number":120,"context_line":"    \"\"\""},{"line_number":121,"context_line":"    VPN plugin database class using SQLAlchemy models."},{"line_number":122,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3Xk%3D","line":119,"updated":"2013-05-21 15:18:55.000000000","message":"Should all the common code from this class and LoadBalancePluginDb be refactored out at this time into a common parent, rather than duplicating now, and later extracting?","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":116,"context_line":"                                             cascade\u003d\"all, delete-orphan\")"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"class VPNPluginDb(VPNPluginBase):"},{"line_number":120,"context_line":"    \"\"\""},{"line_number":121,"context_line":"    VPN plugin database class using SQLAlchemy models."},{"line_number":122,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F2DE%3D","line":119,"in_reply_to":"AAAAPH%2F%2F3Xk%3D","updated":"2013-05-21 21:11:00.000000000","message":"There is a bug on this, it\u0027s out of scope of this patch.","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":125,"context_line":"    def _core_plugin(self):"},{"line_number":126,"context_line":"        return manager.QuantumManager.get_plugin()"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _core_services(self):"},{"line_number":129,"context_line":"        return manager.QuantumManager.get_service_plugins()"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _change_context(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4Aw%3D","line":128,"updated":"2013-05-21 07:59:38.000000000","message":"that seems to be unused.\nWhy do you need this?","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def _get_external_network_id_routers(self, context):"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        context \u003d quantum_context.get_admin_context()"},{"line_number":216,"context_line":"        return self._core_plugin.get_external_network_id(context)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    ########################################################"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F38w%3D","line":215,"updated":"2013-05-21 07:59:38.000000000","message":"redefining method argument seems a bit confusing, but ok.","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"625eb33867628716ea985d09e696e16a88256da5","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        return self._core_plugin.get_external_network_id(context)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    ########################################################"},{"line_number":219,"context_line":"    # VPNServiceConnection DB access"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    def _make_vpnserviceconnection_dict(self, vpnservice_conn, fields\u003dNone):"},{"line_number":222,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F5JU%3D","line":219,"updated":"2013-05-20 20:48:27.000000000","message":"Use comment style in hacking.rst","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        return self._fields(res, fields)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def create_vpnserviceconnection(self, context, vpnserviceconnection):"},{"line_number":249,"context_line":"        vpnc \u003d vpnserviceconnection[\u0027vpnserviceconnection\u0027]"},{"line_number":250,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, vpnc)"},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4fk%3D","line":248,"updated":"2013-05-21 01:54:31.000000000","message":"In the whole file, for variable and parameter using abbreviate should be ok. How about using\r\nvpn_conn_id for vpnservice_conn_id \r\nvpn_conn_db for vpnservice_conn_db\r\nvpnsrvconn  for vpnserviceconnection\r\nvpnc  for vpnserviceconnection[\u0027vpnserviceconnection\u0027] \r\nreplace p with vpnc  for consistence\r\n.","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        return self._fields(res, fields)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def create_vpnserviceconnection(self, context, vpnserviceconnection):"},{"line_number":249,"context_line":"        vpnc \u003d vpnserviceconnection[\u0027vpnserviceconnection\u0027]"},{"line_number":250,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, vpnc)"},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3VQ%3D","line":248,"in_reply_to":"AAAAPH%2F%2F4fk%3D","updated":"2013-05-21 15:18:55.000000000","message":"Would variables (and maybe params too) need the \u0027vpn\u0027 prefix, or can we just use conn_id, conn_db, service_conn, conn?","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":249,"context_line":"        vpnc \u003d vpnserviceconnection[\u0027vpnserviceconnection\u0027]"},{"line_number":250,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, vpnc)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"            try:"},{"line_number":255,"context_line":"                qry \u003d context.session.query(VPNService)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3%2BA%3D","line":252,"updated":"2013-05-21 07:59:38.000000000","message":"I think this block needs to be rewritten in the way that you try to add vpnservice_conn_db first and if it fails with IntegrityError then you run these queries to find out which id was incorrect.\n\nThat\u0027ll save you 3 queries per normal operation.","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"625eb33867628716ea985d09e696e16a88256da5","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                                                                     \u0027policy\u0027"},{"line_number":277,"context_line":"                                                                     \u0027_id\u0027])"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"            vpnservice_conn_db \u003d \\"},{"line_number":280,"context_line":"            VPNServiceConnection(id\u003duuidutils.generate_uuid(),"},{"line_number":281,"context_line":"                                 tenant_id\u003dtenant_id,"},{"line_number":282,"context_line":"                                 name\u003dvpnc[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F5Ic%3D","line":279,"updated":"2013-05-20 20:48:27.000000000","message":"should not use \\","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":276,"context_line":"                                                                     \u0027policy\u0027"},{"line_number":277,"context_line":"                                                                     \u0027_id\u0027])"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"            vpnservice_conn_db \u003d \\"},{"line_number":280,"context_line":"            VPNServiceConnection(id\u003duuidutils.generate_uuid(),"},{"line_number":281,"context_line":"                                 tenant_id\u003dtenant_id,"},{"line_number":282,"context_line":"                                 name\u003dvpnc[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4AA%3D","line":279,"updated":"2013-05-21 07:59:38.000000000","message":"vpnservice_conn_db \u003d ( \n\n  VPNServiceConnection( ...\n                        ) \n\n)","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":304,"context_line":""},{"line_number":305,"context_line":"            context.session.add(vpnservice_conn_db)"},{"line_number":306,"context_line":"            vpnservice_conn_id \u003d vpnservice_conn_db[\u0027id\u0027]"},{"line_number":307,"context_line":"        vpnservice_conn_db \u003d self._get_resource(context,"},{"line_number":308,"context_line":"                                                VPNServiceConnection,"},{"line_number":309,"context_line":"                                                vpnservice_conn_id)"},{"line_number":310,"context_line":"        return self._make_vpnserviceconnection_dict(vpnservice_conn_db)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F39w%3D","line":307,"updated":"2013-05-21 07:59:38.000000000","message":"Why do you need to fetch it again?","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":312,"context_line":"    def update_vpnserviceconnection(self,"},{"line_number":313,"context_line":"                                    context,"},{"line_number":314,"context_line":"                                    vpnservice_conn_id, vpnserviceconnection):"},{"line_number":315,"context_line":"        p \u003d vpnserviceconnection[\u0027vpnserviceconnection\u0027]"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":318,"context_line":"            ipc_db \u003d self._get_resource(context,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4fY%3D","line":315,"updated":"2013-05-21 01:54:31.000000000","message":"vpnc here would be better","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"625eb33867628716ea985d09e696e16a88256da5","unresolved":false,"context_lines":[{"line_number":343,"context_line":"                                    filters\u003dfilters, fields\u003dfields)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    ##################################################################"},{"line_number":346,"context_line":"    # IKEPolicy DB Access"},{"line_number":347,"context_line":"    def _make_ikepolicy_dict(self, ikepolicy, fields\u003dNone):"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"        res \u003d {\u0027id\u0027: ikepolicy[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F5JM%3D","line":346,"updated":"2013-05-20 20:48:27.000000000","message":"Use comment style in hacking.rst","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":355,"context_line":"               \u0027phase1_negotiation_mode\u0027: ikepolicy[\u0027phase1_negotiation_mode\u0027],"},{"line_number":356,"context_line":"               \u0027lifetime_units\u0027: ikepolicy[\u0027lifetime_units\u0027],"},{"line_number":357,"context_line":"               \u0027lifetime_value\u0027: ikepolicy[\u0027lifetime_value\u0027],"},{"line_number":358,"context_line":"               \u0027pfs\u0027: ikepolicy[\u0027pfs\u0027],"},{"line_number":359,"context_line":"               \u0027vpnserviceconnections\u0027: [vpn_conn[\u0027id\u0027]for vpn_conn in \\"},{"line_number":360,"context_line":"                                         ikepolicy[\u0027vpnserviceconnections\u0027]]}"},{"line_number":361,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3UY%3D","line":358,"updated":"2013-05-21 15:18:55.000000000","message":"ike_version attribute?","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":356,"context_line":"               \u0027lifetime_units\u0027: ikepolicy[\u0027lifetime_units\u0027],"},{"line_number":357,"context_line":"               \u0027lifetime_value\u0027: ikepolicy[\u0027lifetime_value\u0027],"},{"line_number":358,"context_line":"               \u0027pfs\u0027: ikepolicy[\u0027pfs\u0027],"},{"line_number":359,"context_line":"               \u0027vpnserviceconnections\u0027: [vpn_conn[\u0027id\u0027]for vpn_conn in \\"},{"line_number":360,"context_line":"                                         ikepolicy[\u0027vpnserviceconnections\u0027]]}"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"        return self._fields(res, fields)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3UE%3D","line":359,"updated":"2013-05-21 15:18:55.000000000","message":"Is there a 1:1 relationship between IKE Policy and connection?","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"625eb33867628716ea985d09e696e16a88256da5","unresolved":false,"context_lines":[{"line_number":366,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, ike)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":369,"context_line":"            ike_db \u003d \\"},{"line_number":370,"context_line":"            IKEPolicy(id\u003duuidutils.generate_uuid(),"},{"line_number":371,"context_line":"                      tenant_id\u003dtenant_id,"},{"line_number":372,"context_line":"                      name\u003dike[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F5I8%3D","line":369,"updated":"2013-05-20 20:48:27.000000000","message":"not use \\","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":379,"context_line":"                      pfs\u003dike[\u0027pfs\u0027])"},{"line_number":380,"context_line":"            context.session.add(ike_db)"},{"line_number":381,"context_line":"            ike_id \u003d ike_db[\u0027id\u0027]"},{"line_number":382,"context_line":"        ike_db \u003d self._get_resource(context, IKEPolicy, ike_id)"},{"line_number":383,"context_line":"        return self._make_ikepolicy_dict(ike_db)"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"    def update_ikepolicy(self, context, ikepolicy_id, ikepolicy):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F39U%3D","line":382,"updated":"2013-05-21 07:59:38.000000000","message":"you don\u0027t need to fetch an object you\u0027ve just added.","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":383,"context_line":"        return self._make_ikepolicy_dict(ike_db)"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"    def update_ikepolicy(self, context, ikepolicy_id, ikepolicy):"},{"line_number":386,"context_line":"        p \u003d ikepolicy[\u0027ikepolicy\u0027]"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":389,"context_line":"            ike_db \u003d self._get_resource(context, IKEPolicy, ikepolicy_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3T4%3D","line":386,"updated":"2013-05-21 15:18:55.000000000","message":"policy vs p?","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":393,"context_line":""},{"line_number":394,"context_line":"    def delete_ikepolicy(self, context, ikepolicy_id):"},{"line_number":395,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":396,"context_line":"            sslc \u003d self._get_resource(context, IKEPolicy, ikepolicy_id)"},{"line_number":397,"context_line":"            context.session.delete(sslc)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    def get_ikepolicy(self, context, ikepolicy_id, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3Ts%3D","line":396,"updated":"2013-05-21 15:18:55.000000000","message":"ike_db?  What does sslc mean?\n\nSame for get_ikepolicy()","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"625eb33867628716ea985d09e696e16a88256da5","unresolved":false,"context_lines":[{"line_number":406,"context_line":"                                    filters\u003dfilters, fields\u003dfields)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    ##################################################################"},{"line_number":409,"context_line":"    # IPsecPolicy DB Access"},{"line_number":410,"context_line":"    def _make_ipsecpolicy_dict(self, ipsecpolicy, fields\u003dNone):"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        res \u003d {\u0027id\u0027: ipsecpolicy[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F5I4%3D","line":409,"updated":"2013-05-20 20:48:27.000000000","message":"follow hacking.rst","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":420,"context_line":"               \u0027lifetime_units\u0027: ipsecpolicy[\u0027lifetime_units\u0027],"},{"line_number":421,"context_line":"               \u0027lifetime_value\u0027: ipsecpolicy[\u0027lifetime_value\u0027],"},{"line_number":422,"context_line":"               \u0027pfs\u0027: ipsecpolicy[\u0027pfs\u0027],"},{"line_number":423,"context_line":"               \u0027vpnserviceconnections\u0027: [vpn_conn[\u0027id\u0027] for vpn_conn in \\"},{"line_number":424,"context_line":"                                         ipsecpolicy[\u0027vpnserviceconnections\u0027]]}"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"        return self._fields(res, fields)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3Tc%3D","line":423,"updated":"2013-05-21 15:18:55.000000000","message":"1:1 relationship with connection?","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":445,"context_line":"                        pfs\u003dipsecp[\u0027pfs\u0027])"},{"line_number":446,"context_line":"            context.session.add(ipsecp_db)"},{"line_number":447,"context_line":"            ipsecpolicy_id \u003d ipsecp_db[\u0027id\u0027]"},{"line_number":448,"context_line":"        ipsecp_db \u003d self._get_resource(context, IPsecPolicy, ipsecpolicy_id)"},{"line_number":449,"context_line":"        return self._make_ipsecpolicy_dict(ipsecp_db)"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    def update_ipsecpolicy(self, context, ipsecpolicy_id, ipsecpolicy):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F38c%3D","line":448,"updated":"2013-05-21 07:59:38.000000000","message":"not needed, same as above","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"625eb33867628716ea985d09e696e16a88256da5","unresolved":false,"context_lines":[{"line_number":473,"context_line":"                                    self._make_ipsecpolicy_dict,"},{"line_number":474,"context_line":"                                    filters\u003dfilters, fields\u003dfields)"},{"line_number":475,"context_line":"    ##################################################################"},{"line_number":476,"context_line":"    #  VPNService DB Access"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"    def _make_vpnservice_dict(self, vpnservice, fields\u003dNone):"},{"line_number":479,"context_line":"        # Get the ip address and subnet id from the"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F5I0%3D","line":476,"updated":"2013-05-20 20:48:27.000000000","message":"follow hacking.rst","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"unresolved":false,"context_lines":[{"line_number":523,"context_line":"        fixedipaddress \u003d fixed_ip.get(\u0027ip_address\u0027)"},{"line_number":524,"context_line":"        floatingip_res \u003d {"},{"line_number":525,"context_line":"                          \u0027tenant_id\u0027: vpnservice_db.tenant_id,"},{"line_number":526,"context_line":"                          \u0027port_id\u0027: port[\u0027id\u0027],"},{"line_number":527,"context_line":"                          \u0027fixed_ip_address\u0027: fixedipaddress,"},{"line_number":528,"context_line":"                          \u0027floating_network_id\u0027: net_ext_id"},{"line_number":529,"context_line":"                          }"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3yU%3D","line":526,"updated":"2013-05-21 09:31:48.000000000","message":"variable \u0027port\u0027 will be unset if vpnservice_db.port_id is not None","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":554,"context_line":""},{"line_number":555,"context_line":"            context.session.add(vpnservice_db)"},{"line_number":556,"context_line":"            ipc_id \u003d vpnservice_db[\u0027id\u0027]"},{"line_number":557,"context_line":"            net_ext_id \u003d self._get_external_network_id_routers(context)"},{"line_number":558,"context_line":"            # create a port to reserve address for IPAM"},{"line_number":559,"context_line":"            self._create_port_and_floatingip_for_vpnservice("},{"line_number":560,"context_line":"                context,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F374%3D","line":557,"updated":"2013-05-21 07:59:38.000000000","message":"Question: external network is retrieved using admin context, that means that if it is not shared, tenant would have implicit access to it.\nIs it ok?","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"625eb33867628716ea985d09e696e16a88256da5","unresolved":false,"context_lines":[{"line_number":562,"context_line":"                ipc[\u0027subnet_id\u0027],"},{"line_number":563,"context_line":"                net_ext_id"},{"line_number":564,"context_line":"            )"},{"line_number":565,"context_line":"            # Create a floating ip and associate with the port id"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"        vpnservice_db \u003d self._get_resource(context, VPNService, ipc_id)"},{"line_number":568,"context_line":"        return self._make_vpnservice_dict(vpnservice_db)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F5Ig%3D","line":565,"updated":"2013-05-20 20:48:27.000000000","message":"TBD? \nAlso add interface for router is needed.","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":564,"context_line":"            )"},{"line_number":565,"context_line":"            # Create a floating ip and associate with the port id"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"        vpnservice_db \u003d self._get_resource(context, VPNService, ipc_id)"},{"line_number":568,"context_line":"        return self._make_vpnservice_dict(vpnservice_db)"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"    def update_vpnservice(self, context, vpnservice_id, vpnservice):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F39A%3D","line":567,"updated":"2013-05-21 07:59:38.000000000","message":"not needed, same as above","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":581,"context_line":"            context.session.delete(ipc)"},{"line_number":582,"context_line":"            if ipc.port:  # this is a Quantum port"},{"line_number":583,"context_line":"                self._core_plugin.delete_port(context, ipc.port.id)"},{"line_number":584,"context_line":"            context.session.flush()"},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"    def get_vpnservice(self, context, vpnservice_id, fields\u003dNone):"},{"line_number":587,"context_line":"        ipc \u003d self._get_resource(context, VPNService, vpnservice_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F384%3D","line":584,"updated":"2013-05-21 07:59:38.000000000","message":"flush will be called anyway when with block is exited.","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":136,"context_line":"    def _core_plugin(self):"},{"line_number":137,"context_line":"        return manager.QuantumManager.get_plugin()"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def _get_tenant_id_for_create(self, context, resource):"},{"line_number":140,"context_line":"        if context.is_admin and \u0027tenant_id\u0027 in resource:"},{"line_number":141,"context_line":"            tenant_id \u003d resource[\u0027tenant_id\u0027]"},{"line_number":142,"context_line":"        elif (\u0027tenant_id\u0027 in resource and"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FjDg%3D","line":139,"updated":"2013-05-30 19:47:14.000000000","message":"now you should just inherint from CommonDbMixin defined in quantum/db/db_base_plugin_v2 and this method can be removed","commit_id":"4944300095807580a99cbea638e926043c4967ba"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":147,"context_line":"            tenant_id \u003d context.tenant_id"},{"line_number":148,"context_line":"        return tenant_id"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def _fields(self, resource, fields):"},{"line_number":151,"context_line":"        if fields:"},{"line_number":152,"context_line":"            return dict((key, item) for key, item in resource.iteritems()"},{"line_number":153,"context_line":"                        if key in fields)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FjDY%3D","line":150,"updated":"2013-05-30 19:47:14.000000000","message":"ditto","commit_id":"4944300095807580a99cbea638e926043c4967ba"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":153,"context_line":"                        if key in fields)"},{"line_number":154,"context_line":"        return resource"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def _apply_filters_to_query(self, query, model, filters):"},{"line_number":157,"context_line":"        if filters:"},{"line_number":158,"context_line":"            for key, value in filters.iteritems():"},{"line_number":159,"context_line":"                column \u003d getattr(model, key, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FjDQ%3D","line":156,"updated":"2013-05-30 19:47:14.000000000","message":"ditto","commit_id":"4944300095807580a99cbea638e926043c4967ba"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":161,"context_line":"                    query \u003d query.filter(column.in_(value))"},{"line_number":162,"context_line":"        return query"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def _get_collection_query(self, context, model, filters\u003dNone):"},{"line_number":165,"context_line":"        collection \u003d self._model_query(context, model)"},{"line_number":166,"context_line":"        collection \u003d self._apply_filters_to_query(collection, model, filters)"},{"line_number":167,"context_line":"        return collection"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FjDE%3D","line":164,"updated":"2013-05-30 19:47:14.000000000","message":"ditto","commit_id":"4944300095807580a99cbea638e926043c4967ba"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":166,"context_line":"        collection \u003d self._apply_filters_to_query(collection, model, filters)"},{"line_number":167,"context_line":"        return collection"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def _get_collection(self, context, model, dict_func, filters\u003dNone,"},{"line_number":170,"context_line":"                        fields\u003dNone, sorts\u003dNone, limit\u003dNone, marker_obj\u003dNone,"},{"line_number":171,"context_line":"                        page_reverse\u003dFalse):"},{"line_number":172,"context_line":"        query \u003d self._get_collection_query(context, model, filters)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FjDA%3D","line":169,"updated":"2013-05-30 19:47:14.000000000","message":"ditto","commit_id":"4944300095807580a99cbea638e926043c4967ba"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":172,"context_line":"        query \u003d self._get_collection_query(context, model, filters)"},{"line_number":173,"context_line":"        return [dict_func(c, fields) for c in query.all()]"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def _get_collection_count(self, context, model, filters\u003dNone):"},{"line_number":176,"context_line":"        return self._get_collection_query(context, model, filters).count()"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def _model_query(self, context, model):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FjC0%3D","line":175,"updated":"2013-05-30 19:47:14.000000000","message":"ditto","commit_id":"4944300095807580a99cbea638e926043c4967ba"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":175,"context_line":"    def _get_collection_count(self, context, model, filters\u003dNone):"},{"line_number":176,"context_line":"        return self._get_collection_query(context, model, filters).count()"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def _model_query(self, context, model):"},{"line_number":179,"context_line":"        query \u003d context.session.query(model)"},{"line_number":180,"context_line":"        query_filter \u003d None"},{"line_number":181,"context_line":"        if not context.is_admin and hasattr(model, \u0027tenant_id\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FjC8%3D","line":178,"updated":"2013-05-30 19:47:14.000000000","message":"ditto","commit_id":"4944300095807580a99cbea638e926043c4967ba"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":189,"context_line":"            query \u003d query.filter(query_filter)"},{"line_number":190,"context_line":"        return query"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def _get_by_id(self, context, model, v_id):"},{"line_number":193,"context_line":"        query \u003d self._model_query(context, model)"},{"line_number":194,"context_line":"        return query.filter(model.id \u003d\u003d v_id).one()"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FjC4%3D","line":192,"updated":"2013-05-30 19:47:14.000000000","message":"ditto","commit_id":"4944300095807580a99cbea638e926043c4967ba"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    mtu \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":50,"context_line":"    initiator \u003d sa.Column(sa.Enum(\"bi-directional\", \"response-only\","},{"line_number":51,"context_line":"                                  name\u003d\"vpn_initiators\"), nullable\u003dFalse)"},{"line_number":52,"context_line":"    auth_mode \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":53,"context_line":"    psk \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":54,"context_line":"    dpd_action \u003d sa.Column(sa.Enum(\"hold\", \"clear\","},{"line_number":55,"context_line":"                                   \"restart\", \"disabled\","}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fg2w%3D","line":52,"updated":"2013-05-31 15:20:44.000000000","message":"Should this be an Enum?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":79,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":80,"context_line":"    transform_protocol \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":81,"context_line":"    auth_algorithm \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":82,"context_line":"    encryption_algorithm \u003d sa.Column(sa.Enum(\"3des\", \"aes-128\","},{"line_number":83,"context_line":"                                             \"aes-256\", \"aes-192\","},{"line_number":84,"context_line":"                                             name\u003d\"vpn_encrypt_algorithms\"),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fg2I%3D","line":81,"updated":"2013-05-31 15:20:44.000000000","message":"Should this be an Enum?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    auth_algorithm \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":82,"context_line":"    encryption_algorithm \u003d sa.Column(sa.Enum(\"3des\", \"aes-128\","},{"line_number":83,"context_line":"                                             \"aes-256\", \"aes-192\","},{"line_number":84,"context_line":"                                             name\u003d\"vpn_encrypt_algorithms\"),"},{"line_number":85,"context_line":"                                     nullable\u003dFalse)"},{"line_number":86,"context_line":"    encapsulation_mode \u003d sa.Column(sa.Enum(\"tunnel\", \"transport\","},{"line_number":87,"context_line":"                                           name\u003d\"ipsec_encapsulations\"),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fg1E%3D","line":84,"updated":"2013-05-31 15:20:44.000000000","message":"name singular? Assuming one must pick a single algorithm.","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    \"\"\"Represents a v2 IKEPolicy Object.\"\"\""},{"line_number":100,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":101,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":102,"context_line":"    auth_algorithm \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":103,"context_line":"    encryption_algorithm \u003d sa.Column(sa.Enum(\"3des\", \"aes-128\","},{"line_number":104,"context_line":"                                             \"aes-256\", \"aes-192\","},{"line_number":105,"context_line":"                                             name\u003d\"vpn_encrypt_algorithms\"),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fg1c%3D","line":102,"updated":"2013-05-31 15:20:44.000000000","message":"Enum?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    auth_algorithm \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":103,"context_line":"    encryption_algorithm \u003d sa.Column(sa.Enum(\"3des\", \"aes-128\","},{"line_number":104,"context_line":"                                             \"aes-256\", \"aes-192\","},{"line_number":105,"context_line":"                                             name\u003d\"vpn_encrypt_algorithms\"),"},{"line_number":106,"context_line":"                                     nullable\u003dFalse)"},{"line_number":107,"context_line":"    phase1_negotiation_mode \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":108,"context_line":"    lifetime_units \u003d sa.Column(sa.Enum(\"seconds\", \"kilobytes\","}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fg08%3D","line":105,"updated":"2013-05-31 15:20:44.000000000","message":"Singular?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                                             \"aes-256\", \"aes-192\","},{"line_number":105,"context_line":"                                             name\u003d\"vpn_encrypt_algorithms\"),"},{"line_number":106,"context_line":"                                     nullable\u003dFalse)"},{"line_number":107,"context_line":"    phase1_negotiation_mode \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":108,"context_line":"    lifetime_units \u003d sa.Column(sa.Enum(\"seconds\", \"kilobytes\","},{"line_number":109,"context_line":"                                       name\u003d\"vpn_lifetime_units\"),"},{"line_number":110,"context_line":"                               nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fg0w%3D","line":107,"updated":"2013-05-31 15:20:44.000000000","message":"Should this be an enum - main/aggressive (or are there more values)?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        return self._make_vpnconnection_dict(vpn_conn_db)"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    def update_vpnconnection(self, context, vpn_conn_id, vpnconnection):"},{"line_number":254,"context_line":"        upvpc \u003d vpnconnection[\u0027vpnconnection\u0027]"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":257,"context_line":"            vpnc_db \u003d self._get_resource(context, VPNConnection, vpn_conn_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FgtI%3D","line":254,"updated":"2013-05-31 15:20:44.000000000","message":"use vpnc to be consistent with other uses?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    def delete_vpnconnection(self, context, vpn_conn_id):"},{"line_number":264,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":265,"context_line":"            vpnc \u003d self._get_resource(context, VPNConnection, vpn_conn_id)"},{"line_number":266,"context_line":"            context.session.delete(vpnc)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def get_vpnconnection(self, context, vpn_conn_id, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FgtY%3D","line":265,"updated":"2013-05-31 15:20:44.000000000","message":"use vpnc_db for consistency with others.","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":263,"context_line":"    def delete_vpnconnection(self, context, vpn_conn_id):"},{"line_number":264,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":265,"context_line":"            vpnc \u003d self._get_resource(context, VPNConnection, vpn_conn_id)"},{"line_number":266,"context_line":"            context.session.delete(vpnc)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def get_vpnconnection(self, context, vpn_conn_id, fields\u003dNone):"},{"line_number":269,"context_line":"        vpnc \u003d self._get_resource(context, VPNConnection, vpn_conn_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FgwQ%3D","line":266,"updated":"2013-05-31 15:20:44.000000000","message":"Is this right? Does deleting the session, remove the connection from the database?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":287,"context_line":"               \u0027lifetime_value\u0027: ikepolicy[\u0027lifetime_value\u0027],"},{"line_number":288,"context_line":"               \u0027ike_version\u0027: ikepolicy[\u0027ike_version\u0027],"},{"line_number":289,"context_line":"               \u0027pfs\u0027: ikepolicy[\u0027pfs\u0027],"},{"line_number":290,"context_line":"               \u0027vpnconnections\u0027: [vpn_conn[\u0027id\u0027]for vpn_conn in"},{"line_number":291,"context_line":"                                  ikepolicy[\u0027vpnconnections\u0027]]"},{"line_number":292,"context_line":"               }"},{"line_number":293,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FgsM%3D","line":290,"updated":"2013-05-31 15:20:44.000000000","message":"Space before \"for\"","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    def delete_ikepolicy(self, context, ikepolicy_id):"},{"line_number":329,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":330,"context_line":"            ikep \u003d self._get_resource(context, IKEPolicy, ikepolicy_id)"},{"line_number":331,"context_line":"            context.session.delete(ikep)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"    def get_ikepolicy(self, context, ikepolicy_id, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fgsg%3D","line":330,"updated":"2013-05-31 15:20:44.000000000","message":"Same here and other functions, should use same naming...\n\nike_db for IKEPolicy resource\nike for policy","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        ikep \u003d self._get_resource(context, IKEPolicy, ikepolicy_id)"},{"line_number":335,"context_line":"        return self._make_ikepolicy_dict(ikep, fields)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def get_ikepolicys(self, context, filters\u003dNone, fields\u003dNone):"},{"line_number":338,"context_line":"        return self._get_collection(context, IKEPolicy,"},{"line_number":339,"context_line":"                                    self._make_ikepolicy_dict,"},{"line_number":340,"context_line":"                                    filters\u003dfilters, fields\u003dfields)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FgsY%3D","line":337,"updated":"2013-05-31 15:20:44.000000000","message":"Should name use correct spelling? get_ikepolicies","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def delete_ipsecpolicy(self, context, ipsecpolicy_id):"},{"line_number":396,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":397,"context_line":"            ipsecp \u003d self._get_resource(context, IPsecPolicy, ipsecpolicy_id)"},{"line_number":398,"context_line":"            context.session.delete(ipsecp)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    def get_ipsecpolicy(self, context, ipsecpolicy_id, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FgsI%3D","line":397,"updated":"2013-05-31 15:20:44.000000000","message":"Use ipsecp_db","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        ipsecp \u003d self._get_resource(context, IPsecPolicy, ipsecpolicy_id)"},{"line_number":402,"context_line":"        return self._make_ipsecpolicy_dict(ipsecp, fields)"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"    def get_ipsecpolicys(self, context, filters\u003dNone, fields\u003dNone):"},{"line_number":405,"context_line":"        return self._get_collection(context, IPsecPolicy,"},{"line_number":406,"context_line":"                                    self._make_ipsecpolicy_dict,"},{"line_number":407,"context_line":"                                    filters\u003dfilters, fields\u003dfields)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FgsA%3D","line":404,"updated":"2013-05-31 15:20:44.000000000","message":"policies?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":409,"context_line":"    #  VPNService DB Access"},{"line_number":410,"context_line":"    def _make_vpnservice_dict(self, vpnservice, fields\u003dNone):"},{"line_number":411,"context_line":"        fixed_ip \u003d (vpnservice.port.fixed_ips or [{}])[0]"},{"line_number":412,"context_line":"        subid \u003d fixed_ip.get(\u0027subnet_id\u0027)"},{"line_number":413,"context_line":"        ipadd \u003d fixed_ip.get(\u0027ip_address\u0027)"},{"line_number":414,"context_line":"        res \u003d {\u0027id\u0027: vpnservice[\u0027id\u0027],"},{"line_number":415,"context_line":"               \u0027name\u0027: vpnservice[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fgrw%3D","line":412,"updated":"2013-05-31 15:20:44.000000000","message":"subnet_id?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":410,"context_line":"    def _make_vpnservice_dict(self, vpnservice, fields\u003dNone):"},{"line_number":411,"context_line":"        fixed_ip \u003d (vpnservice.port.fixed_ips or [{}])[0]"},{"line_number":412,"context_line":"        subid \u003d fixed_ip.get(\u0027subnet_id\u0027)"},{"line_number":413,"context_line":"        ipadd \u003d fixed_ip.get(\u0027ip_address\u0027)"},{"line_number":414,"context_line":"        res \u003d {\u0027id\u0027: vpnservice[\u0027id\u0027],"},{"line_number":415,"context_line":"               \u0027name\u0027: vpnservice[\u0027name\u0027],"},{"line_number":416,"context_line":"               \u0027description\u0027: vpnservice[\u0027description\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fgrs%3D","line":413,"updated":"2013-05-31 15:20:44.000000000","message":"ipaddress or ip_address or ip_addr?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":454,"context_line":"                                                   vpnservice_db.router_id,"},{"line_number":455,"context_line":"                                                   interface_info)"},{"line_number":456,"context_line":"        if(net_ext_id):"},{"line_number":457,"context_line":"            fixedipaddress \u003d fixed_ip.get(\u0027ip_address\u0027)"},{"line_number":458,"context_line":"            floatingip_res \u003d {\u0027tenant_id\u0027: vpnservice_db.tenant_id,"},{"line_number":459,"context_line":"                              \u0027port_id\u0027: vpnservice_db.port_id,"},{"line_number":460,"context_line":"                              \u0027fixed_ip_address\u0027: fixedipaddress,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FgrY%3D","line":457,"updated":"2013-05-31 15:20:44.000000000","message":"fixed_ipaddress?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":464,"context_line":"                                                {\u0027floatingip\u0027: floatingip_res}"},{"line_number":465,"context_line":"                                                )"},{"line_number":466,"context_line":"        else:"},{"line_number":467,"context_line":"            msg \u003d _(\"Router id specified does not have an external gateway\""},{"line_number":468,"context_line":"                    \" VPN Service create aborted \")"},{"line_number":469,"context_line":"            raise q_exc.BadRequest(resource\u003d\u0027vpnservice\u0027, msg\u003dmsg)"},{"line_number":470,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FgrQ%3D","line":467,"updated":"2013-05-31 15:20:44.000000000","message":"Should we include the ID?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    peer_id \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":47,"context_line":"    peer_cidrs \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":48,"context_line":"    route_mode \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":49,"context_line":"    mtu \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":50,"context_line":"    initiator \u003d sa.Column(sa.Enum(\"bi-directional\", \"response-only\","},{"line_number":51,"context_line":"                                  name\u003d\"vpn_initiators\"), nullable\u003dFalse)"},{"line_number":52,"context_line":"    auth_mode \u003d sa.Column(sa.String(16), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7iM%3D","line":49,"updated":"2013-06-05 21:42:08.000000000","message":"MTU, initiator , auth_mode, and DPD fields are marked as optional. Should they have nullable\u003dFalse (I\u0027m assuming that means they must be provided)?","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                              sa.ForeignKey(\u0027vpnservices.id\u0027,"},{"line_number":64,"context_line":"                                            ondelete\u003d\"CASCADE\"),"},{"line_number":65,"context_line":"                              nullable\u003dFalse)"},{"line_number":66,"context_line":"    ipsecpolicy_id \u003d sa.Column(sa.String(255),"},{"line_number":67,"context_line":"                               sa.ForeignKey(\u0027ipsecpolicys.id\u0027,"},{"line_number":68,"context_line":"                                             ondelete\u003d\"CASCADE\"),"},{"line_number":69,"context_line":"                               nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2Fx2Q%3D","line":66,"updated":"2013-06-10 20:57:24.000000000","message":"Please add relation for ipsecpolicy and ikepolicy","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    encapsulation_mode \u003d sa.Column(sa.Enum(\"tunnel\", \"transport\","},{"line_number":87,"context_line":"                                           name\u003d\"ipsec_encapsulations\"),"},{"line_number":88,"context_line":"                                   nullable\u003dFalse)"},{"line_number":89,"context_line":"    lifetime_units \u003d sa.Column(sa.Enum(\"seconds\", \"kilobytes\","},{"line_number":90,"context_line":"                                       name\u003d\"vpn_lifetime_units\"),"},{"line_number":91,"context_line":"                               nullable\u003dFalse)"},{"line_number":92,"context_line":"    lifetime_value \u003d sa.Column(sa.Integer, nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7hQ%3D","line":89,"updated":"2013-06-05 21:42:08.000000000","message":"Same question on the lifetime fields here and in IKEPolicy. Should a default be specified here too?","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                                       name\u003d\"vpn_lifetime_units\"),"},{"line_number":91,"context_line":"                               nullable\u003dFalse)"},{"line_number":92,"context_line":"    lifetime_value \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":93,"context_line":"    pfs \u003d sa.Column(sa.Enum(\"Group2\", \"Group5\", \"Group14\","},{"line_number":94,"context_line":"                            name\u003d\"vpn_pfs\"), nullable\u003dFalse)"},{"line_number":95,"context_line":"    vpnconnections \u003d orm.relationship(VPNConnection, backref\u003d\u0027IPsecPolicy\u0027)"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7hY%3D","line":93,"updated":"2013-06-05 21:42:08.000000000","message":"Specify default here and in IKEPolicy?","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    \"\"\"Represents a v2 VPNService Object.\"\"\""},{"line_number":121,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":122,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":123,"context_line":"    vpn_type \u003d sa.Column(sa.String(36))"},{"line_number":124,"context_line":"    status \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":125,"context_line":"    admin_state_up \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":126,"context_line":"    subnet_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7hA%3D","line":123,"updated":"2013-06-05 21:42:08.000000000","message":"Required. Should it have nullable\u003dFalse?\nShould it have a default value?","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    status \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":125,"context_line":"    admin_state_up \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":126,"context_line":"    subnet_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"},{"line_number":127,"context_line":"    router_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"},{"line_number":128,"context_line":"    port_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027ports.id\u0027))"},{"line_number":129,"context_line":"    port \u003d orm.relationship(models_v2.Port)"},{"line_number":130,"context_line":"    vpnconnections \u003d orm.relationship(VPNConnection, backref\u003d\u0027vpnservice\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F1b4%3D","line":127,"updated":"2013-06-07 23:56:39.000000000","message":"Please setup relation for router_id, subnet_id","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    status \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":125,"context_line":"    admin_state_up \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":126,"context_line":"    subnet_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"},{"line_number":127,"context_line":"    router_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"},{"line_number":128,"context_line":"    port_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027ports.id\u0027))"},{"line_number":129,"context_line":"    port \u003d orm.relationship(models_v2.Port)"},{"line_number":130,"context_line":"    vpnconnections \u003d orm.relationship(VPNConnection, backref\u003d\u0027vpnservice\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F1bo%3D","line":127,"in_reply_to":"AAAAPX%2F%2F1b4%3D","updated":"2013-06-08 00:01:54.000000000","message":"Could you also jointly load router?\n(something like this)\nhttps://review.openstack.org/#/c/28479/3/quantum/db/l3_db.py","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                                        peer_address\u003dvpnc[\u0027peer_address\u0027],"},{"line_number":234,"context_line":"                                        peer_id\u003dvpnc[\u0027peer_id\u0027],"},{"line_number":235,"context_line":"                                        peer_cidrs\u003dvpnc[\u0027peer_cidrs\u0027],"},{"line_number":236,"context_line":"                                        route_mode\u003d\u0027static\u0027,"},{"line_number":237,"context_line":"                                        mtu\u003dvpnc[\u0027mtu\u0027],"},{"line_number":238,"context_line":"                                        auth_mode\u003d\u0027psk\u0027,"},{"line_number":239,"context_line":"                                        psk\u003dvpnc[\u0027psk\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7gc%3D","line":236,"updated":"2013-06-05 21:42:08.000000000","message":"Should the hard coded fields be using constants defined in a common file?","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        ike_db \u003d self._get_resource(context, IKEPolicy, ikepolicy_id)"},{"line_number":335,"context_line":"        return self._make_ikepolicy_dict(ike_db, fields)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def get_ikepolicys(self, context, filters\u003dNone, fields\u003dNone):"},{"line_number":338,"context_line":"        return self._get_collection(context, IKEPolicy,"},{"line_number":339,"context_line":"                                    self._make_ikepolicy_dict,"},{"line_number":340,"context_line":"                                    filters\u003dfilters, fields\u003dfields)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7f4%3D","line":337,"updated":"2013-06-05 21:42:08.000000000","message":"Related to the API question about whether we should use get_ikepolicies","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        ipsec_db \u003d self._get_resource(context, IPsecPolicy, ipsecpolicy_id)"},{"line_number":402,"context_line":"        return self._make_ipsecpolicy_dict(ipsec_db, fields)"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"    def get_ipsecpolicys(self, context, filters\u003dNone, fields\u003dNone):"},{"line_number":405,"context_line":"        return self._get_collection(context, IPsecPolicy,"},{"line_number":406,"context_line":"                                    self._make_ipsecpolicy_dict,"},{"line_number":407,"context_line":"                                    filters\u003dfilters, fields\u003dfields)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7fk%3D","line":404,"updated":"2013-06-05 21:42:08.000000000","message":"get_ipsecpolicies?","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":426,"context_line":"                                  in vpnservice[\u0027vpnconnections\u0027]]}"},{"line_number":427,"context_line":"        return self._fields(res, fields)"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"    def _create_port_and_floatingip_for_vpnservice(self,"},{"line_number":430,"context_line":"                                                   context,"},{"line_number":431,"context_line":"                                                   vpnservice_db,"},{"line_number":432,"context_line":"                                                   net_ext_id):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7a8%3D","line":429,"updated":"2013-06-05 21:42:08.000000000","message":"It the goal here to create a port and floating IP on the external network side?\n\nIf so, how do we know which subnet is being referenced in this function (ext vs int)?","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":429,"context_line":"    def _create_port_and_floatingip_for_vpnservice(self,"},{"line_number":430,"context_line":"                                                   context,"},{"line_number":431,"context_line":"                                                   vpnservice_db,"},{"line_number":432,"context_line":"                                                   net_ext_id):"},{"line_number":433,"context_line":"        # resolve subnet and create port"},{"line_number":434,"context_line":"        subnet \u003d self._core_plugin.get_subnet(context, vpnservice_db.subnet_id)"},{"line_number":435,"context_line":"        fixed_ip \u003d {\u0027subnet_id\u0027: subnet[\u0027id\u0027]}"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7cE%3D","line":432,"updated":"2013-06-05 21:42:08.000000000","message":"naming for clarity... external_net_id?","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":434,"context_line":"        subnet \u003d self._core_plugin.get_subnet(context, vpnservice_db.subnet_id)"},{"line_number":435,"context_line":"        fixed_ip \u003d {\u0027subnet_id\u0027: subnet[\u0027id\u0027]}"},{"line_number":436,"context_line":"        interface_info \u003d {\u0027subnet_id\u0027: subnet[\u0027id\u0027]}"},{"line_number":437,"context_line":"        if(vpnservice_db.port_id is None):"},{"line_number":438,"context_line":"            self._core_plugin.add_router_interface(context,"},{"line_number":439,"context_line":"                                                   vpnservice_db.router_id,"},{"line_number":440,"context_line":"                                                   interface_info"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7eQ%3D","line":437,"updated":"2013-06-05 21:42:08.000000000","message":"no parens needed","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        fixed_ip \u003d {\u0027subnet_id\u0027: subnet[\u0027id\u0027]}"},{"line_number":436,"context_line":"        interface_info \u003d {\u0027subnet_id\u0027: subnet[\u0027id\u0027]}"},{"line_number":437,"context_line":"        if(vpnservice_db.port_id is None):"},{"line_number":438,"context_line":"            self._core_plugin.add_router_interface(context,"},{"line_number":439,"context_line":"                                                   vpnservice_db.router_id,"},{"line_number":440,"context_line":"                                                   interface_info"},{"line_number":441,"context_line":"                                                   )"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7dc%3D","line":438,"updated":"2013-06-05 21:42:08.000000000","message":"Couldn\u0027t this function call be pulled up out of the if condition?","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        fixed_ip \u003d {\u0027subnet_id\u0027: subnet[\u0027id\u0027]}"},{"line_number":436,"context_line":"        interface_info \u003d {\u0027subnet_id\u0027: subnet[\u0027id\u0027]}"},{"line_number":437,"context_line":"        if(vpnservice_db.port_id is None):"},{"line_number":438,"context_line":"            self._core_plugin.add_router_interface(context,"},{"line_number":439,"context_line":"                                                   vpnservice_db.router_id,"},{"line_number":440,"context_line":"                                                   interface_info"},{"line_number":441,"context_line":"                                                   )"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F3rw%3D","line":438,"in_reply_to":"AAAAPX%2F%2F7dc%3D","updated":"2013-06-07 01:17:34.000000000","message":"also check if the router is already connected with the subnet.\nIf the router is already connected to the subnet, the extra connection may not be needed.","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":453,"context_line":"            self._core_plugin.add_router_interface(context,"},{"line_number":454,"context_line":"                                                   vpnservice_db.router_id,"},{"line_number":455,"context_line":"                                                   interface_info)"},{"line_number":456,"context_line":"        if(net_ext_id):"},{"line_number":457,"context_line":"            fixedipaddress \u003d fixed_ip.get(\u0027ip_address\u0027)"},{"line_number":458,"context_line":"            floatingip_res \u003d {\u0027tenant_id\u0027: vpnservice_db.tenant_id,"},{"line_number":459,"context_line":"                              \u0027port_id\u0027: vpnservice_db.port_id,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7eE%3D","line":456,"updated":"2013-06-05 21:42:08.000000000","message":"parens","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":465,"context_line":"                                                )"},{"line_number":466,"context_line":"        else:"},{"line_number":467,"context_line":"            msg \u003d _(\"Router id specified does not have an external gateway\""},{"line_number":468,"context_line":"                    \" VPN Service create aborted \")"},{"line_number":469,"context_line":"            raise q_exc.BadRequest(resource\u003d\u0027vpnservice\u0027, msg\u003dmsg)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    def create_vpnservice(self, context, vpnservice):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7co%3D","line":468,"updated":"2013-06-05 21:42:08.000000000","message":"I\u0027d put the leading space at the end of the previous line, and remove the trailing space.","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":45,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":46,"context_line":"    transform_protocol \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":47,"context_line":"    auth_algorithm \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":48,"context_line":"    encryption_algorithm \u003d sa.Column(sa.Enum(\"3des\", \"aes-128\","},{"line_number":49,"context_line":"                                             \"aes-256\", \"aes-192\","},{"line_number":50,"context_line":"                                             name\u003d\"vpn_encrypt_algorithms\"),"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2FsOc%3D","line":47,"updated":"2013-06-12 18:31:12.000000000","message":"PCM commented before, but I think we need to use Enum also here.","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                                       name\u003d\"vpn_lifetime_units\"),"},{"line_number":57,"context_line":"                               nullable\u003dFalse)"},{"line_number":58,"context_line":"    lifetime_value \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":59,"context_line":"    pfs \u003d sa.Column(sa.Enum(\"Group2\", \"Group5\", \"Group14\","},{"line_number":60,"context_line":"                            name\u003d\"vpn_pfs\"), nullable\u003dFalse)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2FsOk%3D","line":59,"updated":"2013-06-12 18:31:12.000000000","message":"spec says Group1, Group2, Group5, Group14","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    ike_version \u003d sa.Column(sa.Enum(\"v1\", \"v2\", name\u003d\"ike_versions\"),"},{"line_number":78,"context_line":"                            nullable\u003dFalse)"},{"line_number":79,"context_line":"    pfs \u003d sa.Column(sa.Enum(\"Group2\", \"Group5\", \"Group14\","},{"line_number":80,"context_line":"                            name\u003d\"vpn_pfs\"), nullable\u003dFalse)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"class VPNConnection(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2FsOs%3D","line":80,"updated":"2013-06-12 18:31:12.000000000","message":"ditto","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    mtu \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":92,"context_line":"    initiator \u003d sa.Column(sa.Enum(\"bi-directional\", \"response-only\","},{"line_number":93,"context_line":"                                  name\u003d\"vpn_initiators\"), nullable\u003dFalse)"},{"line_number":94,"context_line":"    auth_mode \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":95,"context_line":"    psk \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":96,"context_line":"    dpd_action \u003d sa.Column(sa.Enum(\"hold\", \"clear\","},{"line_number":97,"context_line":"                                   \"restart\", \"disabled\","}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2FsOY%3D","line":94,"updated":"2013-06-12 18:31:12.000000000","message":"ditto","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    vpn_type \u003d sa.Column(sa.String(36))"},{"line_number":125,"context_line":"    status \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":126,"context_line":"    admin_state_up \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":127,"context_line":"    subnet_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027subnet.id\u0027),"},{"line_number":128,"context_line":"                          nullable\u003dFalse)"},{"line_number":129,"context_line":"    router_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027router.id\u0027),"},{"line_number":130,"context_line":"                          nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2Fr%2Bw%3D","line":127,"updated":"2013-06-12 19:32:30.000000000","message":"subnets.id","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    admin_state_up \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":127,"context_line":"    subnet_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027subnet.id\u0027),"},{"line_number":128,"context_line":"                          nullable\u003dFalse)"},{"line_number":129,"context_line":"    router_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027router.id\u0027),"},{"line_number":130,"context_line":"                          nullable\u003dFalse)"},{"line_number":131,"context_line":"    port_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027ports.id\u0027))"},{"line_number":132,"context_line":"    port \u003d orm.relationship(models_v2.Port)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2Fr%2Bs%3D","line":129,"updated":"2013-06-12 19:32:30.000000000","message":"routers.id","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"unresolved":false,"context_lines":[{"line_number":259,"context_line":"        vpnc \u003d vpnconnection[\u0027vpnconnection\u0027]"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":262,"context_line":"            vpnc_db \u003d self._get_resource(context, VPNConnection, vpn_conn_id)"},{"line_number":263,"context_line":"            if vpnc:"},{"line_number":264,"context_line":"                vpnc_db.update(vpnc)"},{"line_number":265,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2Fq7c%3D","line":262,"updated":"2013-06-13 05:12:26.000000000","message":"check the status of vpnc_db is needed to ensure the update operation is allowed","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"unresolved":false,"context_lines":[{"line_number":323,"context_line":"        ike \u003d ikepolicy[\u0027ikepolicy\u0027]"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":326,"context_line":"            ike_db \u003d self._get_resource(context, IKEPolicy, ikepolicy_id)"},{"line_number":327,"context_line":"            if ike:"},{"line_number":328,"context_line":"                ike_db.update(ike)"},{"line_number":329,"context_line":"        return self._make_ikepolicy_dict(ike_db)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2Fq7U%3D","line":326,"updated":"2013-06-13 05:12:26.000000000","message":"ditto","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"unresolved":false,"context_lines":[{"line_number":386,"context_line":"        ipsecp \u003d ipsecpolicy[\u0027ipsecpolicy\u0027]"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":389,"context_line":"            ipsecp_db \u003d self._get_resource(context,"},{"line_number":390,"context_line":"                                           IPsecPolicy,"},{"line_number":391,"context_line":"                                           ipsecpolicy_id)"},{"line_number":392,"context_line":"            if ipsecp:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2Fq7I%3D","line":389,"updated":"2013-06-13 05:12:26.000000000","message":"ditto","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":425,"context_line":"                                  in vpnservice[\u0027vpnconnections\u0027]]}"},{"line_number":426,"context_line":"        return self._fields(res, fields)"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"    def _create_port_for_vpnservice(self, context, vpnservice_db):"},{"line_number":429,"context_line":"        # resolve subnet and create port"},{"line_number":430,"context_line":"        subnet \u003d self._core_plugin.get_subnet(context, vpnservice_db.subnet_id)"},{"line_number":431,"context_line":"        fixed_ip \u003d {\u0027subnet_id\u0027: subnet[\u0027id\u0027]}"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2FrhA%3D","line":428,"updated":"2013-06-12 21:57:10.000000000","message":"unused now","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":442,"context_line":"            vpnservice_db.port_id \u003d port[\u0027id\u0027]"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"    def _create_port_and_floatingip_for_vpnservice(self,"},{"line_number":445,"context_line":"                                                   context,"},{"line_number":446,"context_line":"                                                   vpnservice_db,"},{"line_number":447,"context_line":"                                                   net_ext_id):"},{"line_number":448,"context_line":"        # resolve subnet and create port"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2Frg4%3D","line":445,"updated":"2013-06-12 21:57:10.000000000","message":"unused now","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":505,"context_line":""},{"line_number":506,"context_line":"            context.session.add(vpnservice_db)"},{"line_number":507,"context_line":"            # create a port to reserve address for IPAM"},{"line_number":508,"context_line":"            self._create_port_for_vpnservice(context, vpnservice_db)"},{"line_number":509,"context_line":"        return self._make_vpnservice_dict(vpnservice_db)"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"    def update_vpnservice(self, context, vpnservice_id, vpnservice):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2Frg0%3D","line":508,"updated":"2013-06-12 21:57:10.000000000","message":"This is not needed now","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"unresolved":false,"context_lines":[{"line_number":511,"context_line":"    def update_vpnservice(self, context, vpnservice_id, vpnservice):"},{"line_number":512,"context_line":"        vpns \u003d vpnservice[\u0027vpnservice\u0027]"},{"line_number":513,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":514,"context_line":"            vpns_db \u003d self._get_resource(context, VPNService, vpnservice_id)"},{"line_number":515,"context_line":"            if vpns:"},{"line_number":516,"context_line":"                vpns_db.update(vpns)"},{"line_number":517,"context_line":"        return self._make_vpnservice_dict(vpns_db)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2Fq7E%3D","line":514,"updated":"2013-06-13 05:12:26.000000000","message":"ditto","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":6820,"name":"Francois Eleouet","email":"f.eleouet@gmail.com","username":"fanchon"},"unresolved":false,"context_lines":[{"line_number":44,"context_line":"    transform_protocol \u003d sa.Column(sa.Enum(\"esp\", \"ah\", \"ah-esp\","},{"line_number":45,"context_line":"                                           name\u003d\"ipsec_transform_protocols\"),"},{"line_number":46,"context_line":"                                   nullable\u003dFalse)"},{"line_number":47,"context_line":"    auth_algorithm \u003d sa.Column(sa.Enum(\"sha1\","},{"line_number":48,"context_line":"                                       name\u003d\"vpn_auth_algorithms\"),"},{"line_number":49,"context_line":"                               nullable\u003dFalse)"},{"line_number":50,"context_line":"    encryption_algorithm \u003d sa.Column(sa.Enum(\"3des\", \"aes-128\","}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2F8Pw%3D","line":47,"updated":"2013-06-17 19:43:29.000000000","message":"Do we really have to use enums? A string could be much more convenient to store a list of possible algorithms in the future. (As this field is not used for indexing, storing a list shouldn\u0027t be a big deal).\nThus plugin will just have to send aglorithms lists to the agent, which in turn will be able to combine encryption and auth algorithms to build several proposals.","commit_id":"20ed2d384d0c81191f43b4fe6c6a2bb02e683523"},{"author":{"_account_id":6820,"name":"Francois Eleouet","email":"f.eleouet@gmail.com","username":"fanchon"},"unresolved":false,"context_lines":[{"line_number":47,"context_line":"    auth_algorithm \u003d sa.Column(sa.Enum(\"sha1\","},{"line_number":48,"context_line":"                                       name\u003d\"vpn_auth_algorithms\"),"},{"line_number":49,"context_line":"                               nullable\u003dFalse)"},{"line_number":50,"context_line":"    encryption_algorithm \u003d sa.Column(sa.Enum(\"3des\", \"aes-128\","},{"line_number":51,"context_line":"                                             \"aes-256\", \"aes-192\","},{"line_number":52,"context_line":"                                             name\u003d\"vpn_encrypt_algorithms\"),"},{"line_number":53,"context_line":"                                     nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2F8Ps%3D","line":50,"updated":"2013-06-17 19:43:29.000000000","message":"Ditto","commit_id":"20ed2d384d0c81191f43b4fe6c6a2bb02e683523"},{"author":{"_account_id":6820,"name":"Francois Eleouet","email":"f.eleouet@gmail.com","username":"fanchon"},"unresolved":false,"context_lines":[{"line_number":58,"context_line":"                                       name\u003d\"vpn_lifetime_units\"),"},{"line_number":59,"context_line":"                               nullable\u003dFalse)"},{"line_number":60,"context_line":"    lifetime_value \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":61,"context_line":"    pfs \u003d sa.Column(sa.Enum(\"Group2\", \"Group5\", \"Group14\","},{"line_number":62,"context_line":"                            name\u003d\"vpn_pfs\"), nullable\u003dFalse)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2F8Po%3D","line":61,"updated":"2013-06-17 19:43:29.000000000","message":"Ditto","commit_id":"20ed2d384d0c81191f43b4fe6c6a2bb02e683523"},{"author":{"_account_id":6820,"name":"Francois Eleouet","email":"f.eleouet@gmail.com","username":"fanchon"},"unresolved":false,"context_lines":[{"line_number":66,"context_line":"    \"\"\"Represents a v2 IKEPolicy Object.\"\"\""},{"line_number":67,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":68,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":69,"context_line":"    auth_algorithm \u003d sa.Column(sa.Enum(\"sha1\","},{"line_number":70,"context_line":"                                       name\u003d\"vpn_auth_algorithms\"),"},{"line_number":71,"context_line":"                               nullable\u003dFalse)"},{"line_number":72,"context_line":"    encryption_algorithm \u003d sa.Column(sa.Enum(\"3des\", \"aes-128\","}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2F8Pg%3D","line":69,"updated":"2013-06-17 19:43:29.000000000","message":"Ditto","commit_id":"20ed2d384d0c81191f43b4fe6c6a2bb02e683523"},{"author":{"_account_id":6820,"name":"Francois Eleouet","email":"f.eleouet@gmail.com","username":"fanchon"},"unresolved":false,"context_lines":[{"line_number":69,"context_line":"    auth_algorithm \u003d sa.Column(sa.Enum(\"sha1\","},{"line_number":70,"context_line":"                                       name\u003d\"vpn_auth_algorithms\"),"},{"line_number":71,"context_line":"                               nullable\u003dFalse)"},{"line_number":72,"context_line":"    encryption_algorithm \u003d sa.Column(sa.Enum(\"3des\", \"aes-128\","},{"line_number":73,"context_line":"                                             \"aes-256\", \"aes-192\","},{"line_number":74,"context_line":"                                             name\u003d\"vpn_encrypt_algorithms\"),"},{"line_number":75,"context_line":"                                     nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2F8Pk%3D","line":72,"updated":"2013-06-17 19:43:29.000000000","message":"Ditto","commit_id":"20ed2d384d0c81191f43b4fe6c6a2bb02e683523"},{"author":{"_account_id":6820,"name":"Francois Eleouet","email":"f.eleouet@gmail.com","username":"fanchon"},"unresolved":false,"context_lines":[{"line_number":82,"context_line":"    lifetime_value \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":83,"context_line":"    ike_version \u003d sa.Column(sa.Enum(\"v1\", \"v2\", name\u003d\"ike_versions\"),"},{"line_number":84,"context_line":"                            nullable\u003dFalse)"},{"line_number":85,"context_line":"    pfs \u003d sa.Column(sa.Enum(\"Group2\", \"Group5\", \"Group14\","},{"line_number":86,"context_line":"                            name\u003d\"vpn_pfs\"), nullable\u003dFalse)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2F8Pc%3D","line":85,"updated":"2013-06-17 19:43:29.000000000","message":"Ditto","commit_id":"20ed2d384d0c81191f43b4fe6c6a2bb02e683523"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":139,"context_line":"    \"\"\"Represents a v2 VPNService Object.\"\"\""},{"line_number":140,"context_line":"    name \u003d sa.Column(sa.String(64))"},{"line_number":141,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":142,"context_line":"    vpn_type \u003d sa.Column(sa.String(36))"},{"line_number":143,"context_line":"    status \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":144,"context_line":"    admin_state_up \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":145,"context_line":"    subnet_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027subnets.id\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2FXy8%3D","line":142,"updated":"2013-07-03 05:16:42.000000000","message":"I\u0027m concerned about this field,\nIf it will point to the driver in the end (according to Nachi\u0027s review), please consider utilizing service type framework for it. That will simplify a couple of things.\n\nIn fact, you simply doesn\u0027t need this field here, because driver will be chosen in a bit different way","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"601f787b7dbe783dc43451c0fb2145cbcca85b44","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        if status \u003d\u003d constants.PENDING_DELETE:"},{"line_number":193,"context_line":"            raise vpnaas.StateInvalid(id\u003did, state\u003dstatus)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    # VPNConnection DB access"},{"line_number":196,"context_line":"    def _make_vpnconnection_dict(self, vpn_conn, fields\u003dNone):"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        res \u003d {\u0027id\u0027: vpn_conn[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2FjCg%3D","line":195,"updated":"2013-06-28 00:27:39.000000000","message":"Please use docstring format","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"601f787b7dbe783dc43451c0fb2145cbcca85b44","unresolved":false,"context_lines":[{"line_number":327,"context_line":"                                    self._make_vpnconnection_dict,"},{"line_number":328,"context_line":"                                    filters\u003dfilters, fields\u003dfields)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    # IKEPolicy DB Access"},{"line_number":331,"context_line":"    def _make_ikepolicy_dict(self, ikepolicy, fields\u003dNone):"},{"line_number":332,"context_line":"        res \u003d {\u0027id\u0027: ikepolicy[\u0027id\u0027],"},{"line_number":333,"context_line":"               \u0027tenant_id\u0027: ikepolicy[\u0027tenant_id\u0027],"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2FjCc%3D","line":330,"updated":"2013-06-28 00:27:39.000000000","message":"Please use docstring format","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"601f787b7dbe783dc43451c0fb2145cbcca85b44","unresolved":false,"context_lines":[{"line_number":394,"context_line":"                                    self._make_ikepolicy_dict,"},{"line_number":395,"context_line":"                                    filters\u003dfilters, fields\u003dfields)"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"    # IPsecPolicy DB Access"},{"line_number":398,"context_line":"    def _make_ipsecpolicy_dict(self, ipsecpolicy, fields\u003dNone):"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"        res \u003d {\u0027id\u0027: ipsecpolicy[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2FjCY%3D","line":397,"updated":"2013-06-28 00:27:39.000000000","message":"Please use docstring format","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"601f787b7dbe783dc43451c0fb2145cbcca85b44","unresolved":false,"context_lines":[{"line_number":463,"context_line":"                                    self._make_ipsecpolicy_dict,"},{"line_number":464,"context_line":"                                    filters\u003dfilters, fields\u003dfields)"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"    #  VPNService DB Access"},{"line_number":467,"context_line":"    def _make_vpnservice_dict(self, vpnservice, fields\u003dNone):"},{"line_number":468,"context_line":"        res \u003d {\u0027id\u0027: vpnservice[\u0027id\u0027],"},{"line_number":469,"context_line":"               \u0027name\u0027: vpnservice[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2FjCU%3D","line":466,"updated":"2013-06-28 00:27:39.000000000","message":"Please use docstring format","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":33,"context_line":"from quantum.openstack.common import uuidutils"},{"line_number":34,"context_line":"from quantum.plugins.common import constants"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class IPsecPeerCidr(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPn%2F%2FTOE%3D","line":36,"updated":"2013-07-04 15:39:08.000000000","message":"LOG is unused","commit_id":"c8b53c5962d49bf108b81d1e54f1ad9c1742a585"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":235,"context_line":"                qry \u003d context.session.query(IKEPolicy)"},{"line_number":236,"context_line":"                qry.filter_by(id\u003dvpnc[\u0027ikepolicy_id\u0027]).one()"},{"line_number":237,"context_line":"            except exc.NoResultFound:"},{"line_number":238,"context_line":"                raise vpnaas.IKEPolicyNotFound(ikepolicy_id\u003dvpnc[\u0027ikepolicy\u0027"},{"line_number":239,"context_line":"                                                                 \u0027_id\u0027])"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPn%2F%2FTNg%3D","line":238,"updated":"2013-07-04 15:39:08.000000000","message":"Consider new line after IKEPolicyNotFound(","commit_id":"c8b53c5962d49bf108b81d1e54f1ad9c1742a585"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":242,"context_line":"                qry \u003d context.session.query(IPsecPolicy)"},{"line_number":243,"context_line":"                qry.filter_by(id\u003dvpnc[\u0027ipsecpolicy_id\u0027]).one()"},{"line_number":244,"context_line":"            except exc.NoResultFound:"},{"line_number":245,"context_line":"                raise vpnaas.IPsecPolicyNotFound(ipsecpolicy_id\u003dvpnc[\u0027ipsec\u0027"},{"line_number":246,"context_line":"                                                                     \u0027policy\u0027"},{"line_number":247,"context_line":"                                                                     \u0027_id\u0027])"},{"line_number":248,"context_line":"            vpn_conn_db \u003d VPNConnection(id\u003duuidutils.generate_uuid(),"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPn%2F%2FTNQ%3D","line":245,"updated":"2013-07-04 15:39:08.000000000","message":"ditto","commit_id":"c8b53c5962d49bf108b81d1e54f1ad9c1742a585"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":348,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, ike)"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":351,"context_line":"            ike_db \u003d IKEPolicy(id\u003duuidutils.generate_uuid(),"},{"line_number":352,"context_line":"                               tenant_id\u003dtenant_id,"},{"line_number":353,"context_line":"                               name\u003dike[\u0027name\u0027],"},{"line_number":354,"context_line":"                               description\u003dike[\u0027description\u0027],"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPn%2F%2FTMw%3D","line":351,"updated":"2013-07-04 15:39:08.000000000","message":"ditto","commit_id":"c8b53c5962d49bf108b81d1e54f1ad9c1742a585"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":36,"context_line":"class IPsecPeerCidr(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"},{"line_number":37,"context_line":"    \"\"\"Internal representation of a IPsec Peer Cidrs.\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    cidr \u003d sa.Column(sa.String(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":40,"context_line":"    vpnconnection_id \u003d sa.Column(sa.String(36),"},{"line_number":41,"context_line":"                                 sa.ForeignKey(\u0027vpnconnections.id\u0027,"},{"line_number":42,"context_line":"                                               ondelete\u003d\"CASCADE\"),"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP3g%3D","line":39,"updated":"2013-07-06 13:00:53.000000000","message":"255 seems to be too much for a cidr?","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":98,"context_line":"    description \u003d sa.Column(sa.String(255))"},{"line_number":99,"context_line":"    peer_address \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":100,"context_line":"    peer_id \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":101,"context_line":"    #peer_cidrs \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":102,"context_line":"    route_mode \u003d sa.Column(sa.String(8), nullable\u003dFalse)"},{"line_number":103,"context_line":"    mtu \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":104,"context_line":"    initiator \u003d sa.Column(sa.Enum(\"bi-directional\", \"response-only\","}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP3w%3D","line":101,"updated":"2013-07-06 13:00:53.000000000","message":"remove?","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":113,"context_line":"    dpd_timeout \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":114,"context_line":"    status \u003d sa.Column(sa.String(16), nullable\u003dFalse)"},{"line_number":115,"context_line":"    admin_state_up \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":116,"context_line":"    vpnservice_id \u003d sa.Column(sa.String(255),"},{"line_number":117,"context_line":"                              sa.ForeignKey(\u0027vpnservices.id\u0027,"},{"line_number":118,"context_line":"                                            ondelete\u003d\"CASCADE\"),"},{"line_number":119,"context_line":"                              nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP3s%3D","line":116,"updated":"2013-07-06 13:00:53.000000000","message":"ids are sa.String(36)","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":117,"context_line":"                              sa.ForeignKey(\u0027vpnservices.id\u0027,"},{"line_number":118,"context_line":"                                            ondelete\u003d\"CASCADE\"),"},{"line_number":119,"context_line":"                              nullable\u003dFalse)"},{"line_number":120,"context_line":"    ipsecpolicy_id \u003d sa.Column(sa.String(255),"},{"line_number":121,"context_line":"                               sa.ForeignKey(\u0027ipsecpolicys.id\u0027,"},{"line_number":122,"context_line":"                                             ondelete\u003d\"CASCADE\"),"},{"line_number":123,"context_line":"                               nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP3o%3D","line":120,"updated":"2013-07-06 13:00:53.000000000","message":"ditto","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":121,"context_line":"                               sa.ForeignKey(\u0027ipsecpolicys.id\u0027,"},{"line_number":122,"context_line":"                                             ondelete\u003d\"CASCADE\"),"},{"line_number":123,"context_line":"                               nullable\u003dFalse)"},{"line_number":124,"context_line":"    ikepolicy_id \u003d sa.Column(sa.String(255),"},{"line_number":125,"context_line":"                             sa.ForeignKey(\u0027ikepolicys.id\u0027,"},{"line_number":126,"context_line":"                                           ondelete\u003d\"CASCADE\"),"},{"line_number":127,"context_line":"                             nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP3k%3D","line":124,"updated":"2013-07-06 13:00:53.000000000","message":"ditto","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def _get_peer_cidr_by_vpnconnection(self, context, vpn_conn_id):"},{"line_number":184,"context_line":"        peer_cidr_qry \u003d context.session.query(IPsecPeerCidr)"},{"line_number":185,"context_line":"        return peer_cidr_qry.filter_by(vpnconnection_id\u003dvpn_conn_id).all()"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def assert_update_allowed(self, obj):"},{"line_number":188,"context_line":"        status \u003d getattr(obj, \u0027status\u0027, None)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP3Y%3D","line":185,"updated":"2013-07-06 13:00:53.000000000","message":"nit: may remove .all() as query could be used as iterator (in fact, it\u0027s how it is used in update_vpnconnection)","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":223,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"            try:"},{"line_number":226,"context_line":"                qry \u003d context.session.query(VPNService)"},{"line_number":227,"context_line":"                qry.filter_by(id\u003dvpnc[\u0027vpnservice_id\u0027]).one()"},{"line_number":228,"context_line":"            except exc.NoResultFound:"},{"line_number":229,"context_line":"                raise vpnaas.VPNServiceNotFound(comm_id\u003dvpnc[\u0027vpnservice_id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP3U%3D","line":226,"updated":"2013-07-06 13:00:53.000000000","message":"i think this block should be changed to self._get_resource()","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":228,"context_line":"            except exc.NoResultFound:"},{"line_number":229,"context_line":"                raise vpnaas.VPNServiceNotFound(comm_id\u003dvpnc[\u0027vpnservice_id\u0027])"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"            try:"},{"line_number":232,"context_line":"                qry \u003d context.session.query(IKEPolicy)"},{"line_number":233,"context_line":"                qry.filter_by(id\u003dvpnc[\u0027ikepolicy_id\u0027]).one()"},{"line_number":234,"context_line":"            except exc.NoResultFound:"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP3Q%3D","line":231,"updated":"2013-07-06 13:00:53.000000000","message":"ditto","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":237,"context_line":"                )"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"            try:"},{"line_number":240,"context_line":"                qry \u003d context.session.query(IPsecPolicy)"},{"line_number":241,"context_line":"                qry.filter_by(id\u003dvpnc[\u0027ipsecpolicy_id\u0027]).one()"},{"line_number":242,"context_line":"            except exc.NoResultFound:"},{"line_number":243,"context_line":"                raise vpnaas.IPsecPolicyNotFound("}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP3M%3D","line":240,"updated":"2013-07-06 13:00:53.000000000","message":"ditto","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":302,"context_line":"            vpnc_db \u003d self._get_resource(context,"},{"line_number":303,"context_line":"                                         VPNConnection,"},{"line_number":304,"context_line":"                                         vpn_conn_id)"},{"line_number":305,"context_line":"            self.assert_update_allowed(vpnc_db)"},{"line_number":306,"context_line":"            if vpnc:"},{"line_number":307,"context_line":"                vpnc_db.update(vpnc)"},{"line_number":308,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP3E%3D","line":305,"updated":"2013-07-06 13:00:53.000000000","message":"Is it ok to call assert_update_allowed _after_ you have added/deleted some cidrs?","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":379,"context_line":"            raise vpnaas.IKEPolicyInUse(ikepolicy_id\u003dikepolicy_id)"},{"line_number":380,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":381,"context_line":"            ike_db \u003d self._get_resource(context, IKEPolicy, ikepolicy_id)"},{"line_number":382,"context_line":"            context.session.delete(ike_db)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    def get_ikepolicy(self, context, ikepolicy_id, fields\u003dNone):"},{"line_number":385,"context_line":"        ike_db \u003d self._get_resource(context, IKEPolicy, ikepolicy_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP3A%3D","line":382,"updated":"2013-07-06 13:00:53.000000000","message":"while highly unlikely, but code above may result in race condition when connection is removed between 377 and 380\n\nquestion: is it possible to catch IntegrityError here? That may save you check at the beginning of the method.\nIn this case you\u0027ll need to do explicit flush:\n\ntry:\n    context.session.delete(ike_db)\n    context.session.flush()\nexcept sa_exc.IntegrityError:\n    raise ...","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":445,"context_line":"            ipsecpolicy_id\u003dipsecpolicy_id).first()"},{"line_number":446,"context_line":"        if ipsecpolicy:"},{"line_number":447,"context_line":"            raise vpnaas.IPsecPolicyInUse(ipsecpolicy_id\u003dipsecpolicy_id)"},{"line_number":448,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":449,"context_line":"            ipsec_db \u003d self._get_resource(context, IPsecPolicy, ipsecpolicy_id)"},{"line_number":450,"context_line":"            context.session.delete(ipsec_db)"},{"line_number":451,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP28%3D","line":448,"updated":"2013-07-06 13:00:53.000000000","message":"ditto","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"}],"quantum/extensions/vpnaas.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"\r"},{"line_number":29,"context_line":"# VPNaaS Exceptions\r"},{"line_number":30,"context_line":"class VPNServiceNotFound(qexception.NotFound):\r"},{"line_number":31,"context_line":"    message \u003d _(\"VPNService %(vpnservice_id)s could not be found\")\r"},{"line_number":32,"context_line":"\r"},{"line_number":33,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4G8%3D","line":30,"updated":"2013-05-21 07:59:38.000000000","message":"I think these belong to DbPlugin","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"unresolved":false,"context_lines":[{"line_number":32,"context_line":"\r"},{"line_number":33,"context_line":"\r"},{"line_number":34,"context_line":"class VPNServiceConnectionNotFound(qexception.NotFound):\r"},{"line_number":35,"context_line":"    message \u003d _(\"IPsecVPNService Connection %(ipsecvpnservice_conn_id)s not\"\\\r"},{"line_number":36,"context_line":"                \"found\")\r"},{"line_number":37,"context_line":"\r"},{"line_number":38,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3xw%3D","line":35,"updated":"2013-05-21 09:31:48.000000000","message":"remove backslash","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":51,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},\r"},{"line_number":52,"context_line":"               \u0027is_visible\u0027: True,\r"},{"line_number":53,"context_line":"               \u0027primary_key\u0027: True},\r"},{"line_number":54,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,\r"},{"line_number":55,"context_line":"                      \u0027validate\u0027: {\u0027type:string\u0027: None},\r"},{"line_number":56,"context_line":"                      \u0027required_by_policy\u0027: True,\r"},{"line_number":57,"context_line":"                      \u0027is_visible\u0027: True},\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3NE%3D","line":54,"updated":"2013-05-21 15:18:55.000000000","message":"In all of these maps, I see tenant_id as string, but id as uuid type. Is that correct?","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":51,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},\r"},{"line_number":52,"context_line":"               \u0027is_visible\u0027: True,\r"},{"line_number":53,"context_line":"               \u0027primary_key\u0027: True},\r"},{"line_number":54,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,\r"},{"line_number":55,"context_line":"                      \u0027validate\u0027: {\u0027type:string\u0027: None},\r"},{"line_number":56,"context_line":"                      \u0027required_by_policy\u0027: True,\r"},{"line_number":57,"context_line":"                      \u0027is_visible\u0027: True},\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F1%2FU%3D","line":54,"in_reply_to":"AAAAPH%2F%2F3NE%3D","updated":"2013-05-21 21:11:00.000000000","message":"it is so in all other extensions as well.","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        \u0027router_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,\r"},{"line_number":68,"context_line":"                      \u0027validate\u0027: {\u0027type:uuid\u0027: None},\r"},{"line_number":69,"context_line":"                      \u0027is_visible\u0027: True},\r"},{"line_number":70,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,\r"},{"line_number":71,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,\r"},{"line_number":72,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address_or_none\u0027: None},\r"},{"line_number":73,"context_line":"                    \u0027is_visible\u0027: True},\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3OE%3D","line":70,"updated":"2013-05-21 15:18:55.000000000","message":"What is this attribute? Didn\u0027t see in model.","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                       \u0027is_visible\u0027: True},\r"},{"line_number":144,"context_line":"        \u0027dpd_interval\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":145,"context_line":"                         \u0027default\u0027: \u002730\u0027,\r"},{"line_number":146,"context_line":"                         \u0027validate\u0027: {\u0027type:non_negative\u0027: None},\r"},{"line_number":147,"context_line":"                         \u0027convert_to\u0027: attr.convert_to_int,\r"},{"line_number":148,"context_line":"                         \u0027is_visible\u0027: True},\r"},{"line_number":149,"context_line":"        \u0027dpd_timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3No%3D","line":146,"updated":"2013-05-21 15:18:55.000000000","message":"Is there a type definition for \"positive\" numbers, or is that enforced in validation code?","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                         \u0027convert_to\u0027: attr.convert_to_int,\r"},{"line_number":148,"context_line":"                         \u0027is_visible\u0027: True},\r"},{"line_number":149,"context_line":"        \u0027dpd_timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":150,"context_line":"                        \u0027default\u0027: \u0027150\u0027,\r"},{"line_number":151,"context_line":"                        \u0027validate\u0027: {\u0027type:non_negative\u0027: None},\r"},{"line_number":152,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,\r"},{"line_number":153,"context_line":"                        \u0027is_visible\u0027: True},\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3N8%3D","line":150,"updated":"2013-05-21 15:18:55.000000000","message":"120? otherwise Wiki is out of date.","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                        \u0027validate\u0027: {\u0027type:non_negative\u0027: None},\r"},{"line_number":152,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,\r"},{"line_number":153,"context_line":"                        \u0027is_visible\u0027: True},\r"},{"line_number":154,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":155,"context_line":"                           \u0027default\u0027: True,\r"},{"line_number":156,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,\r"},{"line_number":157,"context_line":"                           \u0027is_visible\u0027: True},\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3Nk%3D","line":154,"updated":"2013-05-21 15:18:55.000000000","message":"admin_status_up in Wiki?","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                           \u0027is_visible\u0027: True},\r"},{"line_number":158,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,\r"},{"line_number":159,"context_line":"                   \u0027is_visible\u0027: True},\r"},{"line_number":160,"context_line":"        \u0027vpnservice_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":161,"context_line":"                          \u0027is_visible\u0027: True},\r"},{"line_number":162,"context_line":"        \u0027vpnservice_ikepolicy_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":163,"context_line":"                                    \u0027is_visible\u0027: True},\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3NM%3D","line":160,"updated":"2013-05-21 15:18:55.000000000","message":"Should updates be allowed on these three (if so, the Wiki needs updating).","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                               \u0027is_visible\u0027: True},\r"},{"line_number":190,"context_line":"        \u0027auth_algorithm\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":191,"context_line":"                           \u0027default\u0027: \u0027sha1\u0027,\r"},{"line_number":192,"context_line":"                           \u0027validate\u0027: {\u0027type:values\u0027: [\u0027sha1\u0027, \u0027md5\u0027]},\r"},{"line_number":193,"context_line":"                           \u0027is_visible\u0027: True},\r"},{"line_number":194,"context_line":"        \u0027encryption_algorithm\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":195,"context_line":"                                 \u0027default\u0027: \u0027aes-128\u0027,\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4bo%3D","line":192,"updated":"2013-05-21 02:14:47.000000000","message":"md5 is not secure, we can remove the md5 support here","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6820,"name":"Francois Eleouet","email":"f.eleouet@gmail.com","username":"fanchon"},"unresolved":false,"context_lines":[{"line_number":189,"context_line":"                               \u0027is_visible\u0027: True},\r"},{"line_number":190,"context_line":"        \u0027auth_algorithm\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":191,"context_line":"                           \u0027default\u0027: \u0027sha1\u0027,\r"},{"line_number":192,"context_line":"                           \u0027validate\u0027: {\u0027type:values\u0027: [\u0027sha1\u0027, \u0027md5\u0027]},\r"},{"line_number":193,"context_line":"                           \u0027is_visible\u0027: True},\r"},{"line_number":194,"context_line":"        \u0027encryption_algorithm\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":195,"context_line":"                                 \u0027default\u0027: \u0027aes-128\u0027,\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F2Os%3D","line":192,"in_reply_to":"AAAAPH%2F%2F4bo%3D","updated":"2013-05-21 20:50:25.000000000","message":"From http://tools.ietf.org/html/rfc6151, not that insecure for hmac (as used in ipsec), as it still provides 123bit strength.","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                           \u0027is_visible\u0027: True},\r"},{"line_number":194,"context_line":"        \u0027encryption_algorithm\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":195,"context_line":"                                 \u0027default\u0027: \u0027aes-128\u0027,\r"},{"line_number":196,"context_line":"                                 \u0027validate\u0027: {\u0027type:values\u0027: [\u0027des\u0027,\r"},{"line_number":197,"context_line":"                                                              \u00273des\u0027,\r"},{"line_number":198,"context_line":"                                                              \u0027aes-128\u0027,\r"},{"line_number":199,"context_line":"                                                              \u0027aes-192\u0027,\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4bQ%3D","line":196,"updated":"2013-05-21 02:14:47.000000000","message":"des is not secure and recommended, we can remove the des support here. Suggest to add aes-gcm support. aes-gcm has high performance than aes-cbc, it also meets the secure strength requirement.","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6820,"name":"Francois Eleouet","email":"f.eleouet@gmail.com","username":"fanchon"},"unresolved":false,"context_lines":[{"line_number":193,"context_line":"                           \u0027is_visible\u0027: True},\r"},{"line_number":194,"context_line":"        \u0027encryption_algorithm\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":195,"context_line":"                                 \u0027default\u0027: \u0027aes-128\u0027,\r"},{"line_number":196,"context_line":"                                 \u0027validate\u0027: {\u0027type:values\u0027: [\u0027des\u0027,\r"},{"line_number":197,"context_line":"                                                              \u00273des\u0027,\r"},{"line_number":198,"context_line":"                                                              \u0027aes-128\u0027,\r"},{"line_number":199,"context_line":"                                                              \u0027aes-192\u0027,\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F2Og%3D","line":196,"in_reply_to":"AAAAPH%2F%2F4bQ%3D","updated":"2013-05-21 20:50:25.000000000","message":"+1, all the more as des is not any more supported in strongswan...","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6820,"name":"Francois Eleouet","email":"f.eleouet@gmail.com","username":"fanchon"},"unresolved":false,"context_lines":[{"line_number":217,"context_line":"        \u0027pfs\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":218,"context_line":"                \u0027default\u0027: \u0027group2\u0027,\r"},{"line_number":219,"context_line":"                \u0027validate\u0027: {\u0027type:values\u0027: [\u0027group1\u0027,\r"},{"line_number":220,"context_line":"                                             \u0027group2\u0027,\r"},{"line_number":221,"context_line":"                                             \u0027group5\u0027,\r"},{"line_number":222,"context_line":"                                             \u0027group14\u0027]},\r"},{"line_number":223,"context_line":"                \u0027is_visible\u0027: True},\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F2K0%3D","line":220,"updated":"2013-05-21 20:50:25.000000000","message":"Group1 will not be supported in *swan as packaged in distos. Group 2 is quite insecure too (about 70~80 bits strenght... see http://tools.ietf.org/html/rfc3766#page-19)","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        \u0027auth_algorithm\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":244,"context_line":"                           \u0027default\u0027: \u0027sha1\u0027,\r"},{"line_number":245,"context_line":"                           \u0027validate\u0027: {\u0027type:values\u0027: [\u0027sha1\u0027,\r"},{"line_number":246,"context_line":"                                                        \u0027md5\u0027]},\r"},{"line_number":247,"context_line":"                           \u0027is_visible\u0027: True},\r"},{"line_number":248,"context_line":"        \u0027encryption_algorithm\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":249,"context_line":"                                 \u0027default\u0027: \u0027aes-128\u0027,\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4bM%3D","line":246,"updated":"2013-05-21 02:14:47.000000000","message":"the same as ipsec_policy","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":247,"context_line":"                           \u0027is_visible\u0027: True},\r"},{"line_number":248,"context_line":"        \u0027encryption_algorithm\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":249,"context_line":"                                 \u0027default\u0027: \u0027aes-128\u0027,\r"},{"line_number":250,"context_line":"                                 \u0027validate\u0027: {\u0027type:values\u0027: [\u0027des\u0027,\r"},{"line_number":251,"context_line":"                                                              \u00273des\u0027,\r"},{"line_number":252,"context_line":"                                                              \u0027aes-128\u0027,\r"},{"line_number":253,"context_line":"                                                              \u0027aes-192\u0027,\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4bI%3D","line":250,"updated":"2013-05-21 02:14:47.000000000","message":"the same as ipsec_policy","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6820,"name":"Francois Eleouet","email":"f.eleouet@gmail.com","username":"fanchon"},"unresolved":false,"context_lines":[{"line_number":258,"context_line":"                                    \u0027validate\u0027: {\u0027type:values\u0027:\r"},{"line_number":259,"context_line":"                                                  [\u0027main\u0027, \u0027aggressive\u0027]\r"},{"line_number":260,"context_line":"                                                  },\r"},{"line_number":261,"context_line":"                                    \u0027is_visible\u0027: True},\r"},{"line_number":262,"context_line":"        \u0027lifetime_units\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,\r"},{"line_number":263,"context_line":"                           \u0027default\u0027: \u0027seconds\u0027,\r"},{"line_number":264,"context_line":"                           \u0027validate\u0027: {\u0027type:values\u0027: [\u0027seconds\u0027,\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F2J0%3D","line":261,"updated":"2013-05-21 20:50:25.000000000","message":"Agressive mode used in conjonction with PSK is subject to MITM attacks. Plus it is not supported in IKEv2. You may consider removing this parameter.","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"unresolved":false,"context_lines":[{"line_number":298,"context_line":"\r"},{"line_number":299,"context_line":"    @classmethod\r"},{"line_number":300,"context_line":"    def get_namespace(cls):\r"},{"line_number":301,"context_line":"        return \"http://wiki.openstack.org/Quantum/VPNaaS/API_1.0\"\r"},{"line_number":302,"context_line":"\r"},{"line_number":303,"context_line":"    @classmethod\r"},{"line_number":304,"context_line":"    def get_updated(cls):\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3xg%3D","line":301,"updated":"2013-05-21 09:31:48.000000000","message":"don\u0027t forget to create page, or point to the correct URL","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":7617,"name":"Qin Li","email":"qili@vmware.com"},"change_message_id":"65fef3570737788f59b77b245b48bf777d931e11","unresolved":false,"context_lines":[{"line_number":379,"context_line":"        pass\r"},{"line_number":380,"context_line":"\r"},{"line_number":381,"context_line":"    @abc.abstractmethod\r"},{"line_number":382,"context_line":"    def get_vpnserviceconnections(self, context, filters\u003dNone, fields\u003dNone):\r"},{"line_number":383,"context_line":"        pass\r"},{"line_number":384,"context_line":"\r"},{"line_number":385,"context_line":"    @abc.abstractmethod\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4a4%3D","line":382,"updated":"2013-05-21 02:14:47.000000000","message":"Suggest to reconsider the naming for vpnserviceconnections.\r\nLike ikepolicy we do not call it vpnserviceikepolicy.  So recommend to naming vpnserviceconnection to vpnconnection.   There is no difference between vpnserviceconnection and vpnconnection. even with name vpnconnection, user can know it is belong to vpnservice.","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class VPNConnectionNotFound(qexception.NotFound):"},{"line_number":37,"context_line":"    message \u003d _(\"VPNConnection %(vpn_conn_id)s not\""},{"line_number":38,"context_line":"                \"found\")"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fgq4%3D","line":37,"updated":"2013-05-31 15:20:44.000000000","message":"either add a space after the \"not\" or add space and found on same line","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":60,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":61,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":62,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":63,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":64,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":65,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fgqw%3D","line":62,"updated":"2013-05-31 15:20:44.000000000","message":"\u0027default\u0027 : \u0027\u0027?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        \u0027router_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":70,"context_line":"                      \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":71,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":72,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":73,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":74,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address_or_none\u0027: None},"},{"line_number":75,"context_line":"                    \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FgqU%3D","line":72,"updated":"2013-05-31 15:20:44.000000000","message":"Is this a field in services table?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":102,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":103,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":104,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":105,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":106,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":107,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FgqM%3D","line":104,"updated":"2013-05-31 15:20:44.000000000","message":"empty string for default?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":179,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":180,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":181,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":182,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":183,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":184,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fgp8%3D","line":181,"updated":"2013-05-31 15:20:44.000000000","message":"Default empty string?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":235,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":236,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":237,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":238,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":239,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":240,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":241,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FgpU%3D","line":238,"updated":"2013-05-31 15:20:44.000000000","message":"Default empty string","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":253,"context_line":"                                 \u0027is_visible\u0027: True},"},{"line_number":254,"context_line":"        \u0027phase1_negotiation_mode\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":255,"context_line":"                                    \u0027default\u0027: \u0027main\u0027,"},{"line_number":256,"context_line":"                                    \u0027validate\u0027: {\u0027type:values\u0027: [\u0027main\u0027]},"},{"line_number":257,"context_line":"                                    \u0027is_visible\u0027: True},"},{"line_number":258,"context_line":"        \u0027lifetime_units\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":259,"context_line":"                           \u0027default\u0027: \u0027seconds\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FgpI%3D","line":256,"updated":"2013-05-31 15:20:44.000000000","message":"Is the other mode \u0027aggressive\u0027? If so, should it be listed?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":281,"context_line":"}"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"class Vpnaas(extensions.ExtensionDescriptor):"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    @classmethod"},{"line_number":287,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fgok%3D","line":284,"updated":"2013-05-31 15:20:44.000000000","message":"Other places are using VPNblah, should this be the same?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                      \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":70,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":71,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":72,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":73,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address_or_none\u0027: None},"},{"line_number":74,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":75,"context_line":"        \u0027port_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F2L0%3D","line":72,"updated":"2013-06-07 17:25:28.000000000","message":"\u0027address\u0027 is not in spec \nhttps://wiki.openstack.org/wiki/Quantum/VPNaaS\n\nWhat\u0027s is this for?","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    },"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    \u0027ipsecpolicys\u0027: {"},{"line_number":171,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":172,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":173,"context_line":"               \u0027is_visible\u0027: True,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7Sc%3D","line":170,"updated":"2013-06-05 21:42:08.000000000","message":"Do we use the ipsecpolicies spelling? Same for IKE.","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":280,"context_line":"}"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"class Vpnaas(extensions.ExtensionDescriptor):"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    @classmethod"},{"line_number":286,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7R8%3D","line":283,"updated":"2013-06-05 21:42:08.000000000","message":"Just a nit, but we seem to be using VPN... elsewhere. Should it be Vpn or VPN?\n\nFor others, we use IPsec and IKE in the APIs. Just wondering about naming consistency.","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5e7228e9d68b7fcb45995be4326d90d9ebee9bdc","unresolved":false,"context_lines":[{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    @classmethod"},{"line_number":306,"context_line":"    def get_resources(cls):"},{"line_number":307,"context_line":"        my_plurals \u003d [(key, key[:-1]) for key in RESOURCE_ATTRIBUTE_MAP.keys()]"},{"line_number":308,"context_line":"        attr.PLURALS.update(dict(my_plurals))"},{"line_number":309,"context_line":"        resources \u003d []"},{"line_number":310,"context_line":"        plugin \u003d manager.QuantumManager.get_service_plugins()["}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F7PQ%3D","line":307,"updated":"2013-06-05 21:42:08.000000000","message":"Ah, I see why you use policys.","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":110,"context_line":"        \u0027peer_cidrs\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":111,"context_line":"                       \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":112,"context_line":"                       \u0027is_visible\u0027: True},"},{"line_number":113,"context_line":"        \u0027route_mode\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":114,"context_line":"                       \u0027default\u0027: \u0027static\u0027,"},{"line_number":115,"context_line":"                       \u0027validate\u0027: {\u0027type:values\u0027: [\u0027static\u0027, \u0027dynamic\u0027]},"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2Ft%2Fs%3D","line":112,"updated":"2013-06-12 00:36:55.000000000","message":"spec says peer_cidrs is list[string]\nhttps://wiki.openstack.org/wiki/Quantum/VPNaaS","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":6820,"name":"Francois Eleouet","email":"f.eleouet@gmail.com","username":"fanchon"},"unresolved":false,"context_lines":[{"line_number":110,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":111,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"},{"line_number":112,"context_line":"        \u0027peer_address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":113,"context_line":"                         \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":114,"context_line":"                         \u0027is_visible\u0027: True},"},{"line_number":115,"context_line":"        \u0027peer_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":116,"context_line":"                    \u0027validate\u0027: {\u0027type:string\u0027: None},"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2F8T8%3D","line":113,"updated":"2013-06-17 19:43:29.000000000","message":"Use \u0027validate\u0027: {\u0027type:ip_address\u0027: None} instead?","commit_id":"20ed2d384d0c81191f43b4fe6c6a2bb02e683523"},{"author":{"_account_id":6820,"name":"Francois Eleouet","email":"f.eleouet@gmail.com","username":"fanchon"},"unresolved":false,"context_lines":[{"line_number":117,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":118,"context_line":"        \u0027peer_cidrs\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":119,"context_line":"                       \u0027convert_to\u0027: attr.convert_to_list,"},{"line_number":120,"context_line":"                       \u0027validate\u0027: {\u0027type:cidr_list\u0027: None},"},{"line_number":121,"context_line":"                       \u0027is_visible\u0027: True},"},{"line_number":122,"context_line":"        \u0027route_mode\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":123,"context_line":"                       \u0027default\u0027: \u0027static\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2F8TM%3D","line":120,"updated":"2013-06-17 19:43:29.000000000","message":"Where is this validation enforced? can\u0027t type:subnet work for that?","commit_id":"20ed2d384d0c81191f43b4fe6c6a2bb02e683523"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"cddfc120593721e88034511f109b220e0eb7fdff","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class VPNConnectionNotFound(qexception.NotFound):"},{"line_number":37,"context_line":"    message \u003d _(\"VPNConnection %(vpn_conn_id)s not\""},{"line_number":38,"context_line":"                \"found\")"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPn%2F%2F0iY%3D","line":37,"updated":"2013-06-20 14:12:20.000000000","message":"add space after not","commit_id":"57653f980cc0812ed925ca8c14361ce62cb65c6d"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":"# @author: Swaminathan Vasudevan, Hewlett-Packard."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import abc"},{"line_number":21,"context_line":"from oslo.config import cfg"},{"line_number":22,"context_line":"from quantum.api import extensions"},{"line_number":23,"context_line":"from quantum.api.v2 import attributes as attr"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2Ff9k%3D","line":20,"updated":"2013-06-29 05:55:16.000000000","message":"nit: standard, third party, openstack and quantum import blocks should be separated by blank lines","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":38,"context_line":"    message \u003d _(\"VPNConnection %(vpn_conn_id)s not found\")"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class VPNConnectionAttributeValueError(qexception.NotFound):"},{"line_number":42,"context_line":"    message \u003d _(\"VPNConnection %(attribute_a)s less than dpd_interval\")"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPn%2F%2FTLo%3D","line":41,"updated":"2013-07-04 15:39:08.000000000","message":"Probably qexception.InvalidInput or qexception.Conflict suit more here (to derive from)","commit_id":"c8b53c5962d49bf108b81d1e54f1ad9c1742a585"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":87,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":88,"context_line":"        \u0027vpn_type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":89,"context_line":"                     \u0027default\u0027: \u0027ipsec\u0027,"},{"line_number":90,"context_line":"                     \u0027validate\u0027: {\u0027type:values\u0027: [\u0027ipsec\u0027]},"},{"line_number":91,"context_line":"                     \u0027is_visible\u0027: True},"},{"line_number":92,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":93,"context_line":"                           \u0027default\u0027: True,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPn%2F%2FTLE%3D","line":90,"updated":"2013-07-04 15:39:08.000000000","message":"It makes sense to declare supported vpn types explicitly in the beginning of the module","commit_id":"c8b53c5962d49bf108b81d1e54f1ad9c1742a585"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":126,"context_line":"                       \u0027is_visible\u0027: True},"},{"line_number":127,"context_line":"        \u0027route_mode\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":128,"context_line":"                       \u0027default\u0027: \u0027static\u0027,"},{"line_number":129,"context_line":"                       \u0027validate\u0027: {\u0027type:values\u0027: [\u0027static\u0027, \u0027dynamic\u0027]},"},{"line_number":130,"context_line":"                       \u0027is_visible\u0027: True},"},{"line_number":131,"context_line":"        \u0027mtu\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":132,"context_line":"                \u0027default\u0027: \u00271500\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPn%2F%2FTKk%3D","line":129,"updated":"2013-07-04 15:39:08.000000000","message":"validation is redundant for fields with allow_post/put set to False","commit_id":"c8b53c5962d49bf108b81d1e54f1ad9c1742a585"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":168,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":169,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":170,"context_line":"                   \u0027is_visible\u0027: True},"},{"line_number":171,"context_line":"        \u0027vpnservice_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":172,"context_line":"                          \u0027is_visible\u0027: True},"},{"line_number":173,"context_line":"        \u0027ikepolicy_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":174,"context_line":"                         \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPn%2F%2FTKU%3D","line":171,"updated":"2013-07-04 15:39:08.000000000","message":"validate type uuid? (here and in two fields below)","commit_id":"c8b53c5962d49bf108b81d1e54f1ad9c1742a585"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":174,"context_line":"                         \u0027is_visible\u0027: True},"},{"line_number":175,"context_line":"        \u0027ipsecpolicy_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":176,"context_line":"                           \u0027is_visible\u0027: True}"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    },"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    \u0027ipsecpolicys\u0027: {"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPn%2F%2FTKI%3D","line":177,"updated":"2013-07-04 15:39:08.000000000","message":"nit: empty line","commit_id":"c8b53c5962d49bf108b81d1e54f1ad9c1742a585"}],"quantum/plugins/common/constants.py":[{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"unresolved":false,"context_lines":[{"line_number":24,"context_line":"EXT_TO_SERVICE_MAPPING \u003d {"},{"line_number":25,"context_line":"    \u0027dummy\u0027: DUMMY,"},{"line_number":26,"context_line":"    \u0027lbaas\u0027: LOADBALANCER,"},{"line_number":27,"context_line":"    \u0027vpnaas\u0027: VPN"},{"line_number":28,"context_line":"}"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"# TODO(salvatore-orlando): Move these (or derive them) from conf file"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3w0%3D","line":27,"updated":"2013-05-21 09:31:48.000000000","message":"please add comma to the end of line (will ease merge with FWaaS)","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"}],"quantum/plugins/services/agent_vpn/plugin.py":[{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":"# @author: Swaminathan Vasudevan, Hewlett-Packard"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import uuid"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from oslo.config import cfg"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3wk%3D","line":21,"updated":"2013-05-21 09:31:48.000000000","message":"unused","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import uuid"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from oslo.config import cfg"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from quantum.db import api as qdbapi"},{"line_number":26,"context_line":"from quantum.db.vpn import vpn_db"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F3wg%3D","line":23,"updated":"2013-05-21 09:31:48.000000000","message":"unused","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":36,"context_line":")"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class VpnPlugin(vpn_db.VPNPluginDb):"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":"    Implementation of the VPN Service Plugin."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4IE%3D","line":39,"updated":"2013-05-21 07:59:38.000000000","message":"consider the following approach:\nhttps://review.openstack.org/#/c/29155/","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":60,"context_line":"        return \"VPN Service Plugin\""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create_vpnserviceconnection(self, context, vpnserviceconnection):"},{"line_number":63,"context_line":"        vpnserviceconnection[\u0027vpnserviceconnection\u0027][\u0027status\u0027] \u003d \\"},{"line_number":64,"context_line":"        constants.PENDING_CREATE"},{"line_number":65,"context_line":"        v \u003d \\"},{"line_number":66,"context_line":"        super(VpnPlugin,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F4Hw%3D","line":63,"updated":"2013-05-21 07:59:38.000000000","message":"Just wondering, what it the purpose of the plugin if all it does in addition to Db plugin is adding PENDING_CREATE attribute.\nWhy can\u0027t DbPlugin do it?","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"625eb33867628716ea985d09e696e16a88256da5","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        return \"VPN Service Plugin\""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create_vpnserviceconnection(self, context, vpnserviceconnection):"},{"line_number":63,"context_line":"        vpnserviceconnection[\u0027vpnserviceconnection\u0027][\u0027status\u0027] \u003d \\"},{"line_number":64,"context_line":"        constants.PENDING_CREATE"},{"line_number":65,"context_line":"        v \u003d \\"},{"line_number":66,"context_line":"        super(VpnPlugin,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F5Kw%3D","line":63,"updated":"2013-05-20 20:48:27.000000000","message":"we should not use \\","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"625eb33867628716ea985d09e696e16a88256da5","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def create_vpnserviceconnection(self, context, vpnserviceconnection):"},{"line_number":63,"context_line":"        vpnserviceconnection[\u0027vpnserviceconnection\u0027][\u0027status\u0027] \u003d \\"},{"line_number":64,"context_line":"        constants.PENDING_CREATE"},{"line_number":65,"context_line":"        v \u003d \\"},{"line_number":66,"context_line":"        super(VpnPlugin,"},{"line_number":67,"context_line":"              self).create_vpnserviceconnection(context, vpnserviceconnection)"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F5Kk%3D","line":65,"updated":"2013-05-20 20:48:27.000000000","message":"v looks not needed","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"625eb33867628716ea985d09e696e16a88256da5","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                                    vpnserviceconnection):"},{"line_number":78,"context_line":"        if \u0027status\u0027 not in vpnserviceconnection[\u0027vpnserviceconnection\u0027]:"},{"line_number":79,"context_line":"            vpnserviceconnection[\u0027vpnserviceconnection\u0027][\u0027status\u0027] \u003d \\"},{"line_number":80,"context_line":"            constants.PENDING_UPDATE"},{"line_number":81,"context_line":"        v \u003d super(VpnPlugin,"},{"line_number":82,"context_line":"                  self).update_vpnserviceconnection(context,"},{"line_number":83,"context_line":"                                                    vpnservice_conn_id,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F5Kc%3D","line":80,"updated":"2013-05-20 20:48:27.000000000","message":"ditto","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"625eb33867628716ea985d09e696e16a88256da5","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def create_ikepolicy(self, context, ikepolicy):"},{"line_number":88,"context_line":"        ikepolicy[\u0027ikepolicy\u0027][\u0027status\u0027] \u003d constants.PENDING_CREATE"},{"line_number":89,"context_line":"        v \u003d super(VpnPlugin, self).create_ikepolicy(context, ikepolicy)"},{"line_number":90,"context_line":"        return v"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def delete_ikepolicy(self, context, ikepolicy_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F5KU%3D","line":89,"updated":"2013-05-20 20:48:27.000000000","message":"ditto","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"625eb33867628716ea985d09e696e16a88256da5","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    def update_ikepolicy(self, context, ikepolicy_id, ikepolicy):"},{"line_number":96,"context_line":"        if \u0027status\u0027 not in ikepolicy[\u0027ikepolicy\u0027]:"},{"line_number":97,"context_line":"            ikepolicy[\u0027ikepolicy\u0027][\u0027status\u0027] \u003d constants.PENDING_UPDATE"},{"line_number":98,"context_line":"        v \u003d super(VpnPlugin,"},{"line_number":99,"context_line":"                  self).update_ikepolicy(context, ikepolicy_id, ikepolicy)"},{"line_number":100,"context_line":"        return v"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F5KM%3D","line":98,"updated":"2013-05-20 20:48:27.000000000","message":"ditto","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"625eb33867628716ea985d09e696e16a88256da5","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def create_ipsecpolicy(self, context, ipsecpolicy):"},{"line_number":103,"context_line":"        ipsecpolicy[\u0027ipsecpolicy\u0027][\u0027status\u0027] \u003d constants.PENDING_CREATE"},{"line_number":104,"context_line":"        v \u003d super(VpnPlugin, self).create_ipsecpolicy(context, ipsecpolicy)"},{"line_number":105,"context_line":"        return v"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def delete_ipsecpolicy(self, context, ipsecpolicy_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F5KE%3D","line":104,"updated":"2013-05-20 20:48:27.000000000","message":"ditto","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"625eb33867628716ea985d09e696e16a88256da5","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    def update_ipsecpolicy(self, context, ipsecpolicy_id, ipsecpolicy):"},{"line_number":111,"context_line":"        if \u0027status\u0027 not in ipsecpolicy[\u0027ipsecpolicy\u0027]:"},{"line_number":112,"context_line":"            ipsecpolicy[\u0027ipsecpolicy\u0027][\u0027status\u0027] \u003d constants.PENDING_UPDATE"},{"line_number":113,"context_line":"        v \u003d super(VpnPlugin, self).update_ipsecpolicy(context,"},{"line_number":114,"context_line":"                                                      ipsecpolicy_id,"},{"line_number":115,"context_line":"                                                      ipsecpolicy)"},{"line_number":116,"context_line":"        return v"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F5J4%3D","line":113,"updated":"2013-05-20 20:48:27.000000000","message":"ditto","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"625eb33867628716ea985d09e696e16a88256da5","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        if \u0027status\u0027 not in vpnservice[\u0027vpnservice\u0027]:"},{"line_number":125,"context_line":"            vpnservice[\u0027vpnservice\u0027][\u0027status\u0027] \u003d constants.PENDING_UPDATE"},{"line_number":126,"context_line":"        v \u003d super(VpnPlugin, self).update_vpnservice(context,"},{"line_number":127,"context_line":"                                                     vpnservice_id,"},{"line_number":128,"context_line":"                                                     vpnservice)"},{"line_number":129,"context_line":"        return v"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F5Js%3D","line":127,"updated":"2013-05-20 20:48:27.000000000","message":"ditto","commit_id":"d3cd84a6506a3f8632613a4cdb5406a49f51750b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0e67b07d0ae75a03f0cc4b2b2f3881e4080f166","unresolved":false,"context_lines":[{"line_number":31,"context_line":")"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class VpnPlugin(object):"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    \"\"\"Implementation of the VPN Service Plugin."},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FgoM%3D","line":34,"updated":"2013-05-31 15:20:44.000000000","message":"Ditto on naming. Do we use camel-case everywhere (e.g. exception classes) or use upper-case VPN?","commit_id":"a9e4572c6b9e8dedaa1bdb879e6020a62e5352e4"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"2f3be17cde88c926ffab8637134bdf40501974be","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class VpnPlugin(vpn_db.VPNPluginDb):"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    \"\"\"Implementation of the VPN Service Plugin."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    This class manages the workflow of VPNaaS request/response."}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F%2BME%3D","line":35,"updated":"2013-06-04 21:04:33.000000000","message":"show and list looks not supported.\nCould you add this one?","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"2f3be17cde88c926ffab8637134bdf40501974be","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class VpnPlugin(vpn_db.VPNPluginDb):"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    \"\"\"Implementation of the VPN Service Plugin."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    This class manages the workflow of VPNaaS request/response."}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F9uA%3D","line":35,"in_reply_to":"AAAAPX%2F%2F%2BME%3D","updated":"2013-06-05 01:47:57.000000000","message":"Done","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":48,"context_line":"        return \"VPN Service Plugin\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def create_vpnconnection(self, context, vpnconnection):"},{"line_number":51,"context_line":"        vpnconnection[\u0027vpnconnection\u0027][\u0027status\u0027] \u003d constants.PENDING_CREATE"},{"line_number":52,"context_line":"        return super(VpnPlugin, self).create_vpnconnection(context,"},{"line_number":53,"context_line":"                                                           vpnconnection)"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F1Bc%3D","line":51,"updated":"2013-06-08 08:17:22.000000000","message":"as far as i can see, PENDING_CREATE is hardcoded in create_vpnconnection, so it\u0027s not necessary to set the status here","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":64,"context_line":"                                                           vpnconnection)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def create_ikepolicy(self, context, ikepolicy):"},{"line_number":67,"context_line":"        ikepolicy[\u0027ikepolicy\u0027][\u0027status\u0027] \u003d constants.PENDING_CREATE"},{"line_number":68,"context_line":"        return super(VpnPlugin, self).create_ikepolicy(context, ikepolicy)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def delete_ikepolicy(self, context, ikepolicy_id):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F1BY%3D","line":67,"updated":"2013-06-08 08:17:22.000000000","message":"status field is not used in VPNPluginDb.create_ikepolicy and the model doesn\u0027t have status field, so it\u0027s unnecessary here and below","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":78,"context_line":"                                                       ikepolicy)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def create_ipsecpolicy(self, context, ipsecpolicy):"},{"line_number":81,"context_line":"        ipsecpolicy[\u0027ipsecpolicy\u0027][\u0027status\u0027] \u003d constants.PENDING_CREATE"},{"line_number":82,"context_line":"        return super(VpnPlugin, self).create_ipsecpolicy(context,"},{"line_number":83,"context_line":"                                                         ipsecpolicy)"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F1BU%3D","line":81,"updated":"2013-06-08 08:17:22.000000000","message":"ditto","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":93,"context_line":"                                                         ipsecpolicy)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def create_vpnservice(self, context, vpnservice):"},{"line_number":96,"context_line":"        vpnservice[\u0027vpnservice\u0027][\u0027status\u0027] \u003d constants.PENDING_CREATE"},{"line_number":97,"context_line":"        return super(VpnPlugin, self).create_vpnservice(context, vpnservice)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def update_vpnservice(self, context, vpnservice_id, vpnservice):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F1BQ%3D","line":96,"updated":"2013-06-08 08:17:22.000000000","message":"PENDING_CREATE is hardcoded VPNPluginDb.create_vpnservice. Setting status is unnecessary","commit_id":"3c1842545ffcf76e1c673324f0f403fd8d86a9b8"}],"quantum/services/vpn/plugin.py":[{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"601f787b7dbe783dc43451c0fb2145cbcca85b44","unresolved":false,"context_lines":[{"line_number":32,"context_line":")"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class VpnPlugin(vpn_db.VPNPluginDb):"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    \"\"\"Implementation of the VPN Service Plugin."},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2Fi%2Fw%3D","line":35,"updated":"2013-06-28 00:52:30.000000000","message":"should be VPNPlugin for consistency","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"}],"quantum/tests/unit/db/vpn/test_db_vpnaas.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"cddfc120593721e88034511f109b220e0eb7fdff","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class VPNPluginDbTestCase(test_l3_plugin.L3NatTestCaseMixin,"},{"line_number":55,"context_line":"\t\t\t  test_db_plugin.QuantumDbPluginV2TestCase):"},{"line_number":56,"context_line":"    resource_prefix_map \u003d dict("},{"line_number":57,"context_line":"        (k, constants.COMMON_PREFIXES[constants.VPN])"},{"line_number":58,"context_line":"        for k in vpnaas.RESOURCE_ATTRIBUTE_MAP.keys()"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2Fog8%3D","line":55,"updated":"2013-06-26 12:01:06.000000000","message":"Looks like there are some tabs in this file.","commit_id":"4ca82f1f6cbefc3f57a2bb9daa0ab61e20748a62"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"cddfc120593721e88034511f109b220e0eb7fdff","unresolved":false,"context_lines":[{"line_number":346,"context_line":"                                         vpnconnection[\u0027vpnconnection\u0027][\u0027id\u0027])"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"class TestVpnaas(VPNPluginDbTestCase):"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"    def test_create_ikepolicy(self):"},{"line_number":352,"context_line":"        name \u003d \"ikepolicy1\""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2Fodg%3D","line":349,"updated":"2013-06-26 12:01:06.000000000","message":"Add negative test cases and cases with default values used?","commit_id":"4ca82f1f6cbefc3f57a2bb9daa0ab61e20748a62"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"cddfc120593721e88034511f109b220e0eb7fdff","unresolved":false,"context_lines":[{"line_number":565,"context_line":"                    #for k in (\u0027id\u0027, \u0027address\u0027):"},{"line_number":566,"context_line":"                    #    self.assertTrue(vpnservice[\u0027vpnservice\u0027].get(k, None))"},{"line_number":567,"context_line":"                    self.assertEqual(dict((k, v) for k, v in"},{"line_number":568,"context_line":"                                              vpnservice[\u0027vpnservice\u0027].items()"},{"line_number":569,"context_line":"                                              if k in expected),"},{"line_number":570,"context_line":"                                         expected"},{"line_number":571,"context_line":"                                         )"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2Fofs%3D","line":568,"updated":"2013-06-26 12:01:06.000000000","message":"should this be iteritems()?","commit_id":"4ca82f1f6cbefc3f57a2bb9daa0ab61e20748a62"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":565,"context_line":"                    #for k in (\u0027id\u0027, \u0027address\u0027):"},{"line_number":566,"context_line":"                    #    self.assertTrue(vpnservice[\u0027vpnservice\u0027].get(k, None))"},{"line_number":567,"context_line":"                    self.assertEqual(dict((k, v) for k, v in"},{"line_number":568,"context_line":"                                              vpnservice[\u0027vpnservice\u0027].items()"},{"line_number":569,"context_line":"                                              if k in expected),"},{"line_number":570,"context_line":"                                         expected"},{"line_number":571,"context_line":"                                         )"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FoYw%3D","line":568,"in_reply_to":"AAAAPn%2F%2Fofs%3D","updated":"2013-06-26 12:09:25.000000000","message":"It\u0027s better to use \u0027items\u0027 for python-3 compatibility.","commit_id":"4ca82f1f6cbefc3f57a2bb9daa0ab61e20748a62"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"cddfc120593721e88034511f109b220e0eb7fdff","unresolved":false,"context_lines":[{"line_number":747,"context_line":"                                #                                          None)"},{"line_number":748,"context_line":"                                #                    )"},{"line_number":749,"context_line":"                                self.assertEqual(dict((k, v) for k, v in"},{"line_number":750,"context_line":"                                                      vpnconnection"},{"line_number":751,"context_line":"                                                      [\u0027vpnconnection\u0027].items()"},{"line_number":752,"context_line":"                                                      if k in keys), keys)"},{"line_number":753,"context_line":"                                return vpnconnection"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FocQ%3D","line":750,"updated":"2013-06-26 12:01:06.000000000","message":"Just for readability, would it be better to put the dict clause on the following line, indented, like:\nself.assertEqual(\n    dict((k,v) for k,v in\n    vpnconnection.[\u0027vpnconnection\u0027].items()\n    if k in keys), keys)\n\nShould it be iteritems() vs items()?\n\nShould we use the dict comprehension vs dict()?","commit_id":"4ca82f1f6cbefc3f57a2bb9daa0ab61e20748a62"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"cddfc120593721e88034511f109b220e0eb7fdff","unresolved":false,"context_lines":[{"line_number":813,"context_line":"                                                            vpnconnection[\u0027vpnconnection\u0027][\u0027id\u0027],"},{"line_number":814,"context_line":"                                                            fmt\u003dself.fmt)"},{"line_number":815,"context_line":"                                res \u003d self.deserialize(self.fmt, req.get_response(self.ext_api))"},{"line_number":816,"context_line":"                                for k, v in keys.items():"},{"line_number":817,"context_line":"                                    self.assertEqual(res[\u0027vpnconnection\u0027][k], v)"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"    def test_list_vpnconnections_with_sort_emulated(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2Fobo%3D","line":816,"updated":"2013-06-26 12:01:06.000000000","message":"iteritems()?","commit_id":"4ca82f1f6cbefc3f57a2bb9daa0ab61e20748a62"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"cddfc120593721e88034511f109b220e0eb7fdff","unresolved":false,"context_lines":[{"line_number":897,"context_line":"                    vpnservice_id \u003d vpnservice[\u0027vpnservice\u0027][\u0027id\u0027]"},{"line_number":898,"context_line":"                    ikepolicy_id \u003d ikepolicy[\u0027ikepolicy\u0027][\u0027id\u0027]"},{"line_number":899,"context_line":"                    ipsecpolicy_id \u003d ipsecpolicy[\u0027ipsecpolicy\u0027][\u0027id\u0027]"},{"line_number":900,"context_line":"                    # Add two connections"},{"line_number":901,"context_line":"                    res1 \u003d self._create_vpnconnection(self.fmt,"},{"line_number":902,"context_line":"                                                      vpnc_name1,"},{"line_number":903,"context_line":"                                                      \u0027192.168.1.10\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FoZ0%3D","line":900,"updated":"2013-06-26 12:01:06.000000000","message":"For readability of this test case, should we provide the keyword form of arguments, so that people know which args are which?\n\neg\npeer_address\u003d\u0027192.168.1.10\u0027,\npeer_id\u003d\u0027192.168.2.10\u0027\n...\ndpd_interval\u003d30,\n...","commit_id":"4ca82f1f6cbefc3f57a2bb9daa0ab61e20748a62"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"cddfc120593721e88034511f109b220e0eb7fdff","unresolved":false,"context_lines":[{"line_number":756,"context_line":"        self.assertRaises(webob.exc.HTTPClientError, vpnconnection.__enter__)"},{"line_number":757,"context_line":"        vpnconnection \u003d self.vpnconnection(name\u003dname, dpd_interval\u003d-1)"},{"line_number":758,"context_line":"        self.assertRaises(webob.exc.HTTPClientError, vpnconnection.__enter__)"},{"line_number":759,"context_line":"        vpnconnection \u003d self.vpnconnection(name\u003dname, dpd_timeout\u003d-200)"},{"line_number":760,"context_line":"        self.assertRaises(webob.exc.HTTPClientError, vpnconnection.__enter__)"},{"line_number":761,"context_line":"        vpnconnection \u003d self.vpnconnection(name\u003dname, initiator\u003d\u0027unsupported\u0027)"},{"line_number":762,"context_line":"        self.assertRaises(webob.exc.HTTPClientError, vpnconnection.__enter__)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAPn%2F%2FlCI%3D","line":759,"updated":"2013-06-27 13:21:46.000000000","message":"Test with DPD timeout less than interval.","commit_id":"26fa54fbef783ec7f0e0bdb97f019a37b87810cc"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"601f787b7dbe783dc43451c0fb2145cbcca85b44","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    )"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def setUp(self, core_plugin\u003dNone, vpnaas_plugin\u003dNone):"},{"line_number":64,"context_line":"        service_plugins \u003d {\u0027vpnaas_plugin_name\u0027: DB_VPN_PLUGIN_KLASS}"},{"line_number":65,"context_line":"        plugin_str \u003d (\u0027quantum.plugins.openvswitch.\u0027"},{"line_number":66,"context_line":"                      \u0027ovs_quantum_plugin.OVSQuantumPluginV2\u0027)"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2FjBM%3D","line":64,"updated":"2013-06-28 00:52:30.000000000","message":"please use vpnaas_plugin parameter here","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"601f787b7dbe783dc43451c0fb2145cbcca85b44","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            service_plugins\u003dservice_plugins"},{"line_number":71,"context_line":"        )"},{"line_number":72,"context_line":"        self._subnet_id \u003d \"0c798ed8-33ba-11e2-8b28-000c291c4d14\""},{"line_number":73,"context_line":"        self.core_plugin \u003d ovs_quantum_plugin.OVSQuantumPluginV2()"},{"line_number":74,"context_line":"        self.plugin \u003d vpn_plugin.VpnPlugin()"},{"line_number":75,"context_line":"        ext_mgr \u003d PluginAwareExtensionManager("},{"line_number":76,"context_line":"            extensions_path,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2FjBQ%3D","line":73,"updated":"2013-06-28 00:52:30.000000000","message":"May be, we should use Base DB plugin here?","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"601f787b7dbe783dc43451c0fb2145cbcca85b44","unresolved":false,"context_lines":[{"line_number":825,"context_line":"                                           dpd_timeout\u003d20)"},{"line_number":826,"context_line":"        self.assertRaises(webob.exc.HTTPClientError, vpnconnection.__enter__)"},{"line_number":827,"context_line":""},{"line_number":828,"context_line":"    def test_create_vpnconnection(self, **extras):"},{"line_number":829,"context_line":"        \"\"\"Test case to create a vpnconnection.\"\"\""},{"line_number":830,"context_line":"        ikename \u003d \"ikepolicy1\""},{"line_number":831,"context_line":"        ipsecname \u003d \"ipsecpolicy1\""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2FgTE%3D","line":828,"updated":"2013-06-28 22:31:24.000000000","message":"Please add test for test_update_vpnconnection","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"601f787b7dbe783dc43451c0fb2145cbcca85b44","unresolved":false,"context_lines":[{"line_number":882,"context_line":"                                                      vpnconnection"},{"line_number":883,"context_line":"                                                      [\u0027vpnconnection\u0027].items()"},{"line_number":884,"context_line":"                                                      if k in keys), keys)"},{"line_number":885,"context_line":"                                return vpnconnection"},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"    def test_delete_vpnconnection(self):"},{"line_number":888,"context_line":"        \"\"\"Test case to delete a vpnconnection.\"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2FgSM%3D","line":885,"updated":"2013-07-01 20:58:49.000000000","message":"IF you return value here, may be delete resources part will not be deleted","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":140,"context_line":"                                     ike_version,"},{"line_number":141,"context_line":"                                     pfs,"},{"line_number":142,"context_line":"                                     **kwargs)"},{"line_number":143,"context_line":"        ikepolicy \u003d self.deserialize(fmt or self.fmt, res)"},{"line_number":144,"context_line":"        if res.status_int \u003e\u003d 400:"},{"line_number":145,"context_line":"            raise webob.exc.HTTPClientError(code\u003dres.status_int)"},{"line_number":146,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP4Y%3D","line":143,"updated":"2013-07-06 13:00:53.000000000","message":"deserialize should go after check for 400, otherwise deserialization error will mask HTTP error","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":197,"context_line":"                                       lifetime_value,"},{"line_number":198,"context_line":"                                       pfs,"},{"line_number":199,"context_line":"                                       **kwargs)"},{"line_number":200,"context_line":"        ipsecpolicy \u003d self.deserialize(fmt or self.fmt, res)"},{"line_number":201,"context_line":"        if res.status_int \u003e\u003d 400:"},{"line_number":202,"context_line":"            raise webob.exc.HTTPClientError(code\u003dres.status_int)"},{"line_number":203,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP4U%3D","line":200,"updated":"2013-07-06 13:00:53.000000000","message":"ditto","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":246,"context_line":"                                              subnet_id\u003d(tmp_subnet[\u0027subnet\u0027]"},{"line_number":247,"context_line":"                                                         [\u0027id\u0027]),"},{"line_number":248,"context_line":"                                              **kwargs)"},{"line_number":249,"context_line":"                vpnservice \u003d self.deserialize(fmt or self.fmt, res)"},{"line_number":250,"context_line":"                if res.status_int \u003e\u003d 400:"},{"line_number":251,"context_line":"                    raise webob.exc.HTTPClientError(code\u003dres.status_int)"},{"line_number":252,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP4Q%3D","line":249,"updated":"2013-07-06 13:00:53.000000000","message":"ditto","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":459,"context_line":"        name \u003d \u0027ikepolicy1\u0027"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"        ikepolicy \u003d self.ikepolicy(name\u003dname, auth_algorithm\u003d\u0027md5\u0027)"},{"line_number":462,"context_line":"        self.assertRaises(webob.exc.HTTPClientError, ikepolicy.__enter__)"},{"line_number":463,"context_line":"        ikepolicy \u003d self.ikepolicy(name\u003dname, auth_algorithm\u003d200)"},{"line_number":464,"context_line":"        self.assertRaises(webob.exc.HTTPClientError, ikepolicy.__enter__)"},{"line_number":465,"context_line":"        ikepolicy \u003d self.ikepolicy(name\u003dname, encryption_algorithm\u003d\u0027des\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP4I%3D","line":462,"updated":"2013-07-06 13:00:53.000000000","message":"that looks strange. Could you extract object creation code from self.ikepolicy and use it here and in self.ikepolicy?","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":606,"context_line":"        name \u003d \u0027ipsecpolicy1\u0027"},{"line_number":607,"context_line":""},{"line_number":608,"context_line":"        ipsecpolicy \u003d self.ipsecpolicy(name\u003dname, auth_algorithm\u003d\u0027md5\u0027)"},{"line_number":609,"context_line":"        self.assertRaises(webob.exc.HTTPClientError, ipsecpolicy.__enter__)"},{"line_number":610,"context_line":"        ipsecpolicy \u003d self.ipsecpolicy(name\u003dname, auth_algorithm\u003d100)"},{"line_number":611,"context_line":"        self.assertRaises(webob.exc.HTTPClientError, ipsecpolicy.__enter__)"},{"line_number":612,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP4E%3D","line":609,"updated":"2013-07-06 13:00:53.000000000","message":"ditto","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":759,"context_line":"        \"\"\"Test case to list all vpnservices with pagination.\"\"\""},{"line_number":760,"context_line":"        with self.subnet() as subnet:"},{"line_number":761,"context_line":"            with self.router() as router:"},{"line_number":762,"context_line":"                with contextlib.nested(self.vpnservice(name\u003d\u0027vpnservice1\u0027,"},{"line_number":763,"context_line":"                                                       subnet\u003dsubnet,"},{"line_number":764,"context_line":"                                                       router\u003drouter),"},{"line_number":765,"context_line":"                                       self.vpnservice(name\u003d\u0027vpnservice2\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP38%3D","line":762,"updated":"2013-07-06 13:00:53.000000000","message":"consider another formatting:\n\nwith contextlib.nested(\n    self.vpnservice(name\u003d\u0027vpnservice1\u0027,\n                           subnet\u003dsubnet,\n                           router\u003drouter),\n    self.vpnservice(name\u003d\u0027vpnservice2\u0027,\n                           subnet\u003dsubnet,\n                           router\u003drouter),\n    self.vpnservice(name\u003d\u0027vpnservice3\u0027,\n                           subnet\u003dsubnet,\n                           router\u003drouter)\n) as (vpnservice1, vpnservice2, vpnservice3):\n\nhere and below","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"}],"quantum/tests/unit/services/vpn/test_vpnaas_plugin.py":[{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012 OpenStack Foundation."},{"line_number":4,"context_line":"# All Rights Reserved."},{"line_number":5,"context_line":"#"},{"line_number":6,"context_line":"#  Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPn%2F%2Ff%2BY%3D","line":3,"updated":"2013-06-29 05:55:16.000000000","message":"nit: 2012 -\u003e 2013","commit_id":"ace6332582cd80a813503784f54206bd59cf6794"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    (c) Copyright 2013 Hewlett-Packard Development Company, L.P."},{"line_number":4,"context_line":"#    All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAPn%2F%2FP20%3D","line":1,"updated":"2013-07-06 13:00:53.000000000","message":"the name of test file is confusing.\nIt tests extension, not plugin. Please rename","commit_id":"90279de34a4709fbc881b1260359f209ee3ef578"}],"quantum/tests/unit/test_vpnaas_plugin.py":[{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012 OpenStack Foundation."},{"line_number":4,"context_line":"# All Rights Reserved."},{"line_number":5,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2FsCA%3D","line":2,"updated":"2013-06-12 19:15:20.000000000","message":"IMO, we should have also db test something like\nhttps://github.com/openstack/quantum/blob/master/quantum/tests/unit/test_db_plugin.py","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        res \u003d self.deserialize(res)"},{"line_number":189,"context_line":"        self.assertIn(\u0027ikepolicy\u0027, res)"},{"line_number":190,"context_line":"        self.assertEqual(res[\u0027ikepolicy\u0027], return_value)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def test_ikepolicy_delete(self):"},{"line_number":193,"context_line":"        self._test_entity_delete(\u0027ikepolicy\u0027)"},{"line_number":194,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2FsCs%3D","line":191,"updated":"2013-06-12 19:15:20.000000000","message":"IMO, we should prevent to delete policy which is used by any connection. Could you add test case for that?","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":295,"context_line":"        res \u003d self.deserialize(res)"},{"line_number":296,"context_line":"        self.assertIn(\u0027ipsecpolicy\u0027, res)"},{"line_number":297,"context_line":"        self.assertEqual(res[\u0027ipsecpolicy\u0027], return_value)"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    def test_ipsecpolicy_delete(self):"},{"line_number":300,"context_line":"        self._test_entity_delete(\u0027ipsecpolicy\u0027)"},{"line_number":301,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2FsCo%3D","line":298,"updated":"2013-06-12 19:15:20.000000000","message":"ditto","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7ead0ab23a4402887e9ce8eeba7b939c72467887","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        delete_entity \u003d getattr(self.plugin.return_value, \"delete_\" + entity)"},{"line_number":407,"context_line":"        delete_entity.assert_called_with(mock.ANY, entity_id)"},{"line_number":408,"context_line":"        self.assertEqual(res.status_int, exc.HTTPNoContent.code)"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    def test_vpnservice_delete(self):"},{"line_number":411,"context_line":"        self._test_entity_delete(\u0027vpnservice\u0027)"},{"line_number":412,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2FsCY%3D","line":409,"updated":"2013-06-12 19:15:20.000000000","message":"We should prevent delete if vpnservice has vpnconnections.\nCould you add test case for that ?","commit_id":"759215d23f5e2d1ab0f6d4c7ac0f33606a5eff54"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012 OpenStack Foundation."},{"line_number":4,"context_line":"# All Rights Reserved."},{"line_number":5,"context_line":"#"},{"line_number":6,"context_line":"#  Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPX%2F%2FmPw%3D","line":3,"updated":"2013-06-14 17:16:46.000000000","message":"nit: 2013","commit_id":"20ed2d384d0c81191f43b4fe6c6a2bb02e683523"}]}
